微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog乘法结果位宽求助

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的问题,还是我哪里的问题?

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举的例子与你的例子相似。

先扩展后运算。

先扩展,再运用。注意有符号数和无符号数的区别。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top