在verilog模块中我们什么时候应该使用reg以及什么时候应该使用wire?
我还注意到有时输出会再次声明为 reg。例如 D 触发器中的 reg Q。我在某处读过这个 - “过程赋值语句的目标输出必须是 reg 数据类型。”
什么是程序赋值语句?
我已经用谷歌彻底搜索了这一点,但无法找到明确的解释。
Wire:-
电线用于连接不同的元件。它们可以被视为物理线路。它们可以被读取或分配。其中没有存储任何值。它们需要由连续赋值语句或模块的端口驱动。
Reg:-
与它们的名称相反,寄存器不一定对应于物理寄存器。它们代表 Verilog/SystemVerilog 中的数据存储元素。它们保留它们的值,直到为它们分配下一个值(不是通过分配语句)。它们可以合成为FF、锁存器或组合电路。 (它们可能无法合成!)
Wires 和 Regs 存在于 Verilog 时间范围内。 SystemVerilog 向其中添加了一种称为逻辑的新数据类型。因此,下一个问题是这个逻辑数据类型是什么,以及它与我们良好的旧wire/reg有何不同。
Logic:-
正如我们所看到的,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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)