Verilog基础:位宽拓展和有符号数运算的联系

发布时间:2026/10/27 1:12:34

Verilog基础:位宽拓展和有符号数运算的联系 相关文章Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html我们以Verilog官方手册中的几个经典例子来看当有符号数、无符号数、位宽拓展和算术运算混在一起时到底会发生什么见下图。很多人刚开始学Verilog时最容易犯的一个错误就是把HDL里的“数”直接当成数学里的整数来看待认为-12/3就一定等于-4但在Verilog里表达式的结果除了和数值本身有关还和位宽、是否有符号、操作数类型以及上下文决定的扩展方式密切相关。也就是说Verilog不是简单地先算数值再决定如何存放而是会先根据规则确定操作数的位宽和符号属性再进行运算最后再把结果赋给目标变量。在阅读以下内容前需要知道对于有符号数和无符号数数字本身是不会改变的改变的只是对这串数字的解释有符号数将最高位当做符号位剩下的位当做是补码无符号数则没有符号位。没有位宽和基数的常数被当做32位有符号数算术运算符只有在操作数都为有符号数时才会执行有符号数计算结果才是有符号数。例3、2、1均被当做有符号数3/-1是有符号数除法结果为-3的补码2d3/-1是无符号数除法结果为0。我们定义了一个32位的有符号整数变量(variable)一个16位的无符号默认寄存器变量一个16位的有符号(signed)寄存器变量。后面这些例子的关键就在于同一个值放到不同类型的变量里或者参与不同上下文下的表达式时解释方式会完全不同。intA-4d12;首先我们发现赋值表达式左端的intA是32位的根据上下文位宽拓展规则右端的4位常数会被首先拓展至32位注意此时右端的数是一个无符号数因为在d前没有s符号所以会被高位补0拓展为000...01100但由于常数前又有取负运算符所以最后表达式的结果为111...10100符号位取反其他位取反加一即-12的32位补码但此时的表达式结果并不被当做有符号数-12来看而是解释为一个无符号的大正数这同样是因为d前没有s符号。最后将表达式的值赋值给有符号整数变量intA所以这个原来的大整数又被解释为有符号数最后intA的值还是-12。regAintA/3;赋值表达式右端的结果根据有符号数除法的规则得到的结果是-4的32位补码111...11100且解释为有符号数即但之后将表达式的值赋值给了16位无符号寄存器变量根据截断法则高16位被直接截断包括符号位低16位被赋值给regA且被解释为无符号数即regA得到的是1111111111111100即65532。regA-4d12;与intA-4d12;同理赋值表达式右端的无符号4位常数被补0拓展到regA的宽度即16位的0000000000001100又因为常数前有取负运算符所以最后右端表达式的结果为1111111111110100即-12的16位补码但此时的右端表达式结果并不被当做有符号数-12来看而是解释为一个无符号的大正数这是因为d前没有s符号。最后将右端表达式的值赋值给无符号寄存器变量regA被解释为无符号数,即regA得到的是1111111111110100即65524。intAregA/3;赋值表达式右端的结果根据无符号数除法的规则得到的结果是无符号数2184132位因为赋值表达式左侧的intA和常数3都是32位然后将右侧表达式的值赋值给32位有符号整数变量intA但由于此时32位无符号数21841的最高位为0被解释为正数所以最后intA得到的结果还是21841。intA-4d12/3;赋值表达式左端的intA和右端常数3均为32位所以无符号常数4d12首先被补0拓展至32位000...01100然后首先执行取负运算符运算结果为32位无符号数111...101004294967284即然后运算无符号数除法/3得到右端表达式结果为32位无符号数1431655761。然后将右侧表达式的值赋值给32位有符号整数变量intA但由于此时32位无符号数1431655761的最高位为0被解释为正数所以最后intA得到的结果还是1431655761。regA-12/3;此时右端两个常数均被当做32位有符号数然后执行有符号数除法最后得到的结果为有符号数-4的32位补码111...11100然后将值赋给16位无符号寄存器变量regA高16位被直接截断包括符号位低16位被赋值给regA且被解释为无符号数即regA得到的1111111111111100即65532。regS-12/3;右端运算同上所述最后将值赋给16位无符号寄存器变量regS高16位被直接截断包括符号位低16位被赋值给有符号寄存器变量regS且被解释为有符号数即regS得到的1111111111111100即-4。regS-4sd12/3;赋值表达式右侧的3位32位有符号数所以有符号数12被符号拓展为32位有符号数111...11100然后执行取负运算符运算结果为有符号数4的32位补码000...00100然后执行有符号数除法结果为32位有符号数1将其赋值给有符号寄存器变量regSregS的值仍然是1。以上的关键在于符号拓展是在所有运算开始前就确定的否则你会疑惑为什么-4sd12是先被符号拓展至32位111...11100再被取负为000...00100而不是先取负为0100再符号拓展至32位000...00100。关于位宽问题更深入的讨论可以看下面的文章。Verilog基础表达式位宽的确定位宽拓展_verilog位宽_日晨难再的博客-CSDN博客我们可以首先找到被加入上下文环境的操作数a和b作为操作符的操作数是上下文决定的(ab)作为整体位与移位操作符的左边也是上下文决定的(ab)1作为整体是操作符的右操作数也是上下文决定的因此answer因为ab因为三层上下文嵌套都被加入上下文环境中这三个变量的位宽都是一样的所以他们三个在运算前不会有拓展。因此首先执行ab根据规则结果为16位进位被丢失然后再右移一位最高位补0最后赋值给同为16位的answer。很多时候方法很简单。改成ab17b0;_verilog位宽https://blog.csdn.net/weixin_45791458/article/details/128772558?spm1001.2014.3001.5501
延伸阅读

更多相关文章

2026/10/27 1:12:34

数字IC前端学习笔记:锁存器Latch的综合

相关文章 数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 锁存器的生成方式有两种,一种是有意的,而另一种是无意的。无意生成的锁存器会浪费硅片面积,因为在大部分FPGA资源中&#x…

2026/10/27 1:12:34

Linux:df、du容量查询命令

相关文章 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html 一、df 该指令能够列出文件系统的整体磁盘使用量。 用法:df [-ahikHTm] [dirname/filename] -a:列出所有的文件系统,包括系统特有的/proc等文件系统&#xff0…

2026/10/27 1:07:34

嵌入式驱动开发实战:从字符设备到设备树与并发控制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 2:17:38

ISOLATEGPT架构:LLM智能体的执行隔离与安全协同方案

1. 项目概述:ISOLATEGPT架构的核心价值在大型语言模型(LLM)驱动的智能体系统(Agentic Systems)中,执行隔离(Execution Isolation)正成为保障系统可靠性的关键技术瓶颈。ISOLATEGPT架…

2026/10/27 2:17:38

激光雷达SLAM技术:模块化学习与工程实践指南

1. SLAM技术概述与学习痛点激光雷达SLAM(Simultaneous Localization and Mapping)作为机器人自主导航的核心技术,已经广泛应用于自动驾驶、服务机器人等领域。但很多学习者在入门时会遇到一个典型困境:看了大量论文和教程后&#…

2026/10/27 2:17:38

GB/T 2260行政区划代码SQL表设计与省市区三级联动查询

简介:面向从事地理信息、人口统计、物流规划与数据库开发的人员,这份GB/T 2260全国行政区划代码数据集提供了一套标准化的四级区划编码参考,覆盖省/直辖市、市、县及乡镇街道等层级,可用于搭建行政区划表、做数据匹配与地域维度分…

2026/10/27 2:17:37

PMD规则集配置实战:从XML骨架到自定义规则与分层治理

简介:面向Java开发者与项目代码质量管理场景的PMD规则配置包,聚焦静态检查规则的定制与落地。包内共10个文件,以9个XML规则配置和1份TXT说明为主,XML承担规则集、规则、类别、参数及排除项等定义,TXT便于快速了解用法&…

2026/10/27 2:12:37

Hadoop伪分布式实验:Linux环境、HDFS与WordCount排错

简介:这份大数据实验一指导文档面向刚接触大数据课程的学生与自学者,围绕 Linux 虚拟机搭建、常用 Shell 命令和 Hadoop 伪分布式环境三条主线展开,帮助读者在单机上补齐后续实验所需的基础操作能力。压缩包仅含 1 个 docx 文件,约…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑