wire类型的缺省值(verilog表达式的数据类型)

本文目录
- verilog表达式的数据类型
- verilog中reg和wire类型的区别和用法
- wire型能有二维数组嘛
- reg型和wire型信号有什么本质的区别
- verilog中reg定义又说重复,不定义又说非法
- Verilog 数据类型
verilog表达式的数据类型
1. 常量
verilog有四种基本值:
·0表示逻辑0或“假”;
·1表示逻辑1或“真”;
·x表示未知;
·z表示高阻。
x和z在这里是不分大小写的。也就是说,0x1z和0X1Z是相同的。
1.1 整型常量
整形常量即整数,Verilog的整数有两种书写格式:
·十进制数格式和基数格式。
(1)十进制数格式是一个可以带正负号的数字序列,代表一个有符号数。
(2)基数格式的数通常都是无符号数。形式如下:
’base value
size定义常量的位数(长度),这是可选项;base是基数,规定数据的进制,可以是o(八进制)、B、H和D。value是一个数字序列,其形式应与base定义的形式相符。
7’Hx //7位x(扩展的x),即xxxxxxx
4’HZ //4位Z,即ZZZZ
如果size定义的长度大于数字的实际长度,通常在数据序列的高位补0.但是如果这个数字序列最左边一位是x或z,就用x或z在左边补位。如果定义的长度小于数字序列的实际长度,这个数字序列最左边超出的位将被截断。
1.2 实数型常量
在verilog中,实数就是浮点数,实数的定义方式有两种:
(1)十进制格式,由数字和小数点组成。
(2)指数格式,由数字和字符e(E)组成,e(E)的前面必须要有数字而且后面必须为整数:
23_5.1e2 //其值为23510.0,忽略下划线
3.6E2 //其值为360.0
这里的e可以理解为10。
1.3 字符串型常量
字符串常量是由一对双引号括起来的字符序列。
2 变量
2.1 线网型变量
线网表示元件之间的物理连线,它 不能存储数据。线网是被驱动的,可以用连续赋值或把元件的输出连接到线网等方式给线网提供驱动,给线网提供驱动的赋值元件就是“驱动源”,线网的值由驱动源决定。如果没有驱动源连接到线网,线网的缺省值为Z。
verilog共有11种线网类型:wire tri wor trior wand triand trireg tril tri0 supply0 supply1。
线网的声明语法形式:net_kindnet1, net2, .........,netN;
net_kind是线网类型;定义线网宽度????????的最高位和最低位,这一项是可选的,默认为一位;netN是线网变量的名称。线网可以有多个驱动源,每个驱动源都会给线网赋值,出现这种情况时,线网的取值由线网类型决定。
关于位宽的一点补充:
最高有效位(MSB)
指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)。汇编中,比如8位2进制数10000001,其中第一个1是MSB,第二个1是LSB。在计算机计算的时候用于判断的比如如果是整数那么小数点(实际上是没有小数点的,但就把那一位和下一位之间看作有)在LSB后面,如果是小数小数点在MSB后面,其中MSB在有符号数中又是符号位。
在这11种线网中,经常用到的是前六种,下面给出其详细的用法举例。
(1)wire和tri线网
有些问题,先跳过!
(2)wor和trior线网
·wor线或 ·trior三态线或
(3)wand和triand线网
·wand线与 ·triand线与
(4)trireg线网(三态寄存器)
这种线网可以存储数值,可用于电容节点的建模。当没有驱动源时,三态寄存器线网的缺省初始值为x。当它的所有驱动源都处于高组态时,三态寄存器保存的值是作用在该线网上的最后一个值。
(5)tri0和tri1线网
·tri0 三态0 ·tri1 三态1
这两个的特征是,若无驱动源(z可视为无驱动源),它的值为0(tri0)或1(tri1)。
(6)supply0 supply1线网
·supply0用于对“地”建模,即低电平。
·supply1用于对电源建模,即高电平1。
2.2 寄存器型变量
寄存器表示一个抽象的数据存储单元,可以通过赋值语句改变寄存器内存储的值。寄存器只能在always语句和initial语句中赋值,always语句和initial语句是verilog提供的功能强大的结构语句。在未被赋值时,寄存器的缺省值为x。
verilog共有五种寄存器类型:reg integer time real realtime。
2.2.1 reg寄存器
(1)reg寄存器的类型
reg寄存器是最常用的寄存器类型,这种寄存器中只能存放无符号数。如果给reg中存入一个负数,通常会被视为正数。
(2)用reg声明存储器
在verilog中不能直接声明存储器,存储器是通过寄存器数组声明的,即用reg声明。可以说,存储器是由若干个寄存器组成的,通过定义单个寄存器的位宽和寄存器的个数可以决定存储器的大小。
存储器声明如下:
reg , ...............
其中msb、lsb定义了存储器单个寄存器的位宽,memory1和memory2是存储器名;upper和lower分别定义了这两个存储器的大小。
2.2.2 integer寄存器类型
integer是整数寄存器,也是verilog中最常用的变量类型,这种寄存器中存储有符号整数值。integer即可以定义单个寄存器,也可以用来定义一个寄存器组。整数寄存器中最少可以容纳32位的数,但是不能作为位向量访问。
2.2.3 time寄存器类型
time类型寄存器用于存储和处理时间,通常用在系统函数$time中。其声明形式如下:
time time_id1, time_id2, ..........,time_idN;
msb lsb是规定范围界限的常量,这个范围将决定寄存器内能存储时间值的个数,如果未定义界限,默认值为1,那么每个寄存器只能存储一个至少64位的时间值。time类型的寄存器只存储无符号数。
2.2.4 real和realtime寄存器类型
real(实数型寄存器)和realtime(实数型时间寄存器)一般用于在测试模块中存储仿真时间,二者声明形式完全相同。real变量的缺省值为0,当将值x和z赋给real型寄存器时,这些值被当作0。
3. 表达式
3.1 操作数
操作数即运算对象,位于操作符左右两侧。操作数有以下8种类型:常数、参数、线网、寄存器、位选择、部分选择、存储器单元、函数调用。
(1)常数:表达式中经常出现常数,一般是做运算或赋值。表达式中的整数值可以是有符号数或无符号数。如果表达式中的整数形式是十进制整数,就会被当作有符号数,如果整数形式是基数型整数,那么该整数会被当作无符号数对待。
(2)参数:参数类似于常量,表达式中出现的参数都作为常数对待。参数是用某标识符代表某个数字的,所以定义它时要给它赋值。
(3)线网
(4)寄存器:寄存器是在表达式中出现次数最多的操作数,许多程序语句都是通过对寄存器中存储的值进行转换和传输实现设计目的的。注意:整型寄存器中的值被视为有符号的二进制补码数;实数和实数时间类型寄存器中的值被视为有符号浮点数;而reg寄存器或时间寄存器中的值被视为无符号数。
(5)位选择
(6)部分选择
(7)存储器单元:存储器建模是使用reg声明寄存器组,不能在一条语句内就完成对存储器内所有寄存器单元的赋值,必须对其中的存储单元进行赋值。形式如下:
memory
其中,memory是存储器名,word_address是要选择单元的编号。不允许对存储器单元做位选择或部分选择。
(8)函数调用:verilog中的函数和C语言中的函数没什么大的区别,都用来实现某个计算过程或完成某个事件处理。函数可以被随意调用,函数调用也可以作为表达式中的操作数。调用的函数可以是系统函数(以字符$开始)或用户定义的函数。
3.2 操作符
verilog的操作符有如下九种类型:
·算术操作符
·关系操作符
·相等操作符
·逻辑操作符
·按位操作符
·归约操作符
·移位操作符
·条件操作符
·连接和复制操作符
(1)算术操作符
+ - * 、 %
·整数除法截断所有小数部分。
·模操作符求出与第一个操作数符号相同的余数,如-7/4结果为-3。
·如果算术操作符的操作数中出现x或z,那么整个算术操作的运算结果为x。
·算术操作结果的长度
进行算术操作时,表达式中操作数的长度可能不一致,这时运算结果的长度由最长的操作数决定。在赋值语句中,算术操作符结果的长度由操作符左端的赋值目标长度决定。
reg Arc, Bar, Crt;
reg Frx;
Arc = Bar + Crt;
Frx = Bar + Crt;
在第一个赋值中,加法操作的溢出部分被丢弃,而在第二个赋值中,任何溢出的为存储在位Frx中。在较大的表达式中,中间结果的长度应取最大操作数的长度(在赋值时此规则也包括左端赋值目标)。
·无符号数和有符号数
执行算术操作和赋值时,要注意哪些操作数时无符号数、哪些操作数是有符号数。无符号数存储在线网、一般寄存器和基数格式表示形式的整数中。有符号数存储在整数寄存器和十进制形式的整数中。
·关系操作符
关系操作符是对两个操作数进行比较,如果比较结果为真则结果为1,如果比较结果为假则结果为0,关系操作符多用与条件判断。 》 《 》= 《=
如果操作数中有x或z出现,那么结果为x。
·相等操作符
四种:== != === !== 其中==和!=是比较逻辑值,由于操作数中某些位可能是x,所以比较结果也有可能是x。===和!==是按位比较,所以不会出现结果为x的情况。
·逻辑操作符
&& || !
如果操作数是向量,那么非0向量被当作逻辑1。
·位操作符
位操作符是对操作数按位进行与、或、非等逻辑操作。
~:一元非 &:二元与 | : 二元或 ^~,~^二元异或或非
·规约操作符
规约操作符的操作数只有一个,并只产生一位结果。共有如下6种:
(1)& 规约与 将操作数的各位进行与操作的结果。
(2)~& 规约与非 与规约与相反。
(3)| 规约或 将操作数的各位进行或操作的结果。
(4)~| 规约或非
(5)^ 规约异或:某个位有x或z,结果为x,操作数有偶数个1,那么结果为0;否则为1。
·移位操作符
《《 》》
·条件操作符
条件操作符是根据条件表达式的值来选择执行表达式,形式如下:
cond_expr?expr1:expr2
其中,con_expr是条件表达式,他的结果是真或假,expr1和expr2是待选的执行表达式。con_expr为真,选择执行1,否则选择执行2。如果con_expr为x或z,两个都要计算,然后对计算结果按位运算,某一位都为1,则结果为1,都为0,结果为0,否则为x。
·连接操作符
连接操作符是把位于大括号{}中的两个或以上用“,”分隔的小表达式按位连接在一起,形成一个大表达式。
·赋值操作符
verilog中reg和wire类型的区别和用法
reg相当于存储单元,wire相当于物理连线
Verilog
中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是0,1,X,Z。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。
线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。
两者的区别是:即存器型数据保持最后一次的赋值,而线型数据需要持续的驱动
输入端口可以由net/reg驱动,但输入端口只能是net;输出端口可以使net/reg类型,输出端口只能驱动net;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型
用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。
***************************************************************************************************************************************************
wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。
不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口,
inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。
简单来说硬件描述语言有两种用途:1、仿真,2、综合。
对于wire和reg,也要从这两个角度来考虑。
*********************************************************************************
从仿真的角度来说,HDL语言面对的是编译器(如Modelsim等),相当于软件思路。
这时:
wire对应于连续赋值,如assign
reg对应于过程赋值,如always,initial
*********************************************************************************
从综合的角度来说,HDL语言面对的是综合器(如DC等),要从电路的角度来考虑。
这时:
1、wire型的变量综合出来一般是一根导线;
2、reg变量在always块中有两种情况:
(1)、always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑
(2)、always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
wire型能有二维数组嘛
在许多编程语言中,wire型(也称为wire型变量或wire型信号)通常用于描述电路中的连接。这些语言通常不直接支持二维数组的wire型,因为电路连接通常是在一维空间中定义的。
然而,一些电路描述语言和工具提供了扩展的语法和功能,以支持二维数组的wire型。例如,Verilog和VHDL都提供了数组和索引操作,可以在一定程度上实现二维数组的wire型。
具体实现二维数组的wire型取决于你使用的编程语言和工具。你可以查阅相关的文档和参考资料,了解如何使用该语言或工具来定义和操作二维数组的wire型。
reg型和wire型信号有什么本质的区别
wire与reg型信号类型的区别:
wire型数据常用来表示以assign关键字指定的组合逻辑信号。模块的输入输出端口类型都默认为wire型。默认初始值是z。
reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。
默认初始值是x:
reg相当于存储单元,wire相当于物理连线。
Verilog 中变量的物理数据分为线型和寄存器型。这两种类型的变量在定义时要设置位宽,缺省为1位。变量的每一位可以是0,1,X,Z。其中x代表一个未被预置初始状态的变量或者是由于由两个或多个驱动装置试图将之设定为不同的值而引起的冲突型线型变量。z代表高阻状态或浮空量。
线型数据包括wire,wand,wor等几种类型在被一个以上激励源驱动时,不同的线型数据有各自决定其最终值的分辨办法。
两者的区别是:
寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动,输入端口可以net/reg驱动,但输入端口只能是net,如a = b & c,输入端口a 只能是net型,但其驱动b,c可以是net/reg型;输出端口可以使net/reg类型,输出端口只能驱动net,如a = b & c,模块的输出端口b,c可以是net/reg型,但它们驱动的a必须是net型;若输出端口在过程块(always/initial)中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为寄存器类型,只能是net类型。
wire表示直通,即只要输入有变化,输出马上无条件地反映;reg表示一定要有触发,输出才会反映输入。
不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
wire型的变量综合出来一般是一根导线。
reg变量在always块中有两种情况: always后的敏感表中是(a or b or c)形式的,也就是不带时钟边沿的,综合出来还是组合逻辑 always后的敏感表中是(posedge clk)形式的,也就是带边沿的,综合出来一般是时序逻辑,会包含触发器(Flip-Flop)
在设计中,输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。而输出信号则由你自己来决定是寄存器输出还是组合逻辑输出,wire型、reg型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。
verilog中reg定义又说重复,不定义又说非法
电路代码中用assign 赋值的目标必须为wire类型,在always中的赋值目标必须是reg类型,输入信号默认都是wire类型的,你的这段代码模块名称加了-t看着像modsim 的仿真代码,要是仿真代码的话,这段代码写的就有问题,仿真测试代码是没有输入输出端口的,声明的信号相当于仿真电路的节点信号: 可以改成下面的样子,就没问题了
module counter_t;
wire out_t;
reg data_t;
reg rst_t;
counter_t counter(.out_t(out),.data_t(data),.rst_t(rst));
Verilog 数据类型
Verilog中,数据类型主要分为两类: 物理数据类型 (主要包括连线型和寄存器型)和 抽象数据类型 (主要包括:整型、时间型、实型和参数型)
物理数据类型与实际硬件电路的硬件关系比较明显,抽象程度比较低
抽象数据类型是进行辅助设计和验证的数据类型
Verilog中主要的物理数据类型是:连线型、寄存器型、存储器型
使用四种逻辑电平(0,1,x,z)和八种信号强度(strength)对实际的电路进行建模
四种逻辑电平是对信号的抽象
信号强度表示数字电路中不同强度的驱动源,用来解决不同驱动强度下的赋值冲突,八种强度如下, 自上往下,强度递减
连线表示逻辑单元的物理连接,可以对应电路中的物理信号连线,这种变量不能保持电荷(trireg除外)
连线型变量必须要有驱动源,一种是连接到一个门或者模块的输出端,另一种是用assign对它进行赋值,若没有驱动源,将保持高阻态z
连线型有如下几种:
wire(连线)和tri(三态线)是最常见的,语法和语义是一致的。
不同之处如下:
wand和triand便是 与逻辑 ,因此当0和1同时出现时,结果是 0&1 的结果
tri的特征是,若无驱动源,其值为紧跟的数字
supply0表示GND,supply1表示VCC
trireg线网型可以存储数值,类似于寄存器数据类型,用于电容节点的建模。
当三态寄存器(trireg)的所有驱动源都处于高阻态 z 时,trireg保持作用在线网的最后一个逻辑值。
trireg的缺省初始值为x
存储电荷强度有如下几个关键字控制:
small、medium、large,默认电荷强度为medium
对于trireg型数据,仿真时其电荷衰减时间应制定为延迟时间
reg型变量对应的硬件电路元件具有状态保持作用,能够存储数据
reg型变量常用于行为级描述,由过程赋值语句对其进行赋值
reg和wire的区别:
reg型变量一般是无符号的,若将负数赋值给reg型变量,会自动转成其补码形式
语法为 《net_declaration》《drive_strength》《range》《delay》《list_of_variables》
drive_strength、range、delay是可选项目,list_of_variables为必选项
语法为: reg 《range》《list_of_variables》
存储器型本质上是寄存器型变量的阵列,所以用reg型变量建立寄存器组实现存储器功能。
存储器变量声明格式: reg《range1》《name_of_list》《range2》
其中,range1和range2是可选项,缺省是都为1
说明:
例如: reg 表示由256个位宽为8bit的寄存器组成的存储器
抽象型数据类型有:整型(integer)、时间型(time)、实型(real)和参数型(parameter)
整型数据常用于对循环控制变量的说明,在算术运算中被视为 二进制补码 形式的有符号数
整型数据默认为32bit有符号数
时间型与整型数据类似,不过时间型是64bit无符号数
时间型数据主要用于对模拟时间的存储与计算处理,常与系统函数 $time 一起使用
Verilog支持实型常量与变量,实型数据在机器码表示法中是浮点型数据,可用于对延迟时间的计算
参数型数据属于常量,在仿真开始之前就被赋值,并在仿真过程中保持不变
参数定义方法可以提高程序可可读性和可维护性,常用来定义延迟时间和变量的位宽

更多文章:
118论坛手机打不开了怎么回事?118图118论坛网址怎么变成卖茶叶的
2025年6月9日 10:45
西安abap开发培训(SAP ABAP培训,ABAP培训怎么样)
2025年12月31日 01:00
loopback下载(如何在ubuntu命令行下下载kvm)
2026年4月9日 08:30
security video(bios setup utility怎么设置开机密码 不是登陆密码啊)
2026年1月30日 08:00
asp session用法(关于ASP.NET中session的用法)
2026年5月16日 08:30
斯莱德男装品牌倒闭了(jj,马华,esprit,斯莱德,zara,美邦,这几个品牌如何评价)
2026年7月10日 12:30
covered interest rate parity(Interest Rate Parity代表什么)
2026年2月19日 06:00
特斯拉model3百公里加速(model3百公里加速是多少)
2026年1月18日 10:00
php执行mysql语句(php连接mysql数据库,执行查询语句后,排序后再输出)
2025年11月5日 18:30













