Bootstrap

RTL仿真时信号竞争问题——通过delta-cycle查看严格的时序逻辑前后关系

关于采样和驱动的信号竞争问题可以看我的这篇文章

https://blog.csdn.net/qq_39794062/article/details/113379285

接下来这篇文章通过一个RTL仿真例子,来讲解竞争问题。
race.sv

`timescale 1ns/1ns
module race1;

bit clk1, clk2;
bit rstn;
logic[7:0] d1;

initial begin
  forever #5 clk1 <= !clk1;		//5ns一翻转,所以时钟周期是10ns
end

always @(clk1) clk2 <= clk1;	//当clk1上升沿到来时,赋值给clk2,利用组合逻辑使得clk2跟着clk1一起跳转

initial begin
  #10 rstn <= 0;
  #20 rstn <= 1;
end

always @(posedge clk1, negedge rstn) begin
  if(!rstn) d1 <= 0;
  else d1 <= d1 + 1;			//当clk1,rstn都为1时,d1加1
end

always @(posedge clk1) $display("%0t ns d1 value is 0x%0x", $time, d1);		//clk1上升沿时打印d1此时刻的值
always @(posedge clk2) $display("%0t ns d1 value is 0x%0x", $time, d1);		//clk2上升沿时打印d1此时刻的值
endmodule

仿真波形:
在这里插入图片描述
通过仿真波形可以看到在45ns处,数据显示clk=1,clk2=1,d1=8’h02

打印日志:
在这里插入图片描述
从打印的日志可以看到在45ns时,clk1对应的d1的值是0x1,而clk2对应的值时0x2。发现和仿真波形不一致,如果只从波形来看,我们无法得出clk1、clk2与d1的准确时序前后关系,而这种更准确的前后时序关系只发生在delta-cycle

如何严格的看延迟?

可以查看delta-cycle,得到更准确的时序关系。

将光标选中波形上的clk1,再将时间轴选中到clk1在45ns处的上升变化沿,然后选中工具栏的“expanded time delta mode”,再选中“expanded time at active cursor”,这样就可以观察在特定时间点,时序逻辑或者组合逻辑中,参与硬件模拟仿真的硬件变量之间的准确时序前后关系。
在这里插入图片描述
在这里插入图片描述

在“45ns+0(delta-cycle)”处,clk1=1,clk2=0,d1=1
在这里插入图片描述

在“45ns+1(delta-cycle)”处,clk1=1,clk2=1,d1=2
在这里插入图片描述
由此可以看出clk2利用组合逻辑跟着clk1一起跳转,所以clk2要比clk1晚一个delta-cycle。clk1先驱动了clk2,然后又驱动了d1。

所以,采样数据中的竞争问题会成为潜在困扰仿真采样准确性的问题。

;