systemverilog编程陷阱——自加与赋值冲突

一、现象

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值