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

verilog模块中的reg和wire之间有什么区别,verilog,hdl,Verilog,Hdl,reg和导线之间有什么区别?我们什么时候应该使用reg,什么时候应该在verilog模块中使用wire。我还注意到,有时输出会再次声明为reg。例如,D触发器中的reg Q。我在某个地方读过这篇文章——“程序赋值语句的目标输出必须是reg数据类型。”什么是程序赋值语句?我用谷歌搜索了一下,但找不到明确的解释。程序块指的是始终,始终关闭,始终梳,始终锁定,初始等块。而过程赋值语句指的是将值赋值给reg、integer等,而不是导线(网络) 导线元件必须由某物持续驱动,并且不能存储值。此后,使用连续

reg和导线之间有什么区别?我们什么时候应该使用reg,什么时候应该在verilog模块中使用wire。我还注意到,有时输出会再次声明为reg。例如,D触发器中的reg Q。我在某个地方读过这篇文章——“程序赋值语句的目标输出必须是reg数据类型。”什么是程序赋值语句?我用谷歌搜索了一下,但找不到明确的解释。

程序块指的是
始终
始终关闭
始终梳
始终锁定
初始
等块。而过程赋值语句指的是将值赋值给reg、integer等,而不是导线(网络)

导线
元件必须由某物持续驱动,并且不能存储值。此后,使用连续赋值语句为其赋值

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

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

因此,reg可以作为
assign
语句的RHS驱动导线。另一方面,导线可以驱动程序块的reg in asRHS

有关
reg
wire
声明的明确信息,请参阅下图:

因此,每当推断存储/保存某些值的顺序逻辑时,将该变量/端口声明为
reg
。这里,
Q
是模块内部的
reg
,但是当在其他模块内部实例化该模块时,该端口必须连接到
导线

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

Dave的博客是详细信息的好来源。有关更多信息,请参阅和链接。

连线:-

导线用于连接不同的元件。他们可以被治疗 作为物理电线。它们可以被读取或分配。没有存储任何值 在他们里面。它们需要由连续assign语句驱动 或从模块的端口

Reg:-

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

Verilog时间范围内的电线和注册表。添加了SystemVerilog 一种新的数据类型称为逻辑。所以下一个问题是什么是 这种逻辑数据类型和它与我们以前的好数据类型有何不同 连线/注册

逻辑:-

正如我们所看到的,reg数据类型在Verilog中是位错误。 SystemVerilog的逻辑数据类型添加是为了删除上述 混乱背后的想法是拥有一种新的数据类型,称为logic 至少不会给人留下硬件可合成的印象。 逻辑数据类型不允许多个驱动程序。这是最后一次 在多次分配的情况下,分配将赢得行为(这意味着 它没有硬件等价性)。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的简单区别在于,在verilog中,reg用于组合或时序电路,wire用于组合电路

reg用于存储一个值,但导线在某些情况下是连续驱动的,当模块初始化时导线连接到输出端口,但reg未连接

如以下声明所述:

最常用的网络是线,因此让我们用它来更好地理解网络

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

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

由于reg在分配之间保留一个值,因此可以使用它对硬件寄存器进行建模。可以对边缘敏感(即触发器)和电平敏感(即复位集和透明锁存器)存储元件进行建模reg不需要表示硬件存储元素,因为它也可以用于表示组合逻辑。

注意前面提到的文本中的单词“can”
。与net不同,reg能够保持
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