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

寄存器声明中的变量名表示什么(Verilog),verilog,Verilog,我刚刚开始学习verilog,有些事情我遇到了麻烦。我已经找到了一些资源来提供帮助,但是有些东西还不清楚,我需要指定。下面是D触发器的代码。我也理解进进出出的声明是如何起作用的。我拿不到的是收银机 当它说out是与之相关联的变量时,这个关联是否意味着out是寄存器和输出?或者它是否意味着out也是寄存器的输出 module DFF(quarter, in, out) ; parameter n = 1; // width input quarter ; input [n-1

我刚刚开始学习verilog,有些事情我遇到了麻烦。我已经找到了一些资源来提供帮助,但是有些东西还不清楚,我需要指定。下面是D触发器的代码。我也理解进进出出的声明是如何起作用的。我拿不到的是收银机

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

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
    语句
  • 实例化模块的输出
变量必须从

  • 初始
    始终
您的输出
out
始终
块驱动,因此必须是一个变量。线路

reg    [n-1:0] out ;
将输出
out
声明为变量(而不是导线)

事实上,您正在使用一种老式的方式来指定输入和输出。自2001年以来,其方法如下:

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
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
这就是所谓的ANSI形式,我想你会同意,它更合理。我建议你用这个表格,而不是你现在用的那种老式表格

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

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
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)进行行为类型操作并通过
网络连接它们的语言。因此,
reg
是一个变量,应该在操作之间保持其值,
net
只是一个连接,没有与之关联的状态,即
wire
reg
值可以在
程序
块中计算,即
始终
块,
导线
只能连接(使用连续赋值,
赋值
语句(始终块外))

有不同的规则用于
reg
s和
wire
s,以及它们在模拟中的不同行为,特别是在多个驱动程序周围。更多信息请参见Matthew的回复