verilog勘误系列之-->设计行为仿真和时序仿真不一致分析
描述
最近在vivado中设计一个计算器: 28bit有符号加减法,结果出现行为仿真和时序仿真不一致情况
原因
本篇是由于组合逻辑部分敏感信号使用错误导致
代码
r_a, r_b : 对计算数据a, b的寄存器存储, 也是计算器的数据输入
s_bit : 符号位
cout : 28bit计算器的进位输出 cout[27] : 最高位进位, 用来判断符号以及加法进位
always@(a, b) begin // 1
// always@(r_a, r_b) begin // 2
case({a[27], b[27]} // 1
case({r_a[27], r_b[27]}) // 2
2'b00: s_bit = 1'b0;
2'b01: s_bit = cout[27] ? 1'b0 : 1'b1;
2'b10: s_bit = cout[27] ? 1'b0 : 1'b1;
2'b11: s_bit = 1'b1;
default:s_bit = s_bit;
endcase
end
输出结果代码
always@(posedge clk or negedge rstn) begin
if(!rstn)
result <= 'd0;
else
result <= {s_bit, sum};
end
当条件为1时行为仿真错误,时序仿真正确, 如下

当条件为2时行为仿真和时序仿真均正确 , 如下

说明
此处的敏感信号列表只有当为r_a, r_b时结果才正确,其他情况均错误
分析

t0 : a0, b0 变化,cout0 = 0, case0 = 2'b00, s_bit0 = 0
t1 : r_a0, r_b0 变化并且开始进行计算,cout1 = 0, case1 = 2'b00, s_bit1 = 0
t2 : a1, b1 变化, cout1 = 0, case = 2'b01, s_bit = 1
t3 : r_a1, r_b1 变化开始进行计算, cout3 = 1, case = 2'b01, s_bit = 1
为什么会发生错误呢?
t0 : a, b变化, 但是此时的cout = 0, 并不是因为计算等于0 ,因为此时并未开始计算,所以s_bit也会错误
t1 : r_a, r_b 变化,开始计算,现在的cout是正确的,但是此时并不更新s_bit,因为敏感信号没有变化
t2 : a, b发生变化, 但是此时的cout却是上一个r_a, r_b计算的结果,但是我们在此时对s_bit进行赋值,还是会发生错误
t3 : 终于输出计算结果, 但是此时的s_bit是错误的, 因为cout与case并不同步, case超前于cout一个上升沿(而非一个clk)
所以,在设计的时候一定要分析好时序, 尽管s_bit使用的是组合逻辑, 但是,在仿真过程中出现了case选项和条件值不同步的情况
另外
代码块A
always@(a, b) begin
case({a[27], b[27]})
2'b00: s_bit = 1'b0;
2'b01: s_bit = cout[27] ? 1'b0 : 1'b1;
2'b10: s_bit = cout[27] ? 1'b0 : 1'b1;
2'b11: s_bit = 1'b1;
default:s_bit = 1'b0;
endcase
end
代码块B
always@(*) begin
case({a[27], b[27]})
2'b00: s_bit = 1'b0;
2'b01: s_bit = cout[27] ? 1'b0 : 1'b1;
2'b10: s_bit = cout[27] ? 1'b0 : 1'b1;
2'b11: s_bit = 1'b1;
default:s_bit = 1'b0;
endcase
end
代码块B 等价于 代码块A, 废话,肯定等价
我的意思是,always@(*) 会自动将case(a,b)变成敏感信号,从而变化为always@(a, b), 其他信号变化无用
如果你的控制变量是别的, 综合工具(此处是vivado)会将控制信号变为敏感信号.
本篇结束,大家设计代码一定要注意时序匹配
verilog勘误系列之-->设计行为仿真和时序仿真不一致分析的更多相关文章
- FPGA功能仿真,门级仿真,后仿真的区别
前言 分清楚各种仿真间的关系,工具采用quartus prime16.0,仿真工具采用modelsim10 ae版:项目:led_display; 流程 1.RTL行为级仿真:也叫功能仿真,这个阶段的 ...
- 基于Verilog HDL整数乘法器设计与仿真验证
基于Verilog HDL整数乘法器设计与仿真验证 1.预备知识 整数分为短整数,中整数,长整数,本文只涉及到短整数.短整数:占用一个字节空间,8位,其中最高位为符号位(最高位为1表示为负数,最高位为 ...
- FPGA Verilog HDL 系列实例--------步进电机驱动控制
[连载] FPGA Verilog HDL 系列实例 Verilog HDL 之 步进电机驱动控制 步进电机的用途还是非常广泛的,目前打印机,绘图仪,机器人等等设备都以步进电机为动力核心.那么,下面我 ...
- hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- Hdu 4514 湫湫系列故事——设计风景线
湫湫系列故事--设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
- HDU 4514 湫湫系列故事——设计风景线 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4514 湫湫系列故事--设计风景线 Time Limit: 5000/2000 MS (Java/Ot ...
- HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...
- 语法设计——基于LL(1)文法的预测分析表法
实验二.语法设计--基于LL(1)文法的预测分析表法 一.实验目的 通过实验教学,加深学生对所学的关于编译的理论知识的理解,增强学生对所学知识的综合应用能力,并通过实践达到对所学的知识进行验证.通过对 ...
随机推荐
- 主机--Host
概念:主机是用于构建应用程序和服务.封装应用资源的对象,负责程序的启动和生命周期的管理,简单来说主机即应用程序. 主机运行:当主机运行的时候,他会将托管在服务容器集合里面注册的IHostService ...
- 测试DHCP服务器
一:前期准备 1.准备三台虚拟机,不要配ip. 都改成仅主机模式,这样它们和DHCP才会相连 2.进入有DHCP服务器的虚拟机,更改虚拟网络编辑器 (编辑→虚拟网络编辑器(N)) 不勾选使用本地DHC ...
- CF1822F Gardening Friends
题目链接 题解 知识点:树的直径,枚举. 考虑一个结论:树上任意点的最远点一定是树的直径的端点. 那么对于一个根节点,只要知道了树的直径,那么我们就可以立即得到最远距离,即乘 \(k\) 树的价值. ...
- NC19989 [HAOI2012]容易题(EASY)
题目链接 题目 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能 ...
- NC19975 [HAOI2008]移动玩具
题目链接 题目 题目描述 在一个4*4的方框内摆放了若干个相同的玩具,某人想将这些玩具重新摆放成为他心中理想的状态,规定移动时只能将玩具向上下左右四个方向移动,并且移动的位置不能有玩具,请你用最少的移 ...
- 【Unity3D】异步Socket通讯
1 前言 同步 Socket 通讯 中的 Accept.Connect.Receive 等方法会阻塞当前线程,当前线程必须等待这些方法执行完,才会继续往下执行,用户需要另开线程执行这些耗时方法,否 ...
- 网络通信部分之bs/cs架构,网络概念,osi七层网络模型,TCP/UDP协议---day27
1.网络开发的两大架构c/s,b/s # ### 1.网络开发的两大架构 a文件 -> b文件 借助c文件 a文件和b文件进行数据交流,借助c文件中转数据 a文件把数据放在c文件中,b文件从c文 ...
- 【LeetCode剑指offer#04】包含min函数的栈、栈的压入、弹出序列(辅助栈的应用)
包含min函数的栈 https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/ 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元 ...
- 【Azure 环境】Azure CLI 获取Access Token的脚本实例
问题描述 如何使用azure CLI命令获取到中国区的Access Token呢? 问题解答 首先,需要通过 az cloud set --name AzureChinaCloud 来设置登录中国区的 ...
- 【Azure 应用服务】可以在app service里建SFTP服务吗?
问题描述 怎样可以在App Service里建SFTP服务? 并不是说通过FTP的方式进行App Service的文件部署. 问题回答 不能通过 App Service 来搭建总计的SFTP服务,因为 ...