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

news2024/11/15 11:53:08

        笔者之前在阅读《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; end
        1: begin expected_value = word1*  {`All_Ones,word2[word_size-1:0]}; 
            expected_mag = 1 + ~(expected_value); end
        2: 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; end
      endcase

        上面的代码片作用是根据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; end
        1: begin expected_value = word1*  {`All_Ones,word2[word_size-1:0]}; 
            expected_mag = 1'b1 + {~(expected_value)}; end
        2: 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; end
      endcase

        上面的代码中,两种改正措施都实现了,实际上只需要其中一种即可。更多关于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.coloradmin.cn/o/1231524.html

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

相关文章

【代码随想录】算法训练计划27

回溯 1、39. 组合总和 题目: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的…

Java语法基础

回顾 1、了解编程语言 2、编程语言分类 ​ 机器语言、汇编语言、高级语言 3、了解java ​ 跨平台(.class文件) .java(源文件) ​ .java ----编译---->.class 4、jdk 、jre、jvm 5、开发 写代码 eclipse idea 记事本 …

CTFHub Git泄露

Log 前言 根据题目描述,这个题目需要使用到工具 GitHack 来完成,而 CTFHub 上提供的工具需要在 python2 环境中执行,注意 python3 环境无法使用。 GitHack准备(kali Linux) 打开虚拟机 sudo su 以管理员的身份运行…

企业经营好不好?看看官方评价指标(适电子元、器件制造业)

一家企业经营的到底好不好?有没有评价标准呢?这里我们不妨参考一下国资委对全国各个行业的考核指标,对照一下自己的企业,就比较清楚自身企业的经营水平了。另外,我们也希望使用ODOO-ERP业财一体系统的企业,…

探索标准数字隔离ACML-7400-500E:主要特性与应用

ACML-7400-500E标准数字隔离是现代电子系统中的重要组成部分的一员,提供安全可靠的数字信号分离方法。本文深入探讨了该隔离器的核心特性,讨论了其双电源电压兼容性、宽工作温度范围、高速数据功能以及各种安全认证。 双电源电压兼容性 标准数字隔离器…

sapjco3.dll has version “721.619“, but required is at least version “721.913“

context with path [] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.ExceptionInInitializerError: Native library sapjco3 is too old. Found library C:\Windows\System32\sapjco3.dll has version “721.619”, but required is at least …

[uni-app]记录APP端跳转页面自动滚动到底部的bug

文章目录 bug描述原因分析: 处理方案 bug描述 1.点击的A页面, 跳转到了B页面, 第一次页面正常显示 2.从B页面返回A页面 3.A页面不进行任何操作,再次点击A页面进入B页面 4.B页面自动滚动到底部. 原因 看一段A页面代码 let that thisthis.defaultScrollTop uni.getStorageSy…

JAVA小游戏拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下: package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …

淘宝商品详情数据接口,淘宝商品优惠券数据接口,淘宝API接口

随着电商行业的快速发展,淘宝作为国内最大的电商平台之一,不断探索和创新,以满足不断变化的用户需求和商家需求。其中,淘宝API接口便是其创新的一个重要方面。本文将深入探讨淘宝API接口的作用、功能、优势以及使用方法&#xff0…

数字化文化的守护之星:十八数藏的非遗创新之道

在数字时代的浪潮中,十八数藏犹如一颗璀璨的守护之星,为传统文化注入了新的生命力。这个非遗创新项目以数字化为工具,以守护为使命,开辟了文化传承的新航道。 十八数藏是文化数字守护的引领者,通过数字技术&#xff0…

【开源】基于Vue.js的计算机机房作业管理系统的设计和实现

项目编号: S 017 ,文末获取源码。 \color{red}{项目编号:S017,文末获取源码。} 项目编号:S017,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

NX二次开发UF_CAM_ask_config_file 函数介绍

文章作者:里海 来源网站:里海NX二次开发3000例专栏 UF_CAM_ask_config_file Defined in: uf_cam.h int UF_CAM_ask_config_file(const char * * cam_config_filename ) overview 概述 This function provides the name of the CAM configuration fil…

使用Python实现几种底层技术的数据结构

使用Python实现几种底层技术的数据结构 数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这…

Labview中for循环“无法终止”问题?即使添加了条线接线端,达到终止条件后,仍在持续运行?

关键: 搞清楚“运行”和“连续运行”两种运行模式的区别。 出现题目中所述问题,大概率是因为代码运行在“连续运行“模式下。 可以通过添加 探针 的方式,加深理解!

BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络的背景生物学原理 二、BP神经网络模型 2.1 BP神经网络的结构 2.2 BP神经网络的激活函数 三、BP神经网络的误差函数 四、BP神经网络的训练 4.1 BP神经网络的训练流程 4.2 BP神经网络的训练流…

【并发编程】Synchronized的使用

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

华东理工李洪林课题组开发 Macformer,加速大环类药物发现

大环类化合物是指由 12 个以上原子组成的小分子或肽。相较于其他小分子化合物,大环类化合物在结构和性能上有着诸多优势,也因此被视为各类靶点的潜在治疗药物。 基于药物化学合成的大环类似物是大环类药物的一个主要来源。然而,由于合成方法…

力扣刷题-二叉树-完全二叉树的节点个数

222.完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数。 示例 1: 输入:root [1,2,3,4,5,6] 输出:6 示例 2: 输入:root [] 输出:0 示例 3: 输入:root [1]…

拼图游游戏代码

一.创建新项目 二.插入图片 三.游戏的主界面 1.代码 package com.itheima.ui;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Random;import javax.swing…

【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

前言 在上一篇文章中,我们学习了IoC与DI的相关概念与原理,现在让我们 以HelloWorld为例,编写一个程序,让创建对象的工作由Spring帮助我们创建。 一同感受一下Spring框架带给我们开发的便捷性。 文章目录 前言一、编写Java类二、传…