基于FPGA的数字信号处理(7)--如何确定Verilog表达式的位宽

一般规则

很多时候,Verilog中表达式的位宽都是被隐式确定的,即使你自己设计了位宽,它也是根据规则先确定位宽后,再扩展到你的设计位宽,这常常会导致结果产生意想不到的错误。比如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a,b;
reg [1:0] c1,c2;

initial begin
    a = 4'b0111;
    b = 4'b1111;
	c1 = a & b;
	c2 = a && b;
end

endmodule

结果是这样的:

image-20240403085413360

a & b的结果本来应该是4‘b0111 ,但是c1只有2位,所以高位被截断,导致c1为2’b11;而a && b 的结果本来是1位的1’b1,但是c2有2位,所以会在高位补0,导致c2为2’b01。

类似的情况还有很多,为了减少设计出错的可能性,有必要探究一下表达式的位宽确定规则。

Verilog语法规定了如下的确定表达式位宽的规则:

  • 表达式的位宽由表达式中的**操作数(operands)或表达式所处的上下文(context)**决定。

  • **自决定表达式(self-determined expression)**就是表达式中所有操作数的位宽完全由自己决定。

  • **上下文决定表达式(context-determined expression)**就是表达式中所有操作数的位宽由整个表达式上下文环境中最大的位宽决定。


自决定表达式

这一类表达式的位宽都是根据表达式自身的位宽和运算结果来决定的。具体规则如下:

image-20240403090904048

1、无位宽常数

这种情况它的位宽等同于整数integer,在大多数编译器中,integer的默认位宽都为32位。例如modelsim环境下的测试:

`timescale 1ns/1ns
module tb_test();

initial begin
    $display("answer = %b", (1));	//以2进制形式打印
end

endmodule

打印结果是32位宽的 “1”:

answer = 00000000000000000000000000000001

2、给定位宽常数

没什么好说的,位宽就是给定的这个数,比如 4‘d1的位宽就是4。例如:

//以2进制形式打印`timescale 1ns/1ns
module tb_test();

reg [3:0] a;

initial begin
	a = 4'd1;
	$display("answer = %b", a);	//以2进制形式打印
end

endmodule

打印结果:

answer = 0001

3、运算(1)

i 和 j 做以下运算:+ - * / % & | ^ ^~ ~^ 时,位宽等于 i 和 j 中位宽较大者的位宽。很好理解,这些运算就是常见的 加减乘除取模 与或异或同或 运算。例如4bits数和5bits数相加:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;
reg [4:0] b;

initial begin
	a = 4'd1;
	b = 5'd1;
	$display("answer = %b", (a + b));
end

endmodule

打印结果是5bits:

answer = 00010

4、运算(2)

对 i 做以下运算: + - ~ 时,位宽等于它本身。也很好理解,就是正负表达和取反,所以位宽肯定不会改变。例如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;

initial begin
	a = 4'b1001;
    $display("answer = %b", (~a));	//取反
end

endmodule

打印结果仍是4bits:

answer = 0110

5、比较

二个数的比较结果只有 不是,所以位宽只需要1位,例如:=== !== == != > >= < <=。例如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a,b;

initial begin
	a = 4'd5;
	b = 4'd3;
	$display("answer = %b", (a > b));
end

endmodule

打印结果是1bit:

answer = 1

6、逻辑与、逻辑或

逻辑与&& 和 逻辑或 || 的结果也只有1bit。

`timescale 1ns/1ns
module tb_test();

reg [3:0] a,b;

initial begin
	a = 4'd5;
	b = 4'd3;
	$display("answer = %b", (a && b));
end

endmodule

打印结果是1bit:

answer = 1

7、规约运算(Reduction)

下面这些规约运算的结果只有1位:& ~& | ~| ^ ~^ ^~ !。规约运算就是对数据本身的所有位做同样的对应的运算,例如规约与(该数的所有位相与):

`timescale 1ns/1ns
module tb_test();

reg [3:0] a,b;

initial begin
	a = 4'b1101; 
	b = &a;		//1 & 1 & 0 & 1
	$display("answer = %b", (b));
end

endmodule

打印结果是1bit:

answer = 1

8、移位和乘方

移位和乘方运算(>> << ** >>> <<<)的结果位宽是该数本身位宽。例如移位:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;

initial begin
	a = 4'b1011; 
	$display("answer = %b", (a >> 1));
end

endmodule	

打印结果是4bits:

answer = 0101

乘方运算的结果有可能会溢出,例如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a,b;

initial begin
	a = 4'd3; 
	b = 4'd3;
	$display("answer = %b", (a**b));
end

endmodule

打印结果是4bits:

answer = 1011

3**3的结果原本是27,即1_1011,高位被截断后,成了4bits的1011。

9、条件表达式

条件表达式(i ? j : k)的位宽等于 j 和 k 中的位宽较大者。例如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;
reg [5:0] b;
reg		  c;

initial begin
	c = 1;
	a = 4'b1011; 
	$display("answer = %b", (c ? a : b) );
end

endmodule	

打印结果是6bits:

answer = 001011

尽管c为真,所以该式的结果是a,但是位宽却等于更宽的b,所以结果的高位会补2个0,扩展到6bits。

10、拼接

第一种拼接:{i,…,j},位宽为二者之和。例如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;
reg [5:0] b;

initial begin
	a = 4'b1011; 
	b = 6'b001011; 
	$display("answer = %b", ({a,b}) );
end

endmodule	

打印结果是4 + 6 = 10bits:

answer = 1011001011

第二种拼接:{i{j,…,k}},位宽为二者之和与系数的乘积。例如:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;
reg [5:0] b;

initial begin
	a = 4'b1011; 
	b = 6'b001011; 
	$display("answer = %b", ({2{a,b}}) );
end

endmodule	

打印结果是2*(4 + 6) = 20bits:

answer = 10110010111011001011


上下文决定表达式

上下文决定表达式其实就是各种自决定表达式的集合,所以需要视具体情况而具体分析。看一个例子:

`timescale 1ns/1ns
module tb_test();

reg [3:0] a;
reg [5:0] b;
reg [15:0] c;
	
initial begin
	a = 4'hF;	//15
	b = 6'hA;	//10
	
	$display("a*b=%b", a*b);	//10*15
	
	c = {a**b}; 				//15^10
	$display("a**b=%b", c);
	
	c = a**b; 					//15^10
	$display("c=%b", c);
end	

endmodule

打印结果:

a*b=010110

a**b=0000000000000001

c=1010110001100001

  • a*b原本是15×10=150,即1001_0110,但是结果的位宽是a、b中的较大位宽(6bits),所以被结果截断到 01_0110;
  • a**b原本是15^10=576,650,390,625,即1000011001000011000010101010110001100001,但是乘法的结果位宽是a的位宽(4bits),所以结果被截断到 0001;然后和 0 做拼接,相当与位宽没变,所以结果仍是0001,最后赋值给c,c的位宽为16,所以需要在高位补0,最终结果为0000000000000001
  • 第三个和第二个的区别在于没有拼接运算符,a**b的位宽结果取决于上下文环境,即c的位宽。所以在计算时,a和b都会被先拓展到16位,然后再计算结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GD32F470内存不能设置512KB

最近研究了下GD32F470芯片手册&#xff0c;发现标称的内存512KB&#xff0c; 其实是连TCMSRAM一起算的&#xff0c;即TCMSRAMSRAM0SRAM1SRAM2ADDSRAM 512KB, 其中SRAM0 - ADDSRAM 这段内存地址是连续的&#xff0c;从地址0x20000000开始。而TCMSRAM地址却是从0x10000000 - 0x1…

新建stm32工程模板步骤

1.先使用keil新建一个project的基本代码 2.stm32启动文件添加 将stm32的启动文件&#xff0c;在原工程当中新建一个Start文件夹把相关的启动文件放到文件夹当中 然后还需要找到下面三个文件 stm32f10x.h是stm32的外设寄存器的声明和定义&#xff0c;后面那两个文件用于配置系…

Unity 实现新手引导遮罩

Unity 复写OnPopulateMesh 实现新手引导遮罩、包含点击事件触发区域判断 https://download.csdn.net/download/shenliang34/89247117

git 第一次安装设置用户名密码

git config --global user.name ljq git config --global user.email 15137659164qq.com创建公钥命令 输入后一直回车 ssh-keygen -t rsa下面这样代表成功 这里是公钥的 信息输入gitee 中 输入下面命令看是否和本机绑定成功 ssh -T gitgitee.com如何是这样&#xff0c;恭喜…

【算法系列】哈希表

目录 哈希表总结 leetcode题目 一、两数之和 二、判定是否互为字符重排 三、存在重复元素 四、存在重复元素 II 五、字母异位词分组 六、在长度2N的数组中找出重复N次的元素 七、两个数组的交集 八、两个数组的交集 II 九、两句话中的不常见单词 哈希表总结 1.存储数…

HC-SR04超声波测距

什么是超声波 超声波是频率高于20000赫兹的声波。 超声波是一种特定频率范围内的声波&#xff0c;其特点在于频率高于人耳能够感知的上限&#xff0c;即超过20千赫兹&#xff08;Hz&#xff09;。这种高频率的声波具有一些独特的性质&#xff1a; 方向性好&#xff1a;超声波…

托普利兹矩阵(T矩阵)及其应用(Matlab demo测试)

托普利兹矩阵&#xff08;T矩阵&#xff09;及其应用&#xff08;Matlab demo测试&#xff09; 1. 概念2. Matlab简单测试2.1 生成测试2.2 基本性质及原理2.3 性质验证 3. 其他应用总结3.1 其他性质3.2 文献阅读看到的 参考资料 1. 概念 托普利兹矩阵&#xff0c;简称为T型矩阵…

可视化大屏在真实场景的效果,绝对震撼,不要再嘲笑其作用了

hello&#xff0c;我是大千UI工场&#xff0c;本地带来一批可视化大屏现场效果图&#xff0c;非常震撼&#xff0c;给大家带来身临其境的感受&#xff0c;欢迎关注点赞&#xff0c;有需求请私信。 有人可能会认为可视化大屏没有太多价值&#xff0c;可能是因为以下几个原因&am…

npm 安装 pnpm 时 报错 npm ERR! Unexpected token ‘.‘

问题 一个项目用的是 pnpm 安装的依赖&#xff0c;node 的版本是 16.16.0&#xff0c;nvm 的版本是 1.1.7&#xff0c;然后全局安装 pnpm 报错如下&#xff1a; 解决 我看网上的一些解决方案是说 nvm 版本过低导致&#xff0c;下面我们按照这个方向处理。 实首先下载 nvm-up…

Linux 文件管理命令Lawk wc comm join fmt

文章目录 2.Linux 文件管理命令2.44 awk&#xff1a;模式匹配语言1&#xff0e;变量2&#xff0e;运算符3&#xff0e;awk 的正则4&#xff0e;字符串函数5&#xff0e;数学函数案例练习 2.45 wc&#xff1a;输出文件中的行数、单词数、字节数案例练习2.46 comm&#xff1a;比较…

康姿百德学生床垫价格合理,为孩子提供健康睡眠环境

康姿百德集团公司学生床垫&#xff0c;关爱孩子的睡眠和健康 每个孩子都是家长新中的宝贝&#xff0c;在孩子健康成长的道路上&#xff0c;良好的睡眠起着至关重要的作用。而选择一款优质的床垫&#xff0c;不仅能帮助孩子更快进入梦乡&#xff0c;还能促进他们的健康发育。在…

最好的数据恢复应用程序:哪个是您首选的最佳文件恢复软件?

如今&#xff0c;智能设备无处不在&#xff0c;导致我们中的许多人无可辩驳地被大量数据所包围。随着大量数据的涌入得到一致的处理&#xff0c;无意中删除重要文档或不同文件&#xff0c;存在丢失这些数据的迫在眉睫的危险。 最好的数据恢复应用程序 对于每一个最好的数据恢复…

Python 与 TensorFlow2 生成式 AI(三)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;使用 GAN 进行风格转移 神经网络在涉及分析和语言技能的各种任务中正在取得进步。创造力是人类一直占有优势的领域&…

Stm32CubeMX 为 stm32mp135d 添加网卡 eth

Stm32CubeMX 为 stm32mp135d 添加网卡 eth 一、启用设备1. eth 设备添加2. eth 引脚配置2. eth 时钟配置 二、 生成代码1. optee 配置2. uboot 配置3. linux 配置 bringup 可参考&#xff1a;Stm32CubeMX 生成设备树 一、启用设备 1. eth 设备添加 我这里只启用一个eth设备&…

uniapp 桌面应用插件 Ba-Launcher

简介&#xff08;下载地址&#xff09; Ba-Launcher 可以让你的应用成为简单的桌面应用&#xff0c;如需扩展功能&#xff0c;请联系我。 截图展示 可关注博客&#xff0c;实时更新最新插件&#xff1a; uniapp 常用原生插件大全 使用方法 使用方法也很简单&#xff0c;在插…

GPT3 终极指南(一)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 GPT-3&#xff0c;或者说是 Generative Pre-trained Transformer 3&#xff0c;是由 OpenAI 开发的基于 Transformer 的大型语言模型…

LLama3最新医疗大模型安装与应用指南

为什么要介绍医疗模型&#xff0c;因为平时我们工作繁忙&#xff0c;可能身体不舒服也会&#xff0c;拖着到不得已的时候才到医院&#xff0c;特别是老年人怕麻烦&#xff0c;拖延更严重。如果有了这些模型&#xff0c;我们可以向这些模型提问&#xff0c;给一个初步的了解&…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

算法:双指针题目练习

目录 题目一&#xff1a;移动零 题目二&#xff1a;复写零 题目三&#xff1a;快乐数 题目四&#xff1a;盛最多水的容器 题目五&#xff1a;有效三角形的个数 题目六&#xff1a;和为s的两个数字(剑指offer) 题目七&#xff1a;三数之和 题目八&#xff1a;四数之和 常…

有关CSS中排版常见问题(清除默认样式问题 + 元素居中问题 + 元素之间的空白问题 + 行内块的幽灵空白问题)

前言&#xff1a;在练习CSS排版的时候&#xff0c;我们经常会遇到一些排版上的问题&#xff0c;那么我们如何去解决这些问题呢&#xff1f;本篇文章给出了一些新手在练习排版时候可能会遇到的问题的解决方案。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…