vivado仿真时使用的代码与实际不一致的解决办法

前言

在使用仿真软件时经常会遇到实际需要时间较长,而仿真需要改写实际代码运行时间的问题,在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

软件中设置
在这里插入图片描述
在这里插入图片描述
将自己设置的变量名称添加即可

结果

在实际代码结果不变的情况下,仿真时间大大减少
同时可以通过这个功能做写一下初值预留给仿真、预留接口等等,最后放一下没有修改仿真代码,添加语句后的仿真结果
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值