一段来自《Verilog HDL 高级数字设计》的错误Verilog代码

        笔者之前在阅读《Verilog HDL 高级数字设计》时的基4布斯乘法器一文时,就遇到了一段有问题的代码,而这个问题可以用Verilog基础:表达式位宽的确定(位宽拓展)文中的分析完美解决。

always @ (negedge clock) if (Start) begin  expected_value = 0;  case({word1[word_size-1], word2[word_size-1]})0: begin expected_value = word1 * word2; expected_mag = expected_value; end1: begin expected_value = word1*  {`All_Ones,word2[word_size-1:0]}; expected_mag = 1 + ~(expected_value); end2: begin expected_value = {`All_Ones, word1[word_size-1:0]} *word2;expected_mag = 1 + ~(expected_value); end 3: begin expected_value = ({`All_Zeros, 1 + ~word2[word_size-1:0]}) * ({`All_Zeros, 1 + ~word1[word_size-1:0]});expected_mag = expected_value; endendcase

        上面的代码片作用是根据word1和word2的不同算出乘积结果的数值大小和结果的数值绝对值大小。即当两个数都是负数时,即case 3,对两个数都整体取反加一变成正数(对于一个补码,获取其相反数补码的操作是对整体取反加一,包括符号位),然后相乘获得结果。但是里面存在问题,就是word的片选在取反之前会先补零拓展至32位,因为不带位宽的1是32位的,根据位宽拓展原则+和~这两个操作符都是上下文决定操作符,因此会先将word2[word_size-1:0]补零拓展(任何信号的片选都是无符号数)至32位,此时再取反就会变成一个很大的正数,因此会出错。

        对于比如8位有符号数-128和-127,按照上面转换后理想情况是128*127,但是因为错误的位宽拓展,结果变成了4294967168*4294967167。

        解决这个问题的方法很简单,将1改成1'b1即可阻止不必要的位宽拓展,或者用{}拼接操作符包围~word2[word_size-1:0],因为所有在{}符号内的操作数都会变成自决定操作数,位宽由自己决定而不加入上下文环境中,如下所示的为正确的代码。

always @ (negedge clock) if (Start) begin  expected_value = 0;  case({word1[word_size-1], word2[word_size-1]})0: begin expected_value = word1 * word2; expected_mag = expected_value; end1: begin expected_value = word1*  {`All_Ones,word2[word_size-1:0]}; expected_mag = 1'b1 + {~(expected_value)}; end2: begin expected_value = {`All_Ones, word1[word_size-1:0]} *word2;expected_mag = 1'b1 + {~(expected_value)}; end 3: begin expected_value = ({`All_Zeros, 1'b1 + {~word2[word_size-1:0]}}) * ({`All_Zeros, 1'b1 + {~word1[word_size-1:0]}});expected_mag = expected_value; endendcase

        上面的代码中,两种改正措施都实现了,实际上只需要其中一种即可。更多关于Verilog表达式位宽拓展和符号拓展相关的问题,可以查看下面的文章。

Verilog基础:表达式位宽的确定(位宽拓展)icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/128772558?spm=1001.2014.3001.5502Verilog基础:表达式符号的确定icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/article/details/128840843?spm=1001.2014.3001.5502

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

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

相关文章

2311rust,到66版本更新

1.60.0稳定版 基于源码的代码覆盖率 rustc中已稳定支持基于LLVM的覆盖率检测.可用-Cinstrument-coverage重构代码,如: RUSTFLAGS"-C instrument-coverage" cargo build之后,运行生成的二进制文件,它在当前目录中生成一个default.profraw文件.环境变量可覆盖路径和…

Nginx 核心配置文 nginx.conf介绍

Nginx核心配置文件结构 我们知道Nginx的核心配置文件默认是放在/usr/local/nginx/conf/nginx.conf, 读取Nginx自带的Nginx配置文件,我们将其中的注释部分删除掉后,就剩下下面核心内容: worker_processes 1;events {worker_connections 1…

微服务和注册中心

微服务和注册中心是紧密相关的概念,可以说注册中心是微服务架构中必不可少的一部分。 在微服务架构中,系统被拆分成了若干个独立的服务,因此服务之间需要进行通信和协作。为了实现服务的发现和调用,需要一个中心化的注册中心来进…

大健康产业的先行者「完美公司」携手企企通,推进企业采购供应链数字化进程

随着中国经济持续向好,消费升级和美妆步骤增加,美妆和个人护理产品已逐渐成为中国消费者的日用消费品,推动了护肤品和化妆品的销售额增速均超过10%,成为中国整个快速消费品市场中的一颗亮眼明珠。 据国家统计局数据显示&#xff0…

Linux(Ubuntu)安装JDK环境

系统环境 Ubuntu20.04 下载JDK压缩包 前往Oracle官网进行后续下载或单击下载JDK压缩包 下拉找到JDK8,在Linux板块下选择适配系统架构的压缩包文件(后缀为tar.gz),系统架构可通过uname -m命令查看 安装JDK 安装环境通常放在/usr/local下,进入…

【数据结构】栈与队列面试题(C语言)

我们再用C语言做题时,是比较不方便的,因此我们在用到数据结构中的某些时只能手搓或者Ctrlcv 我们这里用到的栈或队列来自栈与队列的实现 目录 有效的括号解题思路:代码实现: 用队列实现栈解题思路:代码实现&#xff1a…

openGauss学习笔记-128 openGauss 数据库管理-设置透明数据加密(TDE)

文章目录 openGauss学习笔记-128 openGauss 数据库管理-设置透明数据加密(TDE)128.1 概述128.2 前提条件128.3 背景信息128.4 密钥管理机制128.5 表级加密方案128.6 创建加密表128.7 切换加密表加密开关128.8 对加密表进行密钥轮转 openGauss学习笔记-12…

网络运维与网络安全 学习笔记2023.11.19

网络运维与网络安全 学习笔记 第二十天 今日目标 STP工作原理、STP高级配置、MSTP工作原理 MSTP配置案例、MSTP负载均衡 STP工作原理 单点故障 PC之间的互通链路仅仅存在1个 任何一个设备或链路出现问题,PC之间都会无法通信 解决方案 增加冗余/备份设备 增加冗…

在Broker端进行消息过滤

在Broker端进行消息过滤,可以减少无效消息发送到Consumer,少占用网络带宽从而提高吞吐量。Broker端有三种方式进行消息过滤。 1.消息的Tag和Key 对一个应用来说,尽可能只用一个Topic,不同的消息子类型用Tag来标识(每条…

springboot引入redisson分布式锁及原理

1.引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version> </dependency>2.配置类创建bean /*** author qujingye* Classname RedissonConfig* Description TOD…

HDFS入门--学习笔记

1&#xff0c;大数据介绍 定义 数据指的是&#xff1a;一种可以被鉴别的、对客观事件进行记录的符号&#xff0c;除了可以是最简单的 数字外&#xff0c;也可以是各类符号、文字、图像、声音等。 通俗地说&#xff0c;数据就是对人类的行为及发生事件的一种记录。 存在的价值…

2023超详细的软件测试八股文(入门篇)

今天给大家分享软件测试面试题入门篇&#xff0c;看看大家能答对几题 一、请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0…

设计模式-创建型模式-单例模式

一、什么是单例模式 单例模式&#xff0c;属于创建类型的一种常用的设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例&#xff08;根据需要&#xff0c;也有可能一个线程中属于单例&#xff0c;如&#xff1a;仅线程上下文内使用同一个实例&#xff09;。 对于系…

本地私域线上线下 线上和线下的小程序

私域商城是一种新型的零售模式&#xff0c;它将传统的线下实体店与线上渠道相结合&#xff0c;通过会员、营销、效率等方式&#xff0c;为消费者提供更加便利和高效的购物体验。私域商城的发展趋势表明&#xff0c;它将成为未来零售业的重要模式&#xff0c;引领零售业的创新和…

【设计模式】聊聊策略模式

策略模式的本质是为了消除if 、else代码&#xff0c;提供拓展点&#xff0c;对拓展开放&#xff0c;对修改关闭&#xff0c;也就是说我们开发一个功能的时候&#xff0c;要尽量的采用设计模式进行将不变的东西进行抽取出来&#xff0c;将变化的东西进行隔离开来&#xff0c;这样…

【开源】基于Vue.js的音乐偏好度推荐系统的设计和实现

项目编号&#xff1a; S 012 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S012&#xff0c;文末获取源码。} 项目编号&#xff1a;S012&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…

【数据库】你听说过矢量数据库吗?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️其他领域】 文章目录 前言什么是向量/矢量数据库嵌入模型使用向量数据库的优势与传统数据库的对比其他方面 AWS 如何支持您的矢量数据库需求&#xff1f;Amazon OpenSearch ServiceAmazon Aurora Pos…

[Docker]记一次使用jenkins将镜像文件推送到Harbor遇到的问题

系统版本&#xff1a; Ubuntu 18.01 私服&#xff1a; Harbor Docker版本&#xff1a; Docker version 18.09.5 首先需要明确的是&#xff0c;即在harbor里项目设置为公开&#xff0c;但是在push的时候还是需要用户验证的&#xff0c;即需要使用docker登录 docker login harbo…

CF1514 C. Product 1 Modulo N [妙妙题]

传送门:CF [前题提要]:感觉这道题是真的妙,解这道题的所有步骤都是一步一步按图索骥来的,有种玩解密游戏的感觉 题目很简单,就是求1~n中最长的子序列,使得这n个数的乘积模n为1. 乍一看很不好解决.那不妨先假设我们挑选了 k k k个数,然后这 k k k个数的乘积为 K K K, K K K模 …

【Unity】流体模拟(更新ing)

Fluid Simulation 参考于 Sebastian Lague 的项目进行分析学习 流体模拟视频链接 文章目录 Fluid Simulation2D流体Simulation2D.cs 2D流体 Simulation2D.cs 流体的边界用OnDrawGizmos设置流体的边界 void OnDrawGizmos(){Gizmos.color new Color(0, 1, 0, 0.4f);Gizmos.Dr…