uh_5218428 发表于 2023-7-9 10:32:02

Modelsim RTL 仿真的弊端

```
RTL仿真中,由于对传输延时时间的模拟不够精确,对于某些信号的检测会与现实不符,下面演示会漏掉的一类信号。
```

RTL 代码功能:Clk 上升沿检测到 a==1 会使 b 翻转。

```

module my(
        Clk,
        Rst_n,

        a,
        b
);

input        Clk;
input Rst_n;
input a;
output reg b;

always@(posedge Clk or negedge Rst_n) begin
        if(!Rst_n)
                b <= 0;
        else if(a == 1)
                b <= ~b;
end

endmodule
```

testbench

```
`timescale 1ns/1ns
`define Clk_period 20
module my_tb;

reg Clk, Rst_n, a;
wire b;

my my(
        .Clk        (Clk),
        .Rst_n(Rst_n),

        .a                (a),
        .b                (b)
);

initial Clk = 1;
always#(`Clk_period/2) Clk = ~Clk;

initial begin
        Rst_n = 0; a = 0;
        #(`Clk_period*20+17);

        Rst_n = 1;
        #(`Clk_period*20+17);

        @(posedge Clk);
        a = 1;
        #(`Clk_period);
        a = 0;

        @(negedge Clk);
        a = 1;
        #(`Clk_period + 1);
        a = 0;
        #123;

        @(negedge Clk);
        a = 1;
        #(`Clk_period);
        a = 0;

        #200;
        $stop;
end

endmodule
```

RTL仿真如下

!(data/attachment/forum/202307/09/102915f3b6w68877w66ewe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

!(data/attachment/forum/202307/09/102940vbhqhcu09bszzezz.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

可见,第一次 a=1 被完全漏掉了,没有检测到,第二次却被检测到,仅仅因为多延时了1ns。

第一次,Clk 的上升沿之后将 a 置 1,但是在下一个 Clk 上升沿,仍然会检测到 a 为 0,也就是 a=1 的时长小于一个时钟周期,恰巧藏进一个完整的时钟周期里面,而不会被检测到a==1。

第二次,Clk 的上升沿之后将 a 置 1,在下一个 Clk 上升沿,检测到 a 为 1,1ns 之后,a 被置为 0显然是这延长的 1ns 起了作用,这样的RTL仿真绝对不是我们想要的,接下来看看 后仿真。

!(data/attachment/forum/202307/09/103050yx3ikbeeg6oggkt8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

a=1 第一次就被检测到了!

!(data/attachment/forum/202307/09/103101ak5ww2ppugz5rww7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

a=1 的时间没有延长,甚至时刻都与 RTL 仿真一致,但是这样的结果是我们所预期的

结论:RTL 仿真对于传输延时时间的模拟有一定的局限性,写 RTL 仿真代码的时候要注意这个问题,如果前方真不理想,不妨试试后仿真 或者 给信号加一些延时来模拟传输延时时间。

pxmhust 发表于 2023-12-2 10:45:56

本帖最后由 pxmhust 于 2023-12-2 11:19 编辑

码不对图!代码中第一次是posedge,第二次是negedge,图中前两次都是posedge......估计楼主弄混了两次代码,第二次应该是 #123;@(posedge clk)

pxmhust 发表于 2023-12-2 10:50:07


这是楼主代码的Iverilog仿真图,没有楼主说的问题。

pxmhust 发表于 2023-12-2 11:27:18

本帖最后由 pxmhust 于 2023-12-2 11:29 编辑

把答主代码钟首次出现的@(negedge clk)改为 #123;@(posedge clk);在modelsim中得到了和答主一样的图和结论。
但在Iverilog中,得出了预想结果

这说明1. modelsim药丸^-^
2.其实modelsim也没错,实际硬件出现这种波形,很有可能由于内外信号边沿稳定时间不绝对一致而产生零星漏检测。
3.所以FPGA才强调时钟时序。
页: [1]
查看完整版本: Modelsim RTL 仿真的弊端