一、现象
在sv的行为描述中,有时候我们希望将自加操作(++)与赋值操作(=)写在同一行中,以便减少一行代码,但有时候效果不符合预期。代码如下:
`timescale 1ns/1ps
module harness;
initial begin
int a=0;
repeat(20) begin
a=a++%10;
$display("a=%0d", a);
end
end
endmodule
仿真结果:
二、解释
可以看到,变量a的取值并没有像预期一样自加,而是全部为0。这是因为代码执行先后顺序的问题。在上述代码中,先执行RHS的求余操作,再执行变量a的自加,最后将求余的结果赋值给变量a。在这样的执行步骤下,赋值操作会将变量a的自加值给覆盖掉,导致a始终为0。其实在C/C++语言中,这也是一种典型的编程陷阱。
三、正确操作
如果你确实想将两句话写在一行,可以这样写:
`timescale 1ns/1ps
module harness;
initial begin
int a=0;
repeat(20) begin
a=++a%10;
$display("a=%0d", a);
end
end
endmodule