verilog勘误系列之-->算术运算符运算失败
描述
在verilog代码设计时使用算术运算符与乘法搭配使用出现计算错误
原因
由于数据位宽设置不当导致
错误案例
wire signed [13:0] w01;
wire signed [23:0] s01;
reg signed [24:0] m01;
reg signed [25:0] a1;
// 24 + 14 - 13 = 25
m01 <= (w01 * s01) >>> 13;
m02 <= (w02 * s02) >>> 13;
a1 <= m01 + m02;
仿真
在此处运算时,我们似乎设计好了数据位宽,看起来好像没有错误,但是看仿真结果

计算
m01 = (s01 * w01) >>> 13 = (3202 * 68270) >>> 13 = 218600540 >>> 13 = 26684
显然与结果不符合
修改一
将m01的数据位宽与乘法结果位宽匹配. 即m01的位宽应该时w01的位宽加上s01的位宽, 即reg signed [37:0] m01;
仿真

此处可以看出仿真结果与手算结果一致
修改二
先使用m01,m02等将结果线先存储起来, 在进行加法运算时将数据算术缩小
// 定义位宽.以及其signed属性
wire signed [13:0] w01;
wire signed [23:0] s01;
reg signed [37:0] m01;
reg signed [15:0] a1;
// 乘法处理
m01 <= w01 * s01;
m02 <= w02 * s02;
// 加法处理, 加完后算术运算符缩小
a1 <= (m01 + m02) >>> 13;
仿真结果

验证
m01 = w01 * s01 = 3202 * 68270 = 218,600,540
m02 = w02 * s02 = 3762 * -39900 = -150,103,800
a1 = m01 + m02 = (218,600,540 -150,103,800) >>> 13 = 68,496,740 >>> 13 = 8361
计算结果和仿真结果一致
总结
以上两种修改方法目的在于进行位宽匹配,因此在使用运算符的过程中,需要谨慎位宽,防止数据溢出
verilog勘误系列之-->算术运算符运算失败的更多相关文章
- Python3入门系列之-----算术运算符|比较运算符|赋值运算符|逻辑运算符|成员运算符|身份运算符
什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 1 +2 = 3 . 例子中,1 和 1.2 被称为操作数,"+" 称为运算符. Python语言支持以下类型的 ...
- PHP中的运算符---算术运算符、逻辑运算符、赋值运算符、比较运算符
1.算术运算符 常见的算术运算符 运算类型 运算符 举例 结果 取反运算 - -$a 返回$a的负值 加法运算 + $a + $b 返回$a与$b的和 减法运算 - $a - $b 返回$a与$b的差 ...
- Python 算术运算符
Python 算术运算符 运算结果为浮点数 除法:/ 整除: // 求余计算: % 求余运算可以用于固定时间的检测,比如说每10分钟进行一次什么样的操作,则:minute % 10 乘方运算:
- js常用算术运算符与一元运算符在做运算时不同类型的转换规则
/** * 算术运算符:+, -, *, /, % * 当对非number类型的值进行运算(-, *, /, %)时,会将这些值先转换成number再运算,加法'+'运算除外, * 当对非number ...
- ASCLL编码器-算术运算符_四则与取模运算
ASCLL编码器 public static void main(String[] args) { //字符类型变量 char c = 'a'; int i = 1; //字符类型和int类型计算 S ...
- [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [Python] 文科生零基础学编程系列三——数据运算符的基本类别
上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...
- java中的算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符
一.算术运算符 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例 ...
- javascript运算符——算术运算符
× 目录 [1]一元加 [2]一元减 [3]递增[4]递减[5]加法[6]减法[7]乘法[8]除法[9]求余 前面的话 javascript中的算术操作主要通过算术运算符来实现,本文将介绍算术运算符的 ...
- JAVA算术运算符、关系运算符和位运算符
算术运算符 1.java的算数运算符包括+(加).-(减).*(乘)./(除).%(取余),在运算过程中出现的隐式转换原则和C语言一样:2. 高位数据向低位数据转化要使用强制转化: 关系运算符 1.j ...
随机推荐
- PHP使用cookie做浏览历史记录
/** * @param $article文章详情 * @param int $count记录数 * tp须引入cookie类 */ function addHistory($article,$cou ...
- 尴尬:在zoom中找不到会议密码
临时要开一个zoom会议,点击"新会议"进入,然后邀请其他与会者. "会议" - "复制邀请链接", 得到一行这样的信息(会议号已模糊处理) ...
- 6.用户输入和 while 循环--《Python编程:从入门到实践》
6.1 input 函数 函数input()接受一个参数:即要向用户显示的提示或说明.input 将用户输入解释为字符串. name = input("Please enter your n ...
- 使用 BrowserView 的注意事项!!
请看gif:
- 解析Sermant热插拔能力:服务运行时动态挂载JavaAgent和插件
本文分享自华为云社区<服务运行时动态挂载JavaAgent和插件--Sermant热插拔能力解析>,作者:华为云高级软件工程师 栾文飞 一.概述 Sermant是基于Java字节码增强技术 ...
- react实战 系列
react实战 系列(未完结,持续更新中...) 前言 学习 react 的方法,比较常规的是跟着官方文档边看边做,可是 react 的官网教程有点难(至少比 vue 的难),亦或买几本讲基础的或实战 ...
- JVM之直接内存与非直接内存
直接内存 直接内存:概指系统内存,而非堆内存,不指定大小时它的大小默认与堆的最大值-Xmx参数值一致. 非直接内存: 也可以称之为堆内存,运行JVM都会预先分配一定内存,我们把JVM管理的这些内存称为 ...
- C++ 控制台程序的线程分析
在无任何功能代码的情况下运行控制台,会发现有三个线程在运行 SO 的答案指出,在程序一开始运行时,为加快进程启动,windows 会利用多个 CPU 内核更快地初始化. ntdll.dll 线程实际上 ...
- http 与 tcp 的一些学习
HTTP 是一个基于 TCP/IP 通信协议来传递数据的协议,传输的数据类型为 HTML 文件,.图片文件, 查询结果等. HTTP 协议一般用于 B/S 架构().浏览器作为 HTTP 客户端通过 ...
- win32 - wsprintf和wvsprintf
前者很常用, 经常被用来转换为字符串或者拼接字符串. 例子: #include <Windows.h> #include <stdio.h> int main() { int ...