一个Vivado仿真问题的debug

我最近在看Synopsys的MPHY仿真代码,想以此为参考写个能实现PWM-G1功能的MPHY,并应用于ProFPGA原型验证平台。我从中抽取了一部分代码,用Vivado自带的仿真器进行仿真,然后就遇到了一个莫名其妙的问题,谨以此文作为debug记录。

一、原始问题

涉及到的相关代码如下:

  1. 第一张图是我从MPHY仿真代码里copy的一个task,用于对MPHY进行参数配置;
  2. 第二张图是我要配置的MPHY参数;
  3. 第三张图是选取的一个出问题的参数模块例化;
  4. 第四张图是这个参数模块的实现,非常简单。

就是这么简单的几行代码,却意外出问题了,仿真波形如下图所示,可以看到参数没有配置成功。

我真的是百思不得其解,就用了一个下午进行debug。

二、问题简化

由于原始问题的仿真工程比较大,仿真时间比较长,debug起来就很费劲。于是我就把问题的关键部分抽取出来,做了简化,写了如下的一段仿真代码:

// *****************************************************************************
// *                                                                           *
// * Vivado simulation.                                                        *
// *                                                                           *
// * Author:  ZhengWei                                                         *
// * Date  :  2024/02/06                                                       *
// *****************************************************************************`timescale 1ns / 1ps module tb;                      // Clock ans reset ports of the modulereg                     sys_clk                     ;reg                     sys_rst                     ;// Tx config interface portsreg     [7:0]           tx_attrid                   ;reg     [7:0]           tx_attrwrval                ;reg                     tx_attrwrn                  ;reg                     tx_configenable             ;wire                    write_en                    ;wire                    cfg_sel                     ;reg     [7:0]           dataout                     ;    //------------------------------------------------------------------------------------parameter   SYSCLK_FREQ         = 38.4             	; initial sys_clk = 1'b0;initial foreverbegin#(1000.0/(2*SYSCLK_FREQ));sys_clk <= ~sys_clk;endtask automatic write_shadow_cfg(input [7:0] attrid, input [7:0] attrwrval);begin    tx_attrid    = 8'h00;tx_attrwrval = 8'h00;	    @(posedge sys_clk) begin	tx_configenable <= 1'b0     ;tx_attrwrn      <= 1'b0     ;tx_attrid       <= attrid   ;tx_attrwrval    <= attrwrval;end        @(posedge sys_clk) begin	tx_configenable <= 1'b1     ;tx_attrwrn      <= 1'b1     ;tx_attrid       <= attrid   ;tx_attrwrval    <= attrwrval;end@(posedge sys_clk) begintx_configenable <= 1'b0 ;tx_attrwrn      <= 1'b0 ;tx_attrid       <= 8'h00;tx_attrwrval    <= 8'h00;	endendendtaskinitial begintx_configenable  = 1'b0 ;tx_attrwrn       = 1'b0 ;tx_attrid        = 8'h00;tx_attrwrval     = 8'h00;sys_rst = 1'b1  ;#100sys_rst = 1'b0  ;#200;                                             write_shadow_cfg(8'h2d, 8'h20);#200;write_shadow_cfg(8'h2d, 8'h25);write_shadow_cfg(8'h2d, 8'h30);# 500           ;$stop           ;endassign  write_en =  tx_configenable && tx_attrwrn;assign  cfg_sel  = (tx_attrid == 8'h2d);always @(posedge sys_clk or posedge sys_rst) beginif (sys_rst)dataout <= 8'h00;else if(write_en && cfg_sel) dataout <= tx_attrwrval;else dataout <= dataout;endendmodule

三、问题定位

按如上代码进行仿真,复现了问题,波形如下图所示:

  1. 先写了个20,结果是20,正确;
  2. 再写了个25,但结果是0,错误;
  3. 最后写了个30,结果是30,正确。

其实,我一开始只写了个20,发现结果是正确的。我还想了很久,为啥原始仿真工程是错误的呢?

后面就连着写了25和30,才发现先写的25结果是错的,后写的30结果是对的。

特别注意:写20后面加了delay,但25和30中间没有加delay。

四、问题解决

虽然这结果也很让人费解,但不加delay就有问题,不由得让我怀疑下面这两句有问题:

把这两句注释掉,重新仿真,结果正确,波形图如下:

五、进一步分析

按我的理解,这两句也就只是在task开始时给信号赋个初始值而已,为啥就会导致结果变成0了呢?还是不能理解!为了理解这个结果0是怎么来的,让问题能变得再清晰点,改成如下:

重新仿真后的波形图如下所示:

我们能在波形里看到ff,但却是更加莫名其妙了。隐隐感觉这可能与阻塞赋值和非阻塞赋值有关,虽然还是不能理解,但改成如下进行仿真:

重新仿真后的波形图如下所示,可以看到结果是正确的:

六、总结与疑问

以前读书时,只记住了“组合逻辑用阻塞赋值,时序逻辑用非阻塞赋值”,然后就是教科书里的几个加delay的例子,感觉还都能理解。

也看了下面这个例子,感觉和我当前的这个例子还是有区别的。

modelsim和vivado仿真不一致——噩梦debug - 代码先锋网

再看了下面这个链接,感觉还是没有特别理解为啥我这个例子里用阻塞赋值会是这样的结果。

verilog中阻塞和非阻塞的区别_verilog阻塞和非阻塞的区别-CSDN博客

时间和精力有限,这个问题先暂时这样了,如果有大佬路过可以赐教下,不胜感激!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/254794.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 本地RStudio 工具安装远程访问

前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问&#xff0c;从而将 RStudio IDE 的强大功能和工作效率带到基于服务器的集中式环境中。 下面介绍在Linux docker中安装RStudio Server并结合cpolar内网…

力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1&#xff1a;位运算 1.易验证2的幂为正数&#xff1b; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2&#xff1a;数学 当给定数n大于1时…

C语言操作符超详细总结

文章目录 1. 操作符的分类2. 二进制和进制转换2.1 2进制转10进制2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制2.2.1 2进制转8进制2.2.2 2进制转16进制 3. 原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~6. 逗号表达式…

LabVIEW多任务实时测控系统

LabVIEW多任务实时测控系统 面对现代化工业生产的复杂性和多变性&#xff0c;传统的测控系统已难以满足高效、精准、可靠的监控和控制需求。因此&#xff0c;开发一种基于LabVIEW的智能测控系统&#xff0c;能够提高生产效率&#xff0c;保证生产安全&#xff0c;是解决现代工…

12 ABC串口接收原理与思路

1. 串口接收原理 基本原理&#xff1a;通过数据起始位判断要是否要开始接收的数据&#xff0c;通过采样的方式确定每一位数据是0还是1。 如何判断数据起始位到来&#xff1a;通过边沿检测电路检测起始信号的下降沿 如何采样&#xff1a;一位数据采多次&#xff0c;统计得到高…

SpringBoot和SpringMVC

目录 一、springboot项目 &#xff08;1&#xff09;创建springboot项目 &#xff08;2&#xff09;目录介绍 &#xff08;3&#xff09;项目启动 &#xff08;4&#xff09;运行一个程序 &#xff08;5&#xff09;通过其他方式创建和运行springboot项目 二、SpringMVC…

掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧

目录 虚拟机介绍 虚拟机的关键字 服务器架构的发展 为什么用虚拟机VMware 虚拟机和阿里云的区别 功能角度 价格因素 应用场景 优势方面 找到windows的服务管理 配置VMware 关于VMware安装的几个服务 vmware如何修改各种网络配置 关于NAT的详细信息(了解) NAT(网…

2024年低压电工证模拟考试题库及低压电工理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年低压电工证模拟考试题库及低压电工理论考试试题是由安全生产模拟考试一点通提供&#xff0c;低压电工证模拟考试题库是根据低压电工最新版教材&#xff0c;低压电工大纲整理而成&#xff08;含2024年低压电工证…

嵌入式单片机中晶振的工作原理

晶振在单片机中是必不可少的元器件&#xff0c;只要用到CPU的地方就必定有晶振的存在&#xff0c;那么晶振是如何工作的呢&#xff1f; 什么是晶振 晶振一般指晶体振荡器&#xff0c;晶体振荡器是指从一块石英晶体上按一定方位角切下的薄片&#xff0c;简称为晶片。 石英晶体谐…

Three.js学习8:基础贴图

一、贴图 贴图&#xff08;Texture Mapping&#xff09;&#xff0c;也翻译为纹理映射&#xff0c;“贴图”这个翻译更直观。 贴图&#xff0c;就是把图片贴在 3D 物体材质的表面&#xff0c;让它具有一定的纹理&#xff0c;来为 3D 物体添加细节的一种方法。这使我们能够添加…

Git详细讲解

文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作&#xff08;git commit&#xff09;2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…

ElasticSearch之倒排索引

写在前面 本文看下es的倒排索引相关内容。 1&#xff1a;正排索引和倒排索引 正排索引就是通过文档id找文档内容&#xff0c;而倒排索引就是通过文档内容找文档id&#xff0c;如下图&#xff1a; 2&#xff1a;倒排索引原理 假定我们有如下的数据&#xff1a; 为了建立倒…

Java中JVM常用参数配置(提供配置示例)

目录 前言一、内存参数配置二、垃圾收集器配置三、GC策略配置3.1、基础通用配置3.2、Parallel 和 Parallel Old 常用参数配置3.3、CMS 常用参数配置3.4、G1 常用参数配置 四、GC日志配置五、dump 日志参数配置5.1、OutOfMemory异常时生成dump文件5.2、发生Full GC时生成dump文件…

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle、Spark执行流程

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快&#xff1f; Spa…

Android Graphics 图像显示系统 - 开篇

“ 随着学习的不断深入和工作经验的积累&#xff0c;欲将之前在博客中整理的Android Graphics知识做进一步整理&#xff0c;并纠正一些理解上的错误&#xff0c;故开设Graphics主题系列文章 ” 序言 由于工作需要&#xff0c;也源于个人兴趣&#xff0c;终于下决心花时间整理一…

Mac 下JDK环境变量配置 及 JDK多版本切换

一、推荐官网下载&#xff1a; 二、环境变量配置 1、查看JDK地址&#xff0c;在终端输入以下命令&#xff1a; /usr/libexec/java_home -V 我的路径&#xff1a; /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home /Library/Java/JavaVirtualMachines/zulu-11.j…

ffmpeg命令生成器

FFmpeg 快速入门&#xff1a;命令行详解、工具、教程、电子书 – 码中人的博客FFmpeg 是一个强大的命令行工具&#xff0c;可以用来处理音频、视频、字幕等多媒体文件。本文介绍了 FFmpeg 的基本用法、一些常用的命令行参数&#xff0c;以及常用的可视化工具。https://blog.mzh…

nvm安装node后,npm无效

类似报这种问题&#xff0c;是因为去github下载npm时下载失败&#xff0c; Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法&#xff1a;需要复制这里面的地址爬梯子去下载&#xff08;github有时不用梯子能直接下载&#xff0c;有…

机器学习系列——(二十二)结语

随着我们的机器学习系列的探索画上句号&#xff0c;我们不禁感慨于这一领域的广阔和深邃。从最初的基础概念到复杂的算法&#xff0c;从理论的探讨到实际应用的示例&#xff0c;我们一起经历了一段非凡的旅程。机器学习不仅是当前技术创新的核心驱动力之一&#xff0c;也是塑造…

电脑通电自启动设置

首先要进入BIOS&#xff0c;以华硕为例&#xff0c;按下电源键&#xff0c;在开机之前按下delete键&#xff0c;其他电脑可能是esc或者某个f键&#xff0c;请自行查找。 进入BIOS后要找到电源管理&#xff0c;可以在高级选项中找一找&#xff0c;如上图右下角选择高级模式。 …