Verilog运算操作的表达式位宽调整规则

        我想出一种分析思路,源于之前看到名为《Verilog关于有符号数与无符号数的数值运算》的博客,感触良多,但是用该分析方法在实践中出现了问题,现结合经验对部分分析提出修改意见,如下:

运算原则:
        Verilog中乘法和加法运算前,会先将操作数据拓展成相同位宽。

代码如下:

module top(
    input [3:0] a,
    input [3:0] b,
    output [3:0] sum_1,
    output [3:0] sum_2,
    );
    
    assign sum_1 = ((a+b)>>1);
    assign sum_2 = ((0+a+b)>>1);
    
endmodule

仿真得到的结果如下图:

Verilog运算操作的表达式位宽调整规则_第1张图片
分析:

        根据Verilog中缺省命名规则,0默认是32位的,所以sum_2中运算各数据均拓展成32位,计算得到的中间变量也是32位的32'h0000_0011,右移后截断高位得到4'b1000;
        而sum_1中运算,大家都是4位的,所以就不拓展了,得到的中间变量也是4位的4'b0001,已经丢失了动态范围,右移后得到4'b0000;

综上:

        没有“先截断后移位这一说法”,更准确的表述应该是“中间变量进行逻辑移位,MSB补零,之后截掉高位”。

你可能感兴趣的:(Verilog运算操作的表达式位宽调整规则)