verilog乘法结果位宽求助
时间:10-02
整理:3721RD
点击:
我对以下四种形式的乘法式子用vcs仿真,其中y的位宽要比a1和a2的位宽之和大:
y = a1 * a2 ;
y = {补零, a1 * a2} ;
y = a1 * 常数 ;
y = {补零, a1 * 常数} ;
结果发现前面不补零时,乘法结果的有效位数会自动扩展为两个乘数位宽之和,从而得到正确的结果;
但当前面补零时(比如为了修正nlint的错误),则由两个乘数中位宽大者的位宽决定结果的位宽,从而出现结果高位被截断的情况。
比如,若a1=2'h3,a2=3'h5,y应为15d(01111b),但实际结果为7d(111b),也就是说a2的位宽决定了结果的有效位数。
请问这是verilog的规定,还是vcs的问题,还是我哪里的问题?
y = a1 * a2 ;
y = {补零, a1 * a2} ;
y = a1 * 常数 ;
y = {补零, a1 * 常数} ;
结果发现前面不补零时,乘法结果的有效位数会自动扩展为两个乘数位宽之和,从而得到正确的结果;
但当前面补零时(比如为了修正nlint的错误),则由两个乘数中位宽大者的位宽决定结果的位宽,从而出现结果高位被截断的情况。
比如,若a1=2'h3,a2=3'h5,y应为15d(01111b),但实际结果为7d(111b),也就是说a2的位宽决定了结果的有效位数。
请问这是verilog的规定,还是vcs的问题,还是我哪里的问题?
verilog决定。
有可查的规定吗?
无论做什么运算,先按运算式的最宽的位宽扩展,然后再做运算。
你说的意思是3位运算数a和2位运算数b做某种运算,b会扩展为3位。那运算结果的位宽怎么定呢?
还要看结果的位宽,比如3位a+5位b,赋给8位y,那么先将3位和5位扩展为8位,再乘。
比如y= a*b
而单a*b,就可着b的位宽,先得出5位的结果,然后再做后面的拼接运算。
比如y= {1‘b0,a*b}
这个在IEEE 1364上有说明吗?
可以看一下2001的4.4节expression bit length,4.4.2举的例子与你的例子相似。
先扩展后运算。
先扩展,再运用。注意有符号数和无符号数的区别。
