前言
在使用仿真软件时经常会遇到实际需要时间较长,而仿真需要改写实际代码运行时间的问题,在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) begin
if(!rst_n)
cnt <= 26'd0;
else if(cnt < 26'd5000_0000)
cnt <= cnt + 1'b1;
else
cnt <= 26'd0;
end
assign 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 begin
clk = 1'b0;
rst_n = 1'b0;
#200
rst_n = 1'b1;
end
cnt_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) begin
if(!rst_n)
cnt <= 26'd0;
// else if(cnt < 26'd5000_0000)
else if(cnt < 26'd50) //仅用于仿真
cnt <= cnt + 1'b1;
else
cnt <= 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) begin
if(!rst_n)
cnt <= 26'd0;
`ifdef Simdem
else if(cnt < 26'd50)
`else
else if(cnt < 26'd5000_0000)
`endif
cnt <= cnt + 1'b1;
else
cnt <= 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 ;
`endif
endmodule
软件中设置
将自己设置的变量名称添加即可文章来源:https://www.toymoban.com/news/detail-754114.html
结果
在实际代码结果不变的情况下,仿真时间大大减少
同时可以通过这个功能做写一下初值预留给仿真、预留接口等等,最后放一下没有修改仿真代码,添加语句后的仿真结果
文章来源地址https://www.toymoban.com/news/detail-754114.html
到了这里,关于vivado仿真时使用的代码与实际不一致的解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!