使用分配时的verilog_mode autoreginput行为

时间:2018-12-11 14:58:35

标签: emacs verilog system-verilog

我想知道以下情况是否可能。
我有:

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。即使我正在做作业,有没有办法扩展它?

1 个答案:

答案 0 :(得分:1)

简短的答案是因为运行verilog-auto来填充/*AUTOREGINPUT*/时将排除已经声明的任何信号,并通过添加assign a_i = '0;来声明a_i。 / p>

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

module x;
  assign myVar = '0;
endmodule

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

emacs中的

verilog-mode模式知道隐式声明,因此不会自动生成任何声明的内容。因此,在添加assign语句时,您是在声明a_i,因此自动生成器不会“重新定义” a_i

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

还请注意,它应该是/*AUTOREGINPUT*/,而不是/*AUTOREGINPUTS*/,末尾没有's'。