寄存器声明中的变量名表示什么(Verilog)

What does the variable name in the register declaration indicate (Verilog)

我刚刚开始学习 verilog ,我在一些事情上遇到了麻烦。我找到了一些可以提供帮助的资源,但有些事情不清楚,我需要指定。我在下面有一个 D 触发器的代码。而且我了解进出声明是如何工作的。我没有得到的是寄存器。

当它说out是与之关联的变量。这个关联是否意味着,out是寄存器和输出?还是说 out 也是寄存器的输出?

1
2
3
4
5
6
7
8
9
module DFF(quarter, in, out) ;
parameter n = 1;           // width
input quarter ;
input  [n-1:0] in ;
output [n-1:0] out ;
reg    [n-1:0] out ;
always @(quarter=1)
 out = in ;
endmodule

在 Verilog 中有网络,也有变量。到目前为止,最常见的网是您可能熟悉的电线。您可以使用 var 声明一个变量,但大多数人会说是 reg,因为它一直都是这样做的。

(在 Verilog 中,但不是在 SystemVerilog 中),电线必须由

驱动

  • assign 语句
  • 实例化模块的输出

并且变量必须从

驱动

  • initialalways 块。

您的输出 outalways 块驱动,因此必须是变量。线路

1
reg    [n-1:0] out ;

将输出 out 声明为变量(而不是连线)。

事实上,您正在使用一种老式的方式来指定输入和输出。从 2001 年开始,方法是这样的:

1
2
3
4
5
6
7
8
9
module DFF #(parameter n = 1)
            (input wire         quarter,
             input wire [n-1:0] in,
             output reg [n-1:0] out);

always @(quarter=1)
  out = in ;

endmodule

这就是所谓的 ANSI 格式,我想你会同意,它更合理。我建议使用此表格,而不是您使用的老式表格。

顺便说一句,你的代码有点奇怪。我不完全确定它应该做什么,但是如果您期望在季度为 1 时驱动输出,我会这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
module DFF // #(parameter n = 1) // you're not using parameter n
            (input wire         quarter,
             input wire [n-1:0] in,
             output reg [n-1:0] out);

always @(*)
  if (quarter == 1'b1)
    out = in ;
  else
    // IMPORTANT ! : what is out when quarter != 1 ?
    // your current code would synthesise to a latch
    // is that what you wanted? (And if so, are you
    // sure that's what you wanted)

endmodule

最初,verilog 是一种对状态变量(寄存器、reg)进行行为类型操作并通过 nets 连接它们的语言。因此,reg 是一个变量,应该在操作之间保持其值,net 只是一个连接,没有与之关联的状态,即 wirereg 值可以在 procedural 块中计算,即 always 块,wires 只能连接(使用连续赋值,assign 语句(在 always 块之外))。

regs 和 wires 的使用规则不同,在模拟中它们的行为也不同,尤其是在多个驱动程序周围。有关更多信息,请参阅 Matthew 的回复。