system verilog中的iff

SystemVerilog 为@事件控制加入了一个 iff 限定符。

一般的写法是这样的:

1
2
@(posedge clk iff(vld));
do_something;

只有在时钟上升沿并且vld的情况,才会往下走。

它产生的效果和下面的代码一样。

1
2
3
4
5
6
forever begin
@(posedge clk);
if(vld)
break;
end
do_something;

还有一种写法是

1
2
3
4
5
6
forever begin
@(posedge clk);
if(vld)begin
do_something;
end
end

iffif 之间的区别是:

事件表达式仅仅在 iff 之后的表达式为真时才会触发,在上面的例子中就是 vld 等于 1 的情况。注意:这个表达式只有在 vld 发生变化时计算,而不是 clk 发生变化的时候。

这样会使得 iffif 效率更高,因为它作为一个线程被唤醒的概率更小。所以更推荐使用 iff