verilog_mode 使用赋值时的自动重新输入行为

verilog_mode autoreginput behavior when using assignment

不知是否有以下情况
我有:

module a(
input [2:0] a_i
);
endmodule

module b ();

 /*AUTOREGINPUTS*/

 a u_a(/*AUTOINST*/)
endmodule

扩展为:

 module b ();

 /*AUTOREGINPUTS*/
 reg [2:0] a_i;
 a u_a(/*AUTOINST*/
       .a_i(a_i))
endmodule

但是如果我修改添加行 assign a_i = '0;,那么它不再扩展 AUTOREGINPUTS。即使我正在做作业,有没有办法扩展它?

简短的回答是因为当 运行 verilog-auto 填写 /*AUTOREGINPUT*/ 时将排除任何已经声明的信号,并且通过添加 assign a_i = '0;,您声明 a_i.

在 Verilog 中,不需要显式变量声明,如果在某些情况下未声明,将采用默认网络类型。所以,如果我有以下内容:

module x;
  assign myVar = '0;
endmodule

myVar 将被隐式声明为具有默认网络类型(默认为 wire)的网络。您可以在 System-Verilog LRM(IEEE1800-2009 第 6.10 节)中阅读更多内容。避免拼写错误生成隐式声明变量的一个建议是将带有 `default_nettype 宏的默认网络类型更改为 none(即每个文件顶部的 `default_nettype none);这样做会强制显式声明所有变量,否则 compiler/synthesizer 将引发错误。

emacs 中的

verilog-mode 模式知道隐式声明,因此不会自动生成任何已声明的内容。因此,当您添加 assign 语句时,您正在声明 a_i,因此自动生成器不会 "redefine" a_i.

为了避免这种情况,我只能在您分配任何要自动生成的变量之前推荐 运行 生成器。我不确定它是否正确处理 `default_nettype none,但我认为不会。

另外注意,应该是/*AUTOREGINPUT*/,不是/*AUTOREGINPUTS*/,最后没有's'。