对于DFF需要理解实际电路波形、上板调试波形、仿真(Verdi)波形的区别(接下来以FPGA举例):
下图为对D端=接Q端反相值(起始输入为1)的DFF工作示意图,只需要看上半部分即可,posedge一行代表,在上升沿时刻Q端实际波形,sim表示仿真波形,board表示上板波形。
(1)实际电路波形。 简单理解,对于一个DFF1,假设是上升沿触发,那么在时钟上升沿DFF1会将D1端数据抓获,并传递到Q1端,而这样的工作过程是需要时间的,所以在实际电路中,Q1端输出其实在当前时钟上升沿t1晚一点点延时,因此,若再来DFF2对 Q1进行寄存时,会发现t1时刻捕获不到刚刚变化的Q1,但是在下一个时钟上升沿t2是可以捕获到的。
(2)仿真波形。仿真是为了模拟实际电路,所以仿真波形底层也是实际电路波形,也符合上述时序,但是仿真波形为了显示方便,会把所有DFF的Q端输出都对齐时钟边沿(或许是因为前面提到的工作过程所需时间相对于而言太短暂),因此Q端输出在仿真显示时是做了前移的,在t1时刻会显示Q1已经变化,但会发现实际能抓获Q1进行操作的时刻是在t2。即仿真的显示存在与实际不完全一直的延时差。
(3)上板调试波形。上板波形底层也是实际电路波形,如果使用ILA上板抓取波形,会发现在t1时刻驱动的赋值,在t2时刻才可显示出,这是因为ILA显示波形是通过在时钟边沿对各信号实际抓取并存储到ILA的BRAM中得到的,t1时刻抓取不到Q1,因此未显示。