芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 活动
查看: 233|回复: -1

【Modelsim仿真技巧】如何缩短仿真时间

[复制链接]
  • TA的每日心情
    萌哒
    昨天 09:25
  • 19

    主题

    24

    帖子

    668

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    668
    发表于 2019-9-16 23:07:39 | 显示全部楼层 |阅读模式
           刚开始学习写led亮灭仿真的时候很多人都会遇到仿真时间太长,耗费时间的问题,尤其是电脑性能不怎么好的,那是真的等到天荒地老,半天看不到LED的波形翻转,还以为自己的程序写的有问题呢
            其实我们可以利用parameter来定义参数,然后在仿真里面再用defparam来修改这个定义的参数就可以大大的缩短仿真的时间。下面我们来用个实际的例子来示范一下
    工程代码:
    1. module led(
    2.         clk,
    3.         rst_n,
    4.         led
    5. );
    6.         input clk;
    7.         input rst_n;
    8.         output reg led;

    9.         reg [25:0] cnt;
    10.         always @ (posedge clk or negedge rst_n)
    11.         begin
    12.                 if (!rst_n)
    13.                         cnt <= 26'd0;
    14.                 else if (cnt < 26'd49_999_999)
    15.                         cnt <= cnt + 1'b1;
    16.                 else
    17.                         cnt <= 26'd0;
    18.         end
    19.         
    20.         always @ (posedge clk or negedge rst_n)
    21.         begin
    22.                 if (!rst_n)
    23.                         led <= 1'b1;
    24.                 else if (cnt < 26'd49_999_999)
    25.                         led <= led;
    26.                 else
    27.                         led <= ~led;
    28.         end

    29. endmodule
    复制代码
    仿真文件代码:
    1. `timescale 1ns/1ps

    2. module led_tb;

    3.         reg clk;
    4.         reg rst_n;
    5.         wire led;

    6.         led led_inst(
    7.                 .clk(clk),
    8.                 .rst_n(rst_n),
    9.                 .led(led)
    10.         );
    11.         
    12.         always #10 clk = ~clk;
    13.         
    14.         initial begin
    15.                 clk = 1;
    16.                 rst_n = 0;
    17.                 #201;
    18.                 rst_n = 1;
    19.                
    20.                 repeat (10000) begin
    21.                         #60000;
    22.                 end
    23.                
    24.                 $stop;
    25.         end

    26. endmodule
    复制代码
    我们接下来跑仿真,结果跑了老半天都看不到led的波形翻转,因为仿真要足足跑1秒钟的时间led的波形才会翻转,而这里的仿真时间单位是纳秒(ns),可以算算要跑多长时间


    现在我们把代码稍微修改一下:
    工程代码:
    1. module led(
    2.         clk,
    3.         rst_n,
    4.         led
    5. );
    6.         input clk;
    7.         input rst_n;
    8.         output reg led;
    9.         
    10.         parameter CNT_MAX = 26'd49_999_999;        // 差异部分
    11.         reg [25:0] cnt;
    12.         always @ (posedge clk or negedge rst_n)
    13.         begin
    14.                 if (!rst_n)
    15.                         cnt <= 26'd0;
    16.                 else if (cnt < CNT_MAX)                        // 差异部分
    17.                         cnt <= cnt + 1'b1;
    18.                 else
    19.                         cnt <= 26'd0;
    20.         end
    21.         
    22.         always @ (posedge clk or negedge rst_n)
    23.         begin
    24.                 if (!rst_n)
    25.                         led <= 1'b1;
    26.                 else if (cnt < CNT_MAX)                        // 差异部分
    27.                         led <= led;
    28.                 else
    29.                         led <= ~led;
    30.         end

    31. endmodule
    复制代码
    仿真文件代码:
    1. `timescale 1ns/1ps

    2. module led_tb;

    3.         reg clk;
    4.         reg rst_n;
    5.         wire led;

    6.         led led_inst(
    7.                 .clk(clk),
    8.                 .rst_n(rst_n),
    9.                 .led(led)
    10.         );
    11.         
    12.         defparam led_inst.CNT_MAX = 10;        // 差异部分
    13.         
    14.         always #10 clk = ~clk;
    15.         
    16.         initial begin
    17.                 clk = 1;
    18.                 rst_n = 0;
    19.                 #201;
    20.                 rst_n = 1;
    21.                
    22.                 #2000;
    23.                
    24.                 $stop;
    25.         end

    26. endmodule
    复制代码
    我们接下来跑仿真,结果很快就看到led的波形翻转了


    注:这种方法不会修改实际代码的延时时间,因为只是在仿真代码里面将CNT_MAX改成10的,所以这个改动也只会在仿真里面生效
    &#body;
    回复

    使用道具 举报

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

    本版积分规则

    QQ|小黑屋|手机版|Archiver|芯路恒电子技术论坛  

    GMT+8, 2019-10-19 12:12 , Processed in 0.099399 second(s), 13 queries , File On.

    Powered by Discuz! X3.3

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

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