verilog 模块中的 reg 和 wire 有什么区别?

问题描述 投票:0回答:3

我们什么时候应该使用 reg,什么时候应该在 verilog 模块中使用 wire?

我还注意到有时输出被再次声明为 reg。例如 D 触发器中的 reg Q。我在某处读过这个 - “程序赋值语句的目标输出必须是 reg 数据类型。”

什么是程序赋值语句?

我已经用谷歌彻底搜索了这个,但找不到明确的解释。

verilog hdl
3个回答
41
投票

电线:-

电线用于连接不同的元件。它们可以被视为物理电线。它们可以被读取或分配。没有值存储在其中。它们需要由连续的赋值语句或模块的端口驱动。

注册:-

与其名称相反,regs 不一定对应于物理寄存器。它们代表 Verilog/SystemVerilog 中的数据存储元素。它们保留它们的值,直到为它们分配下一个值(不是通过 assign 语句)。它们可以合成为 FF、锁存器或组合电路。 (它们可能无法合成!!!)

Verilog 时间框架中存在 Wires 和 Regs。 SystemVerilog 为它们添加了一种称为逻辑的新数据类型。所以下一个问题是这个逻辑数据类型是什么以及它与我们的旧 wire/reg 有何不同。

逻辑:-

正如我们所见,reg 数据类型在 Verilog 中有点误导。 System Verilog 的逻辑数据类型添加就是为了消除上面的混淆。背后的想法是拥有一种称为逻辑的新数据类型,它至少不会给人一种硬件可综合的印象。逻辑数据类型不允许多个驱动程序。在多个分配的情况下,它具有最后一个分配获胜行为(这意味着它没有硬件等效性)。如果多个驱动程序试图用不同的值驱动它们,则 Reg/Wire 数据类型会给出 X。逻辑数据类型只是分配最后一个赋值。 reg/wire 和逻辑之间的下一个区别是逻辑可以由分配块、端口输出和程序块内部驱动,就像这样

  logic a;
    assign a = b ^ c;                   // wire style 
    always (c or d) a = c + d;          // reg style
    MyModule module(.out(a), .in(xyz)); // wire style

23
投票

程序块是指

always
,
always_ff
,
always_comb
,
always_latch
,
initial
等块。虽然过程赋值语句指的是将值赋给 reg、integer 等,但不是线(网)。

wire
元素必须由某些东西持续驱动,并且不能存储值。此后,使用 continuous assignment 语句为它们赋值。

reg
可用于在程序块中创建 registers。因此,它可以store一些价值。

reg
元素 can 用作输出 within 实际模块 declaration。但是,
reg
元素不能连接到模块实例化的输出端口。

因此,reg 可以驱动 wire 作为 assign 语句的

RHS
。另一方面,wire 可以驱动 reg 作为程序块的RHS

关于声明

reg
wire
的清晰概念,请参考下图:

因此,每当推断存储/保存某些值的顺序逻辑时,将该变量/端口声明为

reg
。在这里,
Q
是一个
reg
inside一个模块,但是当instantiating这个模块在其他模块中时,那么这个端口必须连接到一个
wire
.

记住,

wire
只能推断组合逻辑,而
reg
可以推断组合逻辑或时序逻辑。

Dave 的博客是详细信息的良好来源。有关详细信息,请参阅synthesizing differenceVerilog wire-reg 链接。


1
投票

reg和wire之间的简单区别是,reg用于verilog中的组合或时序电路,而wire用于组合电路

reg 用于存储一个值,但 wire 继续驱动某些东西,当模块初始化时 wire 连接到输出端口但 reg con 未连接

© www.soinside.com 2019 - 2024. All rights reserved.