0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于行为仿真的一点观点

冬至子 来源:FPGA LAB 作者:李锐博恩 2023-06-21 11:22 次阅读

前言

提前给出一些观点:

  • 仿真是为了仿真,所以不要设置极限情况,例如在时钟上升沿通过阻塞赋值给数据,应该避免这种情况;
  • 各种不同的仿真软件对时钟上升沿通过阻塞赋值给数据的理解不一致,例如modelsim和isim;
  • 可以使用非阻塞赋值设置数据值,避免在时钟上升沿时刻使用阻塞赋值给数据。

本文最后会给出推荐的仿真观点。

实践分析

事实上,上面三点说的是针对一种情况,我们举一个简单的例子说明。我们的设计文件,很简单,就是一个检测上升沿的程序:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Engineer: Reborn Lee
// website : https://blog.csdn.net/Reborn_Lee
//////////////////////////////////////////////////////////////////////////////////


module delay(
    input wire in,
    input wire clk,
    input wire rst,
    output reg out_r3
    );
    
    reg in_reg;
    
    always@(posedge clk) begin
        if(rst) begin
            in_reg <= 0;
        end
        else begin
            in_reg <= in;
        end
    end
    
    wire mid_pos;
    
    assign mid_pos = ~in_reg & in;
    
    reg reg_pos;
    reg reg1_pos;
    reg reg2_pos;
    
    always@(posedge clk) begin
        if(rst) begin
            reg_pos <= 0;
            reg1_pos <= 0;
            reg2_pos <= 0;
            out_r3 <= 0;
        end
        else begin
            reg_pos <= mid_pos;
            reg1_pos <= reg_pos;
            reg2_pos <= reg1_pos;
            out_r3 <= reg2_pos;
        end
    end
    

endmodule

如下,我们的testbench为:

`timescale 1ns / 1ps
// Engineer: Reborn Lee
// website : https://blog.csdn.net/Reborn_Lee
module sim_delay;
    reg     clk;
    reg     rst;
    reg     in;
    wire    out_r3;
    
    initial begin
        clk =   0;
        forever begin
            #5 clk =   ~clk;
        end
    end
    
    initial begin
    rst =    1;
    in =    0;
    
    #20 
    rst = 0;
    
    #100
    @(posedge clk) begin
        in =    1;
    end
    
    #300
    in =   0;
    
    end
    
    delay delay_inst(
        .in(in),
        .clk(clk),
        .rst(rst),
        .out_r3(out_r3)
    
    );
    

endmodule

我们对输入进行赋值:

@(posedge clk) begin
        in =    1;
    end

可见,使用的是阻塞赋值,且在时钟上升沿赋值;

在这种情况下,我们使用vivado自带的仿真工具仿真,得到结果如下:

图片

isim仿真工具

可见,得不到上升沿,这我们其实也能理解;由于是行为仿真,所以,一切都是理想的,不考虑延迟;我们使用阻塞赋值在时钟上升沿时刻给输入赋值,立即生效;固然,我们的时钟在上升沿采样的时候,得到in_reg和in是同边沿的,这样自然就得不到边沿了,后面延迟多拍也自然无用。

这是vivado的仿真工具isim对这种情况的理解。

现在问题来了,当我们使用modelsim进行仿真的时候,情况是这样的:

图片

modelsim仿真工具

它会对in延迟一整拍,也就是要给时钟,最终也就能得到上升沿了。同样的设计,同样的仿真文件,为何会出现这样的差异呢?这里给出的解释是仿真工具对这种情况的理解问题:在实际情况中(考虑真实环境,存在延迟),这种输入的边沿出现在时钟的有效沿,本身就是不合法的,因为这会导致时序通过不了,例如建立时间。对于这种情况,modelsim或者questasim的处理就比较直接,我不准出现这种情况,如果你出现了,我们认为此刻无效。其效果类似于非阻塞赋值:

@(posedge clk) begin
        in <=    1;
    end

这里使用了非阻塞赋值,那么在时钟上升沿时刻,in的值就没那么快生效,如此,无论在那个平台仿真,仿真情况都一致了。

下面是这种情况下在任意平台的仿真图:

图片

任意平台

推荐的仿真设计

开门见山,在时钟有效沿时刻给数据是不符合实际的,是极端的做法,这在实际情况中不会出现,即使出现,综合布线工具也会重新布线避免这种情况,否则就是时许违规。因此为了有意义的仿真且统一仿真平台,我们应该在距离有效沿一定延迟给数据,例如:

#100
    @(posedge clk) begin
        #1 in =    1;
    end

或者:

#100
    @(negedge clk) begin
       in =    1;
    end

总之,别在有效沿给数据,以这种情况为例,给出仿真图:

#100
    @(posedge clk) begin
        #1 in =    1;
    end

图片

推荐的仿真方式

总结

从上面的分析可以看出,为了适应不同的仿真平台(并不是说哪个仿真平台错了) ,且本着仿真意义的实际情况,我们不应该在极端的情况下进行仿真,不仅没有意义,而且让人疑惑。推荐的做法是在下降沿或者距离时钟的上升沿有一定的延迟给数据,这才能避开不同平台的差异且有实际意义。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA设计
    +关注

    关注

    9

    文章

    428

    浏览量

    26432
  • 仿真器
    +关注

    关注

    14

    文章

    1010

    浏览量

    83473
  • Vivado
    +关注

    关注

    19

    文章

    797

    浏览量

    65949
收藏 人收藏

    评论

    相关推荐

    Saber中如何更好地提高仿真的收敛性()

    仿真过程中,由于仿真模型的不连续性,或者模型没有适当地表征/参数化,或者当求解器无法求解控制模型行为的方程时,可能就会出现仿真的收敛问题。
    的头像 发表于 12-05 14:43 1258次阅读
    Saber中如何更好地提高<b class='flag-5'>仿真的</b>收敛性(<b class='flag-5'>一</b>)

    关于通信原理的一点总结

    关于通信原理的一点总结
    发表于 08-20 10:00

    关于protus仿真的一点不懂,求大神指点啊,新手膜拜了

    我用c编了个小程序试了下手,发现一点问题:我的main()函数中没有循环,就几个简单的赋值加上延时来逐个显示几个数码管。按我的理解,到最后应该只固定显示到最后的个数码管不动了,程序结束。可为
    发表于 11-22 21:37

    个显示温度的音乐时钟(仿真+代码),自己一点点敲的....

    个显示温度的音乐时钟(仿真+代码),自己一点点敲的....
    发表于 04-17 20:28

    仿真的些资料

    仿真的一点点资料,东西很多。。{:7:}
    发表于 10-16 10:07

    为什么multisim中加入大一点的芯片就无法仿真?帮帮忙吧,积分很少,实在抱歉。

    为什么multisim14.0仿真的时候好好的,加入大一点的芯片就发现仿真变得很慢,不会就提示仿真
    发表于 12-21 21:34

    一点接地,什么是一点接地,一点接地应注意的问题

    一点接地,什么是一点接地 一点接地的形式如下图所示,图中将各级内部的接地元件,即本级电路的发射极,基极和集电极的所有接
    发表于 09-30 11:35 2.7w次阅读
    <b class='flag-5'>一点</b>接地,什么是<b class='flag-5'>一点</b>接地,<b class='flag-5'>一点</b>接地应注意的问题

    关于SI设计与SI仿真的一点浅见

    看到有很多人执着于信号完整性仿真,也有人提到软件仿真与实际不相符的问题,谈谈我自己的些看法。
    发表于 11-30 11:16 5195次阅读

    流水线ADC的行为仿真

    行为仿真是提高流水线(Pipeline)ADC设计效率的重要手段。建立精确的行为级模型是进行行为仿真的关键。本文采用基于电路宏模型技术的
    发表于 04-05 15:37 21次下载
    流水线ADC的<b class='flag-5'>行为</b>级<b class='flag-5'>仿真</b>

    关于画高频PCB板的一点心得

    关于画高频PCB板的一点心得,感兴趣的小伙伴们可以看看。
    发表于 07-26 16:29 0次下载

    路灯蓝光危害你造吗?专家建议“冷一点,暗一点

    美国医学会(AMA)最近接受了关于街道照明的正式政策声明:冷一点、暗一点。其在声明中称,对于晚上户外照明,尤其是街道照明,其色温不应超过3000开尔文(K)。较高的色温光照越白,同
    发表于 11-18 08:59 3258次阅读

    Xilinx ISE是如何调用ModelSim进行仿真的

    在我们用ModelSim仿真的时候经常是修改一点一点修改代码,这样会造成个无奈的操作循环:修改代码--->编译代码--->仿真设置--->
    发表于 02-11 15:25 1.1w次阅读
    Xilinx ISE是如何调用ModelSim进行<b class='flag-5'>仿真的</b>

    关于连接量子比特的一点:量子计算

    关于连接量子比特的一点:量子计算
    的头像 发表于 01-04 11:17 918次阅读
    <b class='flag-5'>关于</b>连接量子比特的<b class='flag-5'>一点</b>:量子计算

    时序仿真与功能仿真的区别有哪些?

    种EDA仿真,它模拟个数字电路中时序的行为。时序行为通常包括数据信号传输的时序,如周期时间或LATCH信号的上升沿下降沿。它通常应用于验证设计延迟、时序、时序违规和时序冲突等问题。
    的头像 发表于 09-17 14:15 5215次阅读

    包络仿真的四个步骤过程

    最近探索仿真的时候,在DF下仿真射频系统时,需要用到包络仿真(envelope simulation),所以就扒拉着看了一点ADS里面关于
    的头像 发表于 11-08 14:23 876次阅读
    包络<b class='flag-5'>仿真的</b>四个步骤过程