voiue 发表于 2019-9-16 23:07:39

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

       刚开始学习写led亮灭仿真的时候很多人都会遇到仿真时间太长,耗费时间的问题,尤其是电脑性能不怎么好的,那是真的等到天荒地老,半天看不到LED的波形翻转,还以为自己的程序写的有问题呢;P;P;P
      其实我们可以利用parameter来定义参数,然后在仿真里面再用defparam来修改这个定义的参数就可以大大的缩短仿真的时间。下面我们来用个实际的例子来示范一下
工程代码:
module led(
      clk,
      rst_n,
      led
);
      input clk;
      input rst_n;
      output reg led;

      reg cnt;
      always @ (posedge clk or negedge rst_n)
      begin
                if (!rst_n)
                        cnt <= 26'd0;
                else if (cnt < 26'd49_999_999)
                        cnt <= cnt + 1'b1;
                else
                        cnt <= 26'd0;
      end
      
      always @ (posedge clk or negedge rst_n)
      begin
                if (!rst_n)
                        led <= 1'b1;
                else if (cnt < 26'd49_999_999)
                        led <= led;
                else
                        led <= ~led;
      end

endmodule仿真文件代码:
`timescale 1ns/1ps

module led_tb;

      reg clk;
      reg rst_n;
      wire led;

      led led_inst(
                .clk(clk),
                .rst_n(rst_n),
                .led(led)
      );
      
      always #10 clk = ~clk;
      
      initial begin
                clk = 1;
                rst_n = 0;
                #201;
                rst_n = 1;
               
                repeat (10000) begin
                        #60000;
                end
               
                $stop;
      end

endmodule
我们接下来跑仿真,结果跑了老半天都看不到led的波形翻转,因为仿真要足足跑1秒钟的时间led的波形才会翻转,而这里的仿真时间单位是纳秒(ns),可以算算要跑多长时间
http://www.corecourse.cn/forum.php?mod=attachment&aid=MTYxMHxkODVjNjc4ZHwxNTY4NjQ2MTkxfDg5ODl8MjgyOTk%3D&noupdate=yes

现在我们把代码稍微修改一下:
工程代码:
module led(
      clk,
      rst_n,
      led
);
      input clk;
      input rst_n;
      output reg led;
      
      parameter CNT_MAX = 26'd49_999_999;      // 差异部分
      reg cnt;
      always @ (posedge clk or negedge rst_n)
      begin
                if (!rst_n)
                        cnt <= 26'd0;
                else if (cnt < CNT_MAX)                        // 差异部分
                        cnt <= cnt + 1'b1;
                else
                        cnt <= 26'd0;
      end
      
      always @ (posedge clk or negedge rst_n)
      begin
                if (!rst_n)
                        led <= 1'b1;
                else if (cnt < CNT_MAX)                        // 差异部分
                        led <= led;
                else
                        led <= ~led;
      end

endmodule
仿真文件代码:
`timescale 1ns/1ps

module led_tb;

      reg clk;
      reg rst_n;
      wire led;

      led led_inst(
                .clk(clk),
                .rst_n(rst_n),
                .led(led)
      );
      
      defparam led_inst.CNT_MAX = 10;      // 差异部分
      
      always #10 clk = ~clk;
      
      initial begin
                clk = 1;
                rst_n = 0;
                #201;
                rst_n = 1;
               
                #2000;
               
                $stop;
      end

endmodule
我们接下来跑仿真,结果很快就看到led的波形翻转了
http://www.corecourse.cn/forum.php?mod=attachment&aid=MTYxMXxhMjkzZjIxMHwxNTY4NjQ2MTkxfDg5ODl8MjgyOTk%3D&noupdate=yes

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

页: [1]
查看完整版本: 【Modelsim仿真技巧】如何缩短仿真时间