在初学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],进位会保留。
精确限定位宽,则综合结果明确,不论在何种编译器上都能得出相同的编译结果,代码通用性更好。
上面的例子是实际项目中遇到的问题。再一次说明遵守编码规则的重要性。
本文通过实例解析了在Verilog编程中精确指定变量位宽的重要性,特别是在进行算术运算时,避免因默认位宽导致的综合结果偏差,确保代码在不同编译器上的通用性和一致性。
2865

被折叠的 条评论
为什么被折叠?



