【问题标题】:What is the difference between reg and wire in a verilog moduleVerilog模块中的reg和wire有什么区别
【发布时间】:2019-07-17 18:36:00
【问题描述】:

reg 和 wire 有什么区别?我们什么时候应该使用 reg,什么时候应该在 verilog 模块中使用 wire。我也注意到有时输出被再次声明为 reg。例如 D 触发器中的 reg Q。我在某处读过这个——“过程赋值语句的目标输出必须是 reg 数据类型。”什么是程序赋值语句?我已经彻底搜索了这个,但无法找到明确的解释。

【问题讨论】:

标签: verilog hdl


【解决方案1】:

电线:-

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

注册:-

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

Wires 和 Regs 存在于 Verilog 时间范围内。添加了 SystemVerilog 一种对他们来说称为逻辑的新数据类型。所以下一个问题是什么是 这种逻辑数据类型以及它与我们古老的数据类型有何不同 电线/注册。

逻辑:-

正如我们所见,reg 数据类型在 Verilog 中有点误导。 SystemVerilog的逻辑数据类型添加就是去掉上面的 混乱。背后的想法是拥有一种称为逻辑的新数据类型 至少不会给人一种硬件可合成的印象。 逻辑数据类型不允许多个驱动程序。它有一个最后 在多次分配的情况下,分配会赢得行为(这意味着 它没有硬件等价物)。 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

【讨论】:

  • 使用 reg 代替 wire 会导致电路变慢吗?
【解决方案2】:

正如here中声明的那样:

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

想想你家里的一根电线,它是连接两个电子元件的东西。正确的?现在,告诉我如果我折断电线会发生什么?连接将丢失(高阻抗路径 'bz)。这正是在硬件中合成网络的方式——两个门之间的连接实现了连续分配。网络不能不能存储一个值(除了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 的说法,

因为 reg 在赋值之间保存了一个值,所以它可以用来模拟硬件寄存器。可以对边沿敏感(即触发器)和电平敏感(即复位设置和透明锁存器)存储元件进行建模。 reg 不需要表示硬件存储元素,因为它也可以用来表示组合逻辑。

关注上述文本中的“可以”这个词。与 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 提供默认值,那么我已经为 a 和 b 的所有组合提供了一个值给 register .因此,无需持有任何价值。因此,即使我将 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 并不总是合成为存储元素。

【讨论】:

  • 如果你在所有代码中使用非阻塞赋值(
【解决方案3】:

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

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

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

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

因此,reg 可以驱动 wire 作为assign 语句的RHS。反过来说,wire 可以驱动 reg 作为程序块的 RHS

关于regwire 的声明,请参考下图:

因此,每当推断存储/保存某个值的顺序逻辑时,将该变量/端口声明为reg。这里,Q 是一个 reg inside 一个模块,但是当 instantiating 这个模块在某个其他模块中时,这个端口必须连接到一个 wire

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

Dave 的博客是获取详细信息的好来源。如需更多信息,请参阅synthesizing differenceVerilog wire-reg 链接。

【讨论】:

    【解决方案4】:

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

    reg用于存储一个值,但是wire不断被驱动一些东西,并且在模块初始化时wire连接到outport但reg没有连接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多