描述

在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勘误系列之-->算术运算符运算失败的更多相关文章

  1. Python3入门系列之-----算术运算符|比较运算符|赋值运算符|逻辑运算符|成员运算符|身份运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 1 +2 = 3 . 例子中,1 和 1.2 被称为操作数,"+" 称为运算符. Python语言支持以下类型的 ...

  2. PHP中的运算符---算术运算符、逻辑运算符、赋值运算符、比较运算符

    1.算术运算符 常见的算术运算符 运算类型 运算符 举例 结果 取反运算 - -$a 返回$a的负值 加法运算 + $a + $b 返回$a与$b的和 减法运算 - $a - $b 返回$a与$b的差 ...

  3. Python 算术运算符

    Python 算术运算符 运算结果为浮点数 除法:/ 整除: // 求余计算: % 求余运算可以用于固定时间的检测,比如说每10分钟进行一次什么样的操作,则:minute % 10 乘方运算:

  4. js常用算术运算符与一元运算符在做运算时不同类型的转换规则

    /** * 算术运算符:+, -, *, /, % * 当对非number类型的值进行运算(-, *, /, %)时,会将这些值先转换成number再运算,加法'+'运算除外, * 当对非number ...

  5. ASCLL编码器-算术运算符_四则与取模运算

    ASCLL编码器 public static void main(String[] args) { //字符类型变量 char c = 'a'; int i = 1; //字符类型和int类型计算 S ...

  6. [原创]java WEB学习笔记39:EL中的运算符号(算术运算符,关系运算符,逻辑运算符,empty运算符,条件运算符,括号运算符)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. [Python] 文科生零基础学编程系列三——数据运算符的基本类别

    上一篇:[Python] 文科生零基础学编程系列二--数据类型.变量.常量的基础概念 下一篇: ※ 程序的执行过程,就是对数据进行运算的过程. 不同的数据类型,可以进行不同的运算, 按照数据运算类型的 ...

  8. java中的算术运算符、赋值运算符、比较运算符、逻辑运算符、条件运算符

    一.算术运算符 算术运算符主要用于进行基本的算术运算,如加法.减法.乘法.除法等. Java 中常用的算术运算符: 其中,++ 和 -- 既可以出现在操作数的左边,也可以出现在右边,但结果是不同滴 例 ...

  9. javascript运算符——算术运算符

    × 目录 [1]一元加 [2]一元减 [3]递增[4]递减[5]加法[6]减法[7]乘法[8]除法[9]求余 前面的话 javascript中的算术操作主要通过算术运算符来实现,本文将介绍算术运算符的 ...

  10. JAVA算术运算符、关系运算符和位运算符

    算术运算符 1.java的算数运算符包括+(加).-(减).*(乘)./(除).%(取余),在运算过程中出现的隐式转换原则和C语言一样:2. 高位数据向低位数据转化要使用强制转化: 关系运算符 1.j ...

随机推荐

  1. 【架构师视角系列】Apollo配置中心之Server端(ConfigSevice)(三)

    目录 声明 配置中心系列文章 一.通知机制 二.架构思考 三.源码剖析 1.配置监听 1.1.建立长轮询 1.1.1.逻辑描述 1.1.2.时序图 1.1.3.代码位置 1.1.3.1.Notific ...

  2. Python数组合并和数组分割(数组拆分)

    数组的合并和拆分 ## 将数组按照固定长度进行拆分,返回一个二维数组 def list_split(source_list, n): return [source_list[i:i+n] for i ...

  3. ASP.NET Core 配置 - 创建自定义配置提供程序

    ASP.NET Core 配置 - 创建自定义配置提供程序 在本文中,我们将创建一个自定义配置提供程序,从数据库读取我们的配置.我们已经了解了默认配置提供程序的工作方式,现在我们将实现我们自己的自定义 ...

  4. JS Leetcode 213. 打家劫舍 II 题解分析,在动态规划基础上感受分治算法的魅力

    壹 ❀ 引 本题来自LeetCode 213. 打家劫舍 II,难度中等,属于前面我们做过的198. 打家劫舍的升级版,难度同样为中等,题目描述如下: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内 ...

  5. SpringBoot相关注解使用

    @MapperScan注解和@Mapper @Mapper常用在相应的 *Mapper类上,但是每个类都使用相对麻烦,所以后来用@MapperScan替代 ,@MapperScan注解使用在启动类上. ...

  6. 图文并茂之AES加密

    本文改编自:http://www.sohu.com/a/198681357_505794 假设有一个发送方在向接收方发送消息.如果没有任何加密算法,接收方发送的是一个明文消息:"我是小灰&q ...

  7. Java 使用SimpleDateFormat格式化日期

    Java 使用SimpleDateFormat格式化日期,这里只涉及最实用的方面. 用途 用于格式化日期和解析日期类型字符串. formatting (date -> text), parsin ...

  8. django1.11和django2.2中namespace的用法

    django1.11中namespace用法 urlpatterns = [ url(r'^user/', include('user.urls', namespace='user')) ] djan ...

  9. linux虚拟机初始配置

    1- CentOS7配置静态IP地址: iface="网络接口名"cd /etc/sysconfig/network-scripts/; sed -i 's/^/#/' ifcfg ...

  10. 如何运维多集群数据库?58 同城 NebulaGraph Database 运维实践

    图计算业务背景介绍 我们为什么选择 NebulaGraph? 在公司各个业务线中,有不少部门都有着关系分析等图探索场景,随着业务发展,相关的需求越来越多.大量需求使用多模数据库来实现,开发成本和管理成 ...