Verilog代码中使用异步置位和复位时,需留意的很隐蔽的小错误

作者:圆宵,来源:FPGA那点事儿

最近在做一个设计用Vivado去综合时,碰到了一个很意外的Critical Error。由此牵扯出Verilog代码中使用异步置位和复位时,需留意的一个很隐蔽的小错误。

警告摘要如下:

[Netlist29-358] Reg ‘Counter[7]‘ of type ‘FDCPE’ cannot be timed accurately. Hardwarebehavior may be unpredicatable.

Resolution:Recode your design, so that you do not depend on both asynchronous set andreset for your desired functionality.

所对应得代码大概如下:

单从这处代码本身来看,看不出任何问题,由于是第一次碰到这种严重警告,所以一时没有头绪。不过从警告的提示来看,应该跟异步复位有关,难道是异步复位的初始赋值有问题?

顺着这个思路在代码中搜索,发现INIT_VAL的赋值不是一个常量,而是会动态切换的,如下:

看到此处终于恍然大悟,FPGA中寄存器的异步复位或者置位,都只能赋常量值,不能赋变量值。

因此消除这个严重警告的办法也很简单,把异步复位替换成同步复位即可。如下:

经过上述简单修改后,严重警告消失了。

文章转载自: FPGA那点事儿