我们通常非常清楚,对于每一个数据都必须定义其位宽,如:
reg [7:0] a;
reg [19:0] b;
但进行计算时我们通常会忽视中间结果的位宽从而出现难以理解的仿真错误。如
wire [19:0] c;
assign c = a*b >> 8;
仿真发现c并非我们想要的结果。原因可能是仿真工具认为a*b的计算值的位宽为a和b中最大的位宽,即20位。
正确的方式是:
wire [27:0] c_tmp;
assign c_tmp = a*b;
assign c = c_tmp[19:8];