文章目录

  • 前言
  • 实践分析
  • 推荐的仿真设计
  • 总结

前言

提前给出一些观点:

  • 仿真是为了仿真,所以不要设置极限情况,例如在时钟上升沿通过阻塞赋值给数据,应该避免这种情况;
  • 各种不同的仿真软件对时钟上升沿通过阻塞赋值给数据的理解不一致,例如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) beginif(rst) beginin_reg <= 0;endelse beginin_reg <= in;endendwire mid_pos;assign mid_pos = ~in_reg & in;reg reg_pos;reg reg1_pos;reg reg2_pos;always@(posedge clk) beginif(rst) beginreg_pos <= 0;reg1_pos <= 0;reg2_pos <= 0;out_r3 <= 0;endelse beginreg_pos <= mid_pos;reg1_pos <= reg_pos;reg2_pos <= reg1_pos;out_r3 <= reg2_pos;endendendmodule

如下,我们的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 beginclk =   0;forever begin#5 clk =   ~clk;endendinitial beginrst =    1;in =    0;#20 rst = 0;#100@(posedge clk) beginin =    1;end#300in =   0;enddelay delay_inst(.in(in),.clk(clk),.rst(rst),.out_r3(out_r3));endmodule

我们对输入进行赋值:

 @(posedge clk) beginin =    1;end

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

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

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

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

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

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

 @(posedge clk) beginin <=    1;end

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

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

推荐的仿真设计

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

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

或者:

    #100@(negedge clk) beginin <=    1;end

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

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

总结

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

FPGA设计心得(10)关于行为仿真的一点观点相关推荐

  1. FPGA设计心得(6)Aurora IP核例子简析与仿真(framing版)

    文章目录 背景 定制framing接口的IP核 生成示例工程并分析 GEN模块分析 CHECK模块分析 示例工程仿真 总体仿真 发送模块仿真 接收模块仿真 参考资料 交个朋友 写在最后 工程分享 背景 ...

  2. FPGA设计心得(4)Aurora IP core 的定制详情记录

    文章目录 写在前面 IP核定制页面预览 IP核定制详解 lane width Line Rate GT REFCLK (MHz) INIT clk (MHz) DRP clk (MHz) Datafl ...

  3. FPGA设计经验谈 —— 10年FPGA开发经验的工程师肺腑之言

    FPGA设计经验谈 -- 10年FPGA开发经验的工程师肺腑之言 2014年08月08日 14:08    看门狗 关键词: FPGA 作者:friends 从大学时代第一次接触FPGA至今已有10多 ...

  4. FPGA设计心得(1)真双口RAM使用及其仿真问题记录

    文章目录 前言 设计介绍 关于仿真 老生常谈 最后想说的话 前言 RAM是一个好东西,FIFO也是,关键是适应你的设计场景,本文是一个记录性质的博文,所以也没必要什么都交代清楚了,只是在项目开发中,有 ...

  5. FPGA设计心得(2)边沿检测的问题进一步说明(仿真中一定能得到上升沿的设计)

    文章目录 背景 新检测方法 旧检测方法 改进旧检测方法 设计介绍 设计代码 仿真情况 仿真图 最后想提出的问题 同行邀请 工程分享 背景 关于边沿检测,写过的博文也很多,不下于4篇了,当然都是学习过程 ...

  6. FPGA设计心得(5)Aurora 例子工程分析与仿真实例分析(streaming版)

    文章目录 背景 例子工程预览 例子程序用户模块逻辑分析 收(CHECK) 发(GEN) 例子程序仿真文件分析 写在最后 工程分享 参考资料 交个朋友 背景 熬夜写完了上两篇博客: Aurora IP ...

  7. FPGA设计心得(9)基于DDS IP核的任意波形发生器设计

    博文目录 写在前面 正文 设计要求 IP核配置 定制输出数据位宽 定制相位位宽(或频率分辨率) 输出频率 输出正余弦选择以及数据格式 其他设置 电路设计 行为仿真 参考资料 交个朋友 写在前面 数据手 ...

  8. FPGA设计心得(11)关于FIFO IP核使用的一点注意事项

    文章目录 前言 位宽转换 分布式ram资源的FIFO不能变换位宽 Block RAM资源可以变化位宽 Builtin FIFO资源不能变化位宽 FIFO 安全电路 FIFO消耗资源 输出延迟 Read ...

  9. FPGA设计心得(8)Verilog中的编译预处理语句

    文章目录 写在前面 正文 宏定义 文件包含 条件编译 条件生成语句问题 回顾 参考资料 交个朋友 写在前面 相关博文 博客首页 注:学习交流使用! 正文 看稍微复杂一点的IP Core以及模块等 ,都 ...

最新文章

  1. 手机微站webapp
  2. android webview 多文件上传,Android中的webview支持页面中的文件上传实例代码
  3. ASP.NET Core整合Zipkin链路跟踪
  4. Android 多线程实现异步执行demo,线程池使用demo
  5. for in / for of 要会用
  6. 深度学习(03)-- CNN学习
  7. spring boot+mybatis+generator生成domain大小写问题
  8. Netty是如何实现TCP心跳机制与断线重连的
  9. 赋能未来的昆腾全新Scalar存储平台
  10. 转:时域错误隐藏个人理解_Phinex的博客_雅虎博客_雅虎空间
  11. C语言编程-对数字进行分类
  12. 如何快速辨别工业级POE交换机和普通交换机的不同?
  13. csgo红锁号能解锁吗_CSGO红锁黑刀号!重磅!大规模红锁!
  14. 计算机添加本地安全组用户名和密码错误,u租号总是密码错误-共享用户名和密码正确总提示错误...
  15. win7 共享计算机 网络密码怎么设置,Win7无线网络共享设置方法丨Win7无线网络共享设置方法图解...
  16. CRC-16/MODBUS x16+x15+x2+1校验计算 C++
  17. driller fuzz arm问题解决记录
  18. 【 Iptables 】
  19. 蓝桥杯国赛C++A组B组题解整理(第八、七、六、五、四届)
  20. 流氓软件卸载了又偷偷冒出来,dllhost.exe暗藏安装玄机

热门文章

  1. 从「王师傅一共损失了多少钱」说开去
  2. C# 字符串格式化大全
  3. 备份----硬盘对拷
  4. DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏
  5. 推荐系列:2008年第07期 总9期
  6. 计算机教案word格式模板,用自定义模板编辑教案
  7. MySQL实验作业_MySQL作业
  8. 2003系统服务器,雨林木风 windows server 2003企业版服务器系统
  9. begin end会产生事务吗_无线信号放大器会产生同频干扰吗?
  10. python每行输出8个式子_求大神用python写出算术题的式子和结果。