在初学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类型

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

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

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

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

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

相关文章:

  • 2022-12-23
  • 2021-07-31
  • 2021-11-06
  • 2022-02-10
  • 2022-12-23
  • 2022-01-16
  • 2021-12-25
  • 2021-10-11
猜你喜欢
  • 2021-07-13
  • 2021-12-22
  • 2022-12-23
  • 2022-12-23
  • 2021-07-13
  • 2022-12-23
  • 2021-05-26
相关资源
相似解决方案