问:什么时候用 wire??什么时候用 reg???

本文详细解析了Verilog HDL语言中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。

在Verilog硬件描述语言中,`reg`和`wire`是两种基本的数据类型,它们在功能和使用场景上有着显著的区别。 `wire`类型用于表示电路中的物理连线,它描述的是模块之间的连接关系。当一个信号是通过连续赋值语句(如`assign`语句)驱动时,或者作为一个模块的输出端口被其他模块内部的信号驱动时,应该定义为`wire`类型。例如,在实现组合逻辑电路时,如果信号是由`assign`语句直接赋值或是模块端口并且由外部驱动,则应当使用`wire`类型[^2]。 另一方面,`reg`类型则用于表示存储元件,即它可以保持一个值直到下一次过程赋值发生。`reg`类型的变量通常出现在过程块(如`always`块)中,并且只能在这些块内部被赋值。尽管名字中有“寄存器”这个词,但`reg`并不总是对应实际的硬件寄存器;它的综合结果取决于具体的使用场景。当`reg`类型变量用于时序逻辑电路时,它会被综合成真正的寄存器(触发器),而在组合逻辑电路中使用时,它会被综合成网表(netlist)中的网络节点[^3]。 适用场景方面,当需要定义一个在`always`过程块内被赋值的信号时,应使用`reg`类型。这通常涉及到时序逻辑的设计,比如计数器、状态机等需要记忆先前状态的情况。而当信号是通过连续赋值方式获得其值时,或是作为模块接口的一部分并且由模块外部驱动时,则应使用`wire`类型[^1]。 举个例子来说明两者的应用: ```verilog module example(clk, reset, out_signal); input clk, reset; output reg [7:0] out_signal; // out_signal 是一个 reg 类型,因为它将在 always 块中被赋值 always @(posedge clk) begin if (reset) out_signal <= 8'b0; // 在时钟上升沿复位 else out_signal <= out_signal + 1; // 在时钟上升沿递增 end endmodule ``` 在这个例子中,`out_signal`被定义为`reg`类型,因为它是通过`always`块中的过程赋值语句来更新其值的。 相比之下,如果我们有一个简单的与门电路,我们可能会这样写: ```verilog module and_gate(input a, input b, output wire y); assign y = a & b; // y 是一个 wire 类型,因为它通过 assign 语句得到其值 endmodule ``` 这里,`y`被定义为`wire`类型,因为它不是在任何过程块中被赋值,而是通过连续赋值语句`assign`来确定其值。 综上所述,`wire`和`reg`的选择依赖于信号是如何被赋值以及它们在设计中的角色。正确地选择数据类型对于确保设计的行为符合预期至关重要。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值