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