昨天经历了恶梦debug,中间排了很多坑,特来记录一番。

一、问题描述

和队友写了lenet神经网络推理的硬件实现,在modelsim已经跑通,且验证了功能,但需要移植到vivado,利用里面的dist_rom加载权重。

顺便插一句,vivado有两者存储IP:dist_ram和blk_ram,分别表示分布式存储和块存储。分布式存储利用lut单元,分布在电路周围,因此布线容易,但容量有限制。块存储是真实的ram,容量大,但有可能布线较长。

但将reg更换成rom和ram之后,运行结果和modelsim不一致。然后用源文件在vivado仿真,结果还是不一样。

第二天用vcs仿真,发现前半部分输出和vivado一致,后半部分输出不一样。用iverilog仿真,发现前半部分输出和modelsim一致,后半部分输出不一样。

这下彻底崩溃,四个EDA软件仿真相同的文件,出现四种不同结果!而且代码那么多,可谓海底捞针,真不知道自己当时哪来的勇气去debug。

二、漫长debug

Debug最基本的思想就是控制变量,要么从头开始,要么从尾部回溯。电路的调试还有个很好的切入点是“状态机”,查看状态跳转可以缩小搜索范围,相当好用。

我首先比较modelsim和iverilog后半部分输出,确实发现最后一个全连接层的状态跳转失败,因此回溯决定状态跳转的几个信号。iverilog的好处是一次仿真可以保存所有信号,这和vcs一样。modelsim每次添加信号需要重新仿真,但它能够查看中间memory的数据,这点和vivado一致。

回溯到最后,发现一个always模块的非阻塞赋值写成了阻塞赋值!modelsim默认always模块里都是非阻塞赋值,其他仿真器则不会,两者赋值的输出结果会不一样。这样modelsim和iverilog就对上了。

接下来找vcs和iverilog差别,它们是前半部分不同,因此向前回溯,最后发现TB顶层,打入Input map的时候,always模块没有用非阻塞,导致memory初始化数据不对。这么明显的错误,我当时竟然没看到,真是眼瞎了!这下vcs和iverilog也对上了。

最后权重替换为dist_rom和blk_ram,前半部分结果不对,而且数据延时了一拍才出来。还是用回溯的方法找信号,最后发现blk_ram的读使能应该由两个信号决定,我只写了一个信号,导致其中一个数据写错,影响最终结果。

从早上7点找到晚上8点,庆幸找到了这三个bug,真是伤神。

三、阻塞和非阻塞仿真的区别

这里做一个简单的测试模块:

module test(input  clk,rst_n,output reg acc,output reg [3:0] cnt);reg enable;always @(posedge clk or negedge rst_n) beginif(~rst_n)acc <= 0;else
//非阻塞赋值,cnt正常累加acc <= ~acc;
//阻塞赋值,cnt输出一直为0//  acc = ~acc;endalways @(posedge clk or negedge rst_n) beginif(~rst_n)enable <= 0;else enable <= ~enable;end always @(posedge clk or negedge rst_n) beginif (~rst_n)cnt <= 0;else if(enable)    cnt <= cnt + acc;endendmodule

仿真阻塞和非阻塞的结果,我们看到,非阻塞的acc正常累加,阻塞的acc一直保持0,为什么呢?

看图中的第一个↑,非阻塞赋值,acc从0→1,阻塞不变。

  • 非阻塞:当上升沿到来时,会查看上升沿前信号的值,acc=1,enabel=1,因此cnt=cnt+1,更新为1;
  • 阻塞:当上升沿到来时,查看enable(非阻塞)上升沿前的值,enabel=1,acc上升沿后(阻塞),acc=0,因此cnt=cnt+0,保持不变;

四、iverilog和vcs仿真

iverilog是开源软件,用于仿真并产生相应文件,再利用gtkwave查看。仿真前需要在tb文件加入保持波形文件的语句:

initial begin
$dumpfile("test2.vcd")
$dumpvars;
end

然后执行以下语句,注意tb文件放最后:

iverilog test2_rtl.v test2_tb.v
./a.out
gtkwave test2.vcd

vcs是Synopsys公司的仿真软件,工业界一般配合verdi查看波形debug,也可以利用自带的dve。同样,tb文件加入保存波形的语句:

initial begin$vcdpluson();
end

依次执行

vcs -full64 -f verilog_file.f -debug_pp +vcd+vcdpluson
./simv
dve -vpd vcdplus.vpd

这里的verilog_file.f 文件是.v文件的列表,即

test2.v test2_tb.v

原文链接

modelsim和vivado仿真不一致——噩梦debug相关推荐

  1. Modelsim编译Vivado仿真库报错(vlog-12110)

    Vivado仿真器版本支持 首先查阅xilinx官方文档ug900(v2019.2),里面指出了vivado2019.2所支持的不同平台的仿真器版本.对于其他版本的vivado或者最新的vista,应 ...

  2. vivado与modelsim的联合仿真(二)

           最近在做Zynq的项目,曾经尝试使用ISE+PlanAhead+XPS+SDK组合和Vivado+SDK来搭建工程,使用中发现前者及其不方便后者有诸多不稳定.近期得闻Xilinx退出Vi ...

  3. Modelsim 与Vivado联合仿真版本对应问题

    Modelsim 与Vivado联合仿真版本对应问题 Solution Vivado Design Suite 2018.3 Mentor Graphics ModelSim SE/DE/PE (10 ...

  4. 在Modelsim中添加Vivado仿真库

    说明:本文是在参考<在Modelsim中添加Xilinx仿真库>的基础上,经过反复试验才取得成功的! 在Modelsim安装目录下新建一个用于存放Vivado仿真库的文件夹,如本文新建了一 ...

  5. VIVADO仿真功能系列

    版权声明:本文为CSDN博主「FPGADesigner」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/F ...

  6. 通过文件读写方式实现Matlab和Modelsim的联合仿真

    虽然 Modelsim 的功能非常强大,仿真的波形可以以多种形式进行显示,但是当涉及到数字信号处理的算法的仿真验证的时候,则显得有点不足.而进行数字信号处理是 Matlab 的强项,不但有大量的关于数 ...

  7. vivado 仿真_提高Vivado效率一种自研工具介绍

    在之前本公众号写过两篇关于工具更新对仿真调试提高效率的文章,<[干货]推荐一款FPGA仿真调试鸟枪换炮的工具!>以及<NCVerilog+SimVision+Vivado仿真环境搭建 ...

  8. Vivado仿真功能

    仿真是FPGA开发中常用的功能,通过给定测试激励,对比输出结果,来验证设计的功能性.本文将介绍vivado中仿真功能的使用. 一. 仿真功能概述 Vivado支持:Vivado Simulator.Q ...

  9. VIVADO仿真问题

    VIVADO与ModelSim联合仿真: 1.问题: ROM输出波形正常,算法的simulink和matlab仿真也正常,通过sysgen生成的算法IP核转换波形,但ModelSim却仿真出莫名其妙的 ...

最新文章

  1. rman备份脚本shell版
  2. Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level...
  3. python json提取器_【编号0004】爬虫中常用到的数据提取手段
  4. 调css支持firefox、IE6、IE7的方法
  5. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)
  6. 【Android】线程池
  7. 如何运用领域驱动设计 - 存储库
  8. AutoScaling 与函数计算结合,赋予更丰富的弹性能力
  9. 基于python的视频监控系统_Python实现微信监控报警系统
  10. mybatis parametertype 多个参数
  11. 整个计算机系统结构图,计算机系统结构复习(16页)-原创力文档
  12. DeepMind的脑补AI再获新技能:看文字知场景、复杂环境、连续视频……
  13. 和为S的连续正数序列(python)
  14. 创建Maven时生成的properties标签内容解释
  15. linux纯终端下中文输入,Ubuntu 14.04 终端模式下中文输入 听歌
  16. mysql报错error2002_mysql中异常出错ERROR:2002的处理办法分享
  17. python 实时录音_python实现录音功能(可随时停止录音)
  18. 不登录微信怎么查看电脑里的微信聊天DAT图片
  19. graylog+kafka+zookeeper(单机测试及源码),graylog设置URL报警方式(五)
  20. 《科学之路》| 图灵奖得主杨立昆人工智能十问:AI会统治人类吗?

热门文章

  1. python处理excel实例编程_python处理Excel的简单示例
  2. springboot2------自定义消息转换器
  3. 日有所思(5)——校正装置的理解和设计
  4. 电脑开机后没反应,如何解决?
  5. Python爬虫三:抓取链家已成交二手房信息(58W数据)
  6. 「 LaTex 」写论文,作者旁添加ORCID
  7. linux系统的简单命令
  8. 台湾华夏堂古代玉器收藏家~件件珍贵难得一见
  9. 2017-2018-2 20179215《密码与安全新技术》第1周作业
  10. 计算机的利弊四级作文,2016年6月英语四级作文范文:网络的利弊