Verilog编码规则:不使用integer类型,使用精确定义位宽的wire\reg类型

            在初学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的处理,没有指明位宽,结果综合出来是下面的效果。

Verilog编码规则:不使用integer类型,使用精确定义位宽的wire\reg类型_第1张图片

            而实际设计意图是想达到下面的效果(z_dout_t[15:12]直接由dist_flag_sync[3:0]赋值)。

Verilog编码规则:不使用integer类型,使用精确定义位宽的wire\reg类型_第2张图片

         可以看出。如果指明位宽12,则输出结果只输出指定宽度[11:0],进位会舍弃掉。如果不指明位宽,则输出结果是[12:0],进位会保留。

         精确限定位宽,则综合结果明确,不论在何种编译器上都能得出相同的编译结果,代码通用性更好。

        上面的例子是实际项目中遇到的问题。再一次说明遵守编码规则的重要性。

你可能感兴趣的:(FPGA)