正如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 并不总是合成为存储元素。