verilog变量reg和wire问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog变量reg和wire问题相关的知识,希望对你有一定的参考价值。
module FADD(A,B,Cin,Sum,Cout);
input A,B,Cin;
output Sum,Cout;
...
endmodule
module Test;
...
FADD M(C1,C2,C3,C4,C5);
...
endmodule
答案是Cin(wire) Cout(wire/reg) C3(wire/reg) C5(wire)
能举个例子说明下么,百度知道那个说得不清楚c3是对应Cin的,怎么一个只能wire另一个两个都可以
如果你想在输出处寄存一下:比如使用always语句,则必须声明为reg类型
wire是线网,就是相当于实际中的连接线,你想assign的话就是直接连接,就是用wire型,他的值是随时变化的。比如你想寄存一下,让他在时钟边沿才变化就需要reg类型了
你的问题应该是主要讨论下wire型和reg型的应用区别吧
另外,团IDC网上有许多产品团购,便宜有口碑 参考技术A c3是reg型,你这个主函数是个testbench,子函数a,b,cin在testbench里面对应的测试信号是reg型,输出sum,cout是wire型,你的答案是错的,REG C1,C2,C3 ; WIRE C4,C5; 参考技术B 你只要记住always里赋值用reg,assign里面赋值用wire追问
已经记住了,这道题还是没有解决
追答你这个,Cin在FADD里算输入,不用写类型,但如果在Test里对C3赋值,那么就按上面说的来定类型,你这里C3和Cin是对应的,Cout是FADDD的输出,在FADD里按上面说的赋类型,在Test里面对应为C5,是wire类型,表示线连。
调用元件的输出都是wire,输入如果是整个系统的输入,就不用写类型,如果是自己编写的信号,根据上面always或assign来定类型。
1.A,B,Cin是输入,只能是wire型的。
2.Sum、Cout是输出。如果这个加法器,里面用门电路搭建,用assign直接写逻辑函数,那么输出就是wire型的。如果这是个用always@(A or B orCin)写的,其实就是只有输入变化输出才重新计算,那么就是说输入都不变化的时候是要保持之前的值的,所以需要用reg型。
3. 输入端口A,B,Cin只能是wire型,但是在电路中他们是被前端其他信号C1,C2,C3驱动的。那么是可以由wire或者reg信号驱动的。举个例子,如果Cin前面连接个开关(C3),就是wire型的,如果他连接的是一个寄存器的输出(例如加法器输出为reg时的级联),那就是reg型的。
verilog中reg和wire的区别
参考技术A 首先要先清楚一点,verilog是硬件描述语言,其最终是为了生成一个电路,所以它的变量类型是根据实际电路来决定的。从名字理解:
wire,线型,实际上在电路中的作用就是一根连线;
reg,寄存器型,在电路中就作为寄存器存在。
连线和寄存器是构成数字电路的基本结构,这也是verilog这两种变量类型的来源。
当然,在verilog的升级版system verilog中提供了更多的,更一些抽象化的变量类型本回答被提问者采纳 参考技术B wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。
reg表示一定要有触发,输出才会反映输入的状态。
reg相当于存储单元,wire相当于物理连线。reg表示一定要有触发,没有输入的时候可以保持原来的值,但不直接实际的硬件电路对应。
两者的区别是:寄存器型数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使用在过程赋值语句(initial,always)中。wire若无驱动器连接,其值为z,reg默认初始值为不定值 x 。
在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。
在过程赋值语句中(比如always语句),表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的,根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
对组合逻辑输出变量,可以直接用assign。即如果不指定为reg类型,那么就默认为1位wire类型,故无需指定1位wire类型的变量。当然专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。
输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以是wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型(wire/tri)。用关键词inout声明一个双向端口,inout端口不能声明为reg类型,只能是wire类型。
默认信号是wire类型,reg类型要申明。这里所说的默认是指输出信号申明成output时为wire。如果是模块内部信号,必须申明成wire或者reg.
对于always语句而言,赋值要申明成reg,连续赋值assign的时候要用wire。
模块调用时 信号类型确定方法总结如下:
•信号可以分为端口信号和内部信号。出现在端口列表中的信号是端口信号,其它的信号为内部信号。
•对于端口信号,输入端口只能是net类型。输出端口可以是net类型,也可以是register类型。若输出端口在过程块中赋值则为register类型;若在过程块外赋值(包括实例化语句),则为net类型。
•内部信号类型与输出端口相同,可以是net或register类型。判断方法也与输出端口相同。若在过程块中赋值,则为register类型;若在过程块外赋值,则为net类型。
•若信号既需要在过程块中赋值,又需要在过程块外赋值。这种情况是有可能出现的,如决断信号。这时需要一个中间信号转换。
下面所列是常出的错误及相应的错误信息(error message)
•用过程语句给一个net类型的或忘记声明类型的信号赋值。
信息:illegal …… assignment.
•将实例的输出连接到声明为register类型的信号上。
信息: has illegal output port specification.
以上是关于verilog变量reg和wire问题的主要内容,如果未能解决你的问题,请参考以下文章
verilog中如何将wire类型的变量A 与reg类型的变量B进行比较?