前言
在使用仿真软件时经常会遇到实际需要时间较长,而仿真需要改写实际代码运行时间的问题,在vivado软件中找到了解决办法
代码部分
这里使用一个最简单的例子来说明一下,学过FPGA的朋友肯定可以看出来就是一个简单的计数器使LED每500ms交替闪烁一次
module cnt_sim(input clk, input rst_n, output [1:0] led
);reg [25:0] cnt ;always @ (posedge clk or negedge rst_n) beginif(!rst_n)cnt <= 26'd0;else if(cnt < 26'd5000_0000)cnt <= cnt + 1'b1;elsecnt <= 26'd0;
endassign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;endmodule
这里简单做一下仿真
`timescale 1ns / 1ps
module tb_cnt_sim;reg clk,rst_n;
wire [1:0] led;always #10 clk = ~clk;initial beginclk = 1'b0;rst_n = 1'b0;#200rst_n = 1'b1;
endcnt_sim u_cnt_sim(.clk(clk), .rst_n(rst_n), .led(led)
);
endmodule
可以看的仿真的结果是和我们的设计一致的
但其实在实际工程应用中仿真500ms需要很长时间,甚至要几十个小时,所以我们希望我们的代码在仿真中只是验证逻辑即可,因此常见的方法一般是在代码中修改
module cnt_sim(input clk, input rst_n, output [1:0] led
);reg [25:0] cnt ;always @ (posedge clk or negedge rst_n) beginif(!rst_n)cnt <= 26'd0;
// else if(cnt < 26'd5000_0000)else if(cnt < 26'd50) //仅用于仿真 cnt <= cnt + 1'b1;elsecnt <= 26'd0;
end//assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
assign led = (cnt < 26'd25) ? 2'b01 : 2'b10 ; //仅用于仿真endmodule
改进方法
显然反复修改逻辑很麻烦,这里提供一种vivado软件自带的功能和语法类型,来解决这个问题
`ifdef 变量名称仿真运行代码`else 实际运行代码
`endif
然后再软件中设置识别变量名称即可
例如:
module cnt_sim(input clk, input rst_n, output [1:0] led
);reg [25:0] cnt ;always @ (posedge clk or negedge rst_n) beginif(!rst_n)cnt <= 26'd0;`ifdef Simdemelse if(cnt < 26'd50)`else else if(cnt < 26'd5000_0000)`endifcnt <= cnt + 1'b1;elsecnt <= 26'd0;
end`ifdef Simdem
assign led = (cnt < 26'd25) ? 2'b01 : 2'b10 ;
`else
assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
`endifendmodule
软件中设置
将自己设置的变量名称添加即可
结果
在实际代码结果不变的情况下,仿真时间大大减少
同时可以通过这个功能做写一下初值预留给仿真、预留接口等等,最后放一下没有修改仿真代码,添加语句后的仿真结果