如何比较边缘几乎在同一位置的两个信号?

时间:2014-01-09 15:37:15

标签: system-verilog

我正在验证设计中产生具有精确定时边缘的脉冲的部分。我有一个基本的行为模型,它产生的输出与设计相似但不完全相同。两者之间的差异小于设计所需的精度,所以我的模型足够好。问题是:我如何比较这两个信号?

我试过了:

assert(out1 == out1_behav);

但由于两个信号的边缘相差1ps,因此失败了。设计只需要以100ps的精度放置边缘,所以我希望在这种情况下通过。

我考虑过使用带有$delay()时序检查的指定块,但这会导致其他问题,因为我需要运行+no_timing_checks以防止我的ram模型在此RTL sim中失败。

有没有一种简单的方法来检查这些边缘是否“几乎”相同?

2 个答案:

答案 0 :(得分:3)

根据100ps内匹配信号的设计要求,您可以添加一个比较逻辑,100ps转换延迟将充当过滤器。

bit match;
assign #100ps match = (out1 == out1_behav);
always @*
    assert #0 (match==1);

Verilog有不同的分配延迟方式:转换和传输。转换延迟控制上升,下降和不确定/高Z时序。如果驱动信号给出的脉冲小于延迟,它们可以充当滤波器。传输延迟将始终跟随驱动信号的时移。当延迟很大时,转换和传输看起来都是一样的。

assign #delay transition = driver; // Transition delay
always @(rhs) transport <= #dealy driver; // Transport delay

示例:http://www.edaplayground.com/s/6/878,点击运行按钮查看波形。

答案 1 :(得分:1)

如果您使用的是Modelsim / Questa,您仍然可以使用+ notimingchecks,然后使用tcl命令tchech_set打开个人计时检查,例如$ fullskew 否则,您将必须编写一个行为块,记录两个信号的上升沿和下降沿的时间戳,并检查差值的绝对值。