System Verilog学习笔记(八)——采样和数据驱动
为了避免在RTL仿真行为中发生的信号竞争问题,可以通过非阻塞赋值或者特定信号延迟来解决同步的问题。
默认情况下,时钟对于组合电路的驱动会添加一个无限小时间(delta-cycle)的延迟,而该延迟无法用绝对时间单位衡量,他比最小时间单位精度还小。
在仿真器敲入命令“run 0”,是指让仿真器运行一个delta-cycle的时间。
竞争问题
当clk与被采样数据之间如果只存在若干个delta-cycle的延迟,那么被采样可能会存在问题,在同样的时刻可能会得到不同的采样结果。
如何避免:
-
在驱动时,添加相应的人为延迟,模拟真实的延迟行为,同时加大clk和变量之间的延迟,以此提高DUT使用信号时的准确度和TB采样信号时的可靠性。
-
对于一些采样时依然存在delta-cycle延迟的信号,我们可以依靠在采样事件前的某时刻进行采样,来模拟建立时间的采样要求,确保采样的可靠性。
接口中的clocking
1. 利用clocking进行采样
在接口中声明**时钟块clocking**和采样的时钟信号,用来做信号的同步和采样。
clocking块基于时钟周期对信号进行驱动或者采样的方式,消除信号竞争的问题。
clocking bus @(posedge clock1) //定义了一个clocking块bus,由clock1的上升沿来驱动和采样default input #10ns output #2ns; //指出在clocking块中所有的信号,默认情况下会在clocking(clock1上升沿)前10ns对其进行输入采样,在后2ns进行输出驱动input data, ready, enable; //声明三个输入信号output negedge ack; //声明了要驱动的信号,而驱动该信号的是时钟clock1的下降沿,会覆盖原有的默认输出情况input #1step addr; //自定义了采样事件,即在clock1上升沿前的1step。
endclocking
1step:会使采样发生在clock1上升沿的上一个时间片采样区域,这样能保证采样到的数据是上个时钟周期的数据。
- clocking块不仅能定义在interface中,还可以定义在module和program中
- clocking中列举的信号不是自己定义的,而是应该由interface或者其他声明clocking的模块定义的,同一个变量在不同的clocking中可以声明不同的方向
- clocking在声明完名称之后,会定义默认的采样事件。若没有定义,默认在采样事件前1step对输入进行采样,在采样事件之后#0对输出进行驱动
- 也能在定义信号方向时,用新的采样事件对默认事件做覆盖。
2. 利用clocking的驱动
利用clocking块通过一种类似于“物理保持时间”的驱动方式,可以实现时钟叠加偏移量的延迟驱动效果。
小结:
1.为了避免可能的采样竞争问题,应该在验证环境的驱动环境就添加固定延迟,使得在仿真波形中更容易体现出时钟与被驱动信号之间的时序前后关系,同样这样也能便于DUT准确处理和TB的准确采样
2.要 考虑在时钟采样沿的更早时间段去模拟建立时间要求采样,可以避免由于delta-cycle问题带来的采样竞争问题