【Modelsim仿真技巧】如何缩短仿真时间
刚开始学习写led亮灭仿真的时候很多人都会遇到仿真时间太长,耗费时间的问题,尤其是电脑性能不怎么好的,那是真的等到天荒地老,半天看不到LED的波形翻转,还以为自己的程序写的有问题呢其实我们可以利用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),可以算算要跑多长时间
现在我们把代码稍微修改一下:
工程代码:
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的波形翻转了
注:这种方法不会修改实际代码的延时时间,因为只是在仿真代码里面将CNT_MAX改成10的,所以这个改动也只会在仿真里面生效
【Modelsim仿真技巧】如何缩短仿真时间 【Modelsim仿真技巧】如何缩短仿真时间
页:
[1]