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

本文通过一个Verilog RTL仿真例子,深入解析了信号竞争问题。在45ns时,clk1和clk2同时为1,但d1在不同时钟域的采样值出现不一致,这揭示了时序逻辑中的竞争条件。通过观察delta-cycle,可以确定clk2比clk1晚一个delta-cycle,从而理解了信号驱动的先后顺序。采样数据的竞争问题可能影响仿真准确性,需谨慎处理。
摘要由CSDN通过智能技术生成

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

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。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值