我想知道以下情况是否可能。
我有:
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
。即使我正在做作业,有没有办法扩展它?
答案 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
);这样做将强制所有变量都被明确声明,否则编译器/合成器将引发错误。
verilog-mode
模式知道隐式声明,因此不会自动生成任何声明的内容。因此,在添加assign
语句时,您是在声明a_i
,因此自动生成器不会“重新定义” a_i
。
为避免这种情况,我仅建议您在分配任何要自动生成的变量之前运行生成器。我不确定它是否可以正确处理`default_nettype none
,但我认为不会。
还请注意,它应该是/*AUTOREGINPUT*/
,而不是/*AUTOREGINPUTS*/
,末尾没有's'。