芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 1651|回复: 3

Modelsim RTL 仿真的弊端

[复制链接]

该用户从未签到

1

主题

1

帖子

40

积分

新手上路

Rank: 2

积分
40
发表于 2023-7-9 10:32:02 | 显示全部楼层 |阅读模式
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仿真如下

image.png

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仿真绝对不是我们想要的,接下来看看 后仿真。

image.png

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

image.png

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

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

回复

使用道具 举报

该用户从未签到

0

主题

3

帖子

4

积分

新手入门

Rank: 1

积分
4
发表于 2023-12-2 10:45:56 | 显示全部楼层
本帖最后由 pxmhust 于 2023-12-2 11:19 编辑

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

使用道具 举报

该用户从未签到

0

主题

3

帖子

4

积分

新手入门

Rank: 1

积分
4
发表于 2023-12-2 10:50:07 | 显示全部楼层
image.png
这是楼主代码的Iverilog仿真图,没有楼主说的问题。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

3

帖子

4

积分

新手入门

Rank: 1

积分
4
发表于 2023-12-2 11:27:18 | 显示全部楼层
本帖最后由 pxmhust 于 2023-12-2 11:29 编辑

把答主代码钟首次出现的@(negedge clk)改为 #123;@(posedge clk);在modelsim中得到了和答主一样的图和结论。
但在Iverilog中,得出了预想结果
image.png
这说明1. modelsim药丸^-^
2.其实modelsim也没错,实际硬件出现这种波形,很有可能由于内外信号边沿稳定时间不绝对一致而产生零星漏检测。
3.所以FPGA才强调时钟时序。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

GMT+8, 2024-5-5 03:30 , Processed in 0.125773 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表