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

What is the difference between reg and wire in a verilog module

reg 和 wire 有什么区别?我们什么时候应该使用 reg,什么时候应该在 verilog 模块中使用 wire。我还注意到有时输出被再次声明为 reg。例如 D 触发器中的 reg Q。我在某处读过这个 - "The target output of procedural assignment statements must be of reg data type." 什么是程序赋值语句?我已经通过谷歌搜索了这个,但没能找到明确的解释。

程序块是指alwaysalways_ffalways_combalways_latchinitial等块。虽然程序赋值语句指的是将值赋给 reg、整数等, 但不是 线(网)。

wire 元素必须不断地被某些东西驱动,并且不能存储值。此后,使用连续赋值语句为它们赋值。

reg 可用于在程序块中创建 寄存器 。因此,它可以存储一些值。

reg 元素 可以 用作输出 within 实际模块 声明.但是,reg个元素不能连接到模块的输出端口实例化

因此,reg 可以驱动 wire 作为 [=19 的 RHS =] 语句。另一方面,wire 可以驱动程序块的 reg 作为 RHS

关于 regwire 声明的清晰思路,请参考下图:

因此,每当推断出 stores/holds 某个值的时序逻辑时,将 variable/port 声明为 reg。在这里,Q 是一个 reg inside 模块,但是 instantiating 这个模块在其他模块中,那么这个端口必须连接到 wire.

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

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

电汇:-

Wires are used for connecting different elements. They can be treated as physical wires. They can be read or assigned. No values get stored in them. They need to be driven by either continuous assign statement or from a port of a module.

Reg:-

Contrary to their name, regs don't necessarily correspond to physical registers. They represent data storage elements in Verilog/SystemVerilog. They retain their value till next value is assigned to them (not through assign statement). They can be synthesized to FF, latch or combinatorial circuit. (They might not be synthesizable !!!)

Wires and Regs are present from Verilog timeframe. SystemVerilog added a new data type called logic to them. So the next question is what is this logic data type and how it is different from our good old wire/reg.

逻辑:-

As we have seen, reg data type is bit mis-leading in Verilog. SystemVerilog's logic data type addition is to remove the above confusion. The idea behind is having a new data type called logic which at least doesn't give an impression that it is hardware synthesizable. Logic data type doesn't permit multiple drivers. It has a last assignment wins behavior in case of multiple assignments (which implies it has no hardware equivalence). Reg/Wire data types give X if multiple drivers try to drive them with different values. Logic data type simply assigns the last assignment value. The next difference between reg/wire and logic is that logic can be both driven by assign block, output of a port and inside a procedural block like this

  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

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

reg is used to store a value but wire is continuely driven some thing and wire is connected to outport when module initialization but reg is con not connected

here中声明:

最常用的网络是wire,所以让我们用它来更好地理解一个net

想想你家里的电线,它是连接两个电子元件的东西。正确的?现在,告诉我如果我折断电线会发生什么?连接将丢失(高阻抗路径 'bz)。这正是网络在硬件中的合成方式——两个门之间的连接实现了连续分配。 Nets 不能不存储值(除了 trireg,它可以有一个电容状态,如果你断开连接,它会卡在最后分配的值)

使用 wire(net) 查看这个简单的 Verilog 代码:

module net_example (
   input wire a,
   input wire b
);

wire net;
assign net = a ? 1'b1 : (b ? 1'b0 : 1'bx);

endmodule

综合硬件:

所以,我希望它很容易理解网络。现在让我们看看 reg。首先让我说,用类型声明任何东西 reg 并不总是意味着它将被合成为一个寄存器(存储元素)。引用 Verilog LRM (2005) 第 4.7 节关于 reg 的内容,

Because the reg holds a value between assignments, it can be used to model hardware registers. Edge-sensitive (i.e., flip-flops) and level sensitive (i.e., reset-set and transparent latches) storage elements can be modeled. A reg need not represent a hardware storage element because it can also be used to represent combinatorial logic.

注意上述文本中的“可以”这个词。与 net 不同,reg 能够保存一个值,因此使其有资格存储值。而且,这就是为什么它 “可以” 用作存储元素的原因。让我们深入挖掘一些 Verilog 代码。

使用 reg 制作存储元素的 Verilog 代码:

module net_reg (
   input wire a,
   input wire b
);

reg register;

always @(*) begin
   if (a) register = 1'b1;
   else if (b) register = 1'b0;
end

endmodule

因为,当 a == 0 和 b == 0 时,我没有编写 register 的值的代码,因此,register 保留以前的值(请参阅我为显示反馈而制作的红线),使其成为一个记忆元素。

综合硬件:

如果我只是在上述代码中添加一行为 register 提供默认值,我已经为 register 提供了一个值对于 a 和 b 的所有组合。因此,无需持有任何价值。因此,即使我将 register 声明为 reg,它也会被合成为 wire 而不是一个存储元素。

module net_reg (
   input wire a,
   input wire b
);

reg register;

always @(*) begin
   register = 1'b0;
   if (a) register = 1'b1;
   else if (b) register = 1'b0;
end

endmodule

综合硬件: 因此,这里的主要收获是 reg 并不总是合成为存储元素。