在初学Verilog时就被前辈教导,使用数字时应精确定义位宽,这是有道理的。
举例:
assign z_dout_t = (z_dout[12] == 1'b1) ? {dist_flag_sync, z_dout[11:0]+1} : {dist_flag_sync, z_dout[11:0]};
这里有个加1的处理,没有指明位宽,结果综合出来是下面的效果。
而实际设计意图是想达到下面的效果(z_dout_t[15:12]直接由dist_flag_sync[3:0]赋值)。
可以看出。如果指明位宽12,则输出结果只输出指定宽度[11:0],进位会舍弃掉。如果不指明位宽,则输出结果是[12:0],进位会保留。
精确限定位宽,则综合结果明确,不论在何种编译器上都能得出相同的编译结果,代码通用性更好。
上面的例子是实际项目中遇到的问题。再一次说明遵守编码规则的重要性。