一、从@语句中break的问题
最近遇到一个情形,已经进入@语句等待敏感事件A,但是中途若出现另一个事件B,要求立即从@语句中break出来,且不执行后续语句。写了个简化逻辑如下:
task wait_a;
@(A); // 阻塞等待
execute_function(); // 事件A触发后,才会执行execute_function
endtask
不同于设置进入@语句的条件,可以通过 iff 或 -> 来约束,对于已经进入阻塞等待的@语句,要中途break出来有以下几种方式:
- 在@的敏感列表里把敏感事件B也加进去,跳出@之后再进行判断是A还是B触发的@
// 需求:在已经进入@等待语句时,要求B事件触发时,@直接break,并且不执行execute_function
task wait_a;
@(A or B); // 添加额外约束B,此时A或B均可触发@结束
if(!B) begin // 要求只有A被触发时,执行后续语句;B被触发时不执行
execute_function(); // 事件A触发后,才会执行execute_function
end
endtask