集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2092|回复: 2

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

[复制链接]
荼蘼 发表于 2021-6-7 20:31:47 | 显示全部楼层 |阅读模式
刚开始学习写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的,所以这个改动也只会在仿真里面生效
lihongkun16 发表于 2021-6-8 08:39:50 | 显示全部楼层
【Modelsim仿真技巧】如何缩短仿真时间
zhangyukun 发表于 2021-6-8 09:40:02 | 显示全部楼层
【Modelsim仿真技巧】如何缩短仿真时间
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-2 20:22 , Processed in 0.107722 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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