Verilog 中定义信号为啥要区分 wire 和 reg 两种类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog 中定义信号为啥要区分 wire 和 reg 两种类型相关的知识,希望对你有一定的参考价值。

简单来说硬件描述语言有两种用途: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型都可以。但一般的,整个设计的外部输出(即最顶层模块的输出),要求是寄存器输出,较稳定、扇出能力也较好。

为什么在verilog中要定义wire?

有几种情况变量需要定义成wire。
第一。assign 语句
例如:
reg a,b;
wire and_result;
...
assign and_result =a&&b;
你可以试试把wire定义成reg。综合器会报错。

第二。元件例化时候的输出必须用wire
例如:
wire dout;

ram u_ram
(
...
.out(dout)
...
);
wire按照国外的教材上面的定义:
wire为无逻辑连线。只做连线,wire本身是不带逻辑性的,所以输入什么输出就是什么。所以你尝试着用always语句对wire变量赋值。综合器就会报错。
那么你可能会问。assign c =a&&b不是就是对wire的赋值吗?
其实并非如此。综合器综合时将a&&b综合成ab经过一个与门。而c只是连接到与门输出的线。正真综合出与门的是&&。而不是c。

Abstract
Verilog初学者最常见的问题:『什麼时候该用wire?什麼时候又该用reg?』

Introduction
大体上来说,wire和reg都类似於C/C++的变数,但若此变数要放在begin...end内,该变数就须使用reg,在begin...end之外,则使用wire。

另外使用wire时,须搭配assign;reg则不必。

input,ouput,inout预设值都是wire。

若wire和reg用错地方,compiler都会提醒,所以不必太担心。

一个很重要的观念,在Verilog中使用reg,并不表示合成後就是暂存器(register)。若在组合电路中使用reg,合成後仍只是net,唯有在循序电路中使用reg,合成後才会以flip-flop形式表示成register。
参考技术A wire:线性信号变量 reg为寄存器变量 input A,B,Cin; 可推出 Cin(wire) output Sum,Cout; 可推出 Cout(wire/reg) module FADD(A,B,Cin,Sum,Cout);调用如下: c1->A,c2->b,c3->Cin,c4->sum,c5->count FADD M(C1,C2,C3,C4,C5); 可推出:c3为input c5 为output C3(wire) C5(wire) 又因为 为内部调用 所以c3可以为:reg变量 综上: Cin(wire) Cout(wire/reg) C3(wire/reg) C5(wire) 也请其他高人指点下

在Verilog中对于一个变量,是选成wire型还是选成reg型,根据啥标准来选择?

wire属于net型数据类型,相当于硬件电路中的各种物理连接,其特点是输出值紧跟输入值的变化而变化。例如,
wire cout=cin; //只要cin变化,cout就变化
reg属于variable型数据类型,必须放在过程语句中,通过过程赋值语句赋值;在过程块内被赋值的信号也必须定义成variable型。也就是说,要在always和initial中赋值的变量必须定义为variable型。追问

那是不是说reg型变量就是为了应用在过程块中呢?

追答

对不起,上面有个地方错了,是assign cout=cin;
可以这么说。wire型变量用在assign(持续赋值)中,reg用在过程块中

参考技术A 过程语句中使用reg型变量,连续赋值语句中使用wire型变量。希望可以帮到你!本回答被提问者采纳 参考技术B reg型是定义寄存器类型的变量的,用于定义域寄存器,而wire型数据常用来表示以assign关键字指定的组合逻辑信号。assign是连续赋值语句。希望对你有帮助。

以上是关于Verilog 中定义信号为啥要区分 wire 和 reg 两种类型的主要内容,如果未能解决你的问题,请参考以下文章

Verilog中wire与reg类型的区别

reg和wire的区别

verilog中如何将wire类型的变量A 与reg类型的变量B进行比较?

verilog中reg和wire的区别

在Verilog中对于一个变量,是选成wire型还是选成reg型,根据啥标准来选择?

C++:调用无参数的构造函数为啥不加括号