我对 SystemVerilog 的“default_nettype 指令”有疑问。
默认情况下,下面的代码是可以的。
module m1 (
input logic i1,
output logic o1
);
logic l1;
assign l1 = i1;
assign o1 = l1;
endmodule
Run Code Online (Sandbox Code Playgroud)
但是,当我将默认网络类型更改为none
:
`default_nettype none
Run Code Online (Sandbox Code Playgroud)
只有 i1 会导致错误:
ERROR: [VRFC 10-1103] net type must be explicitly specified for i1 when default_nettype is none ...
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么只会input logic i1
导致错误并需要明确的wire
,但output logic o1
不会logic l1
。
Verilog 有太多隐式规则,无法适应懒惰的程序员(即对设计硬件而不是编写软件感兴趣的人)
此错误在第23.2.2.3 节确定端口种类、数据类型和方向的规则中进行了解释
对于 ANSI 样式端口列表中的第一个端口:
- 如果省略端口类型:
- 对于
input
和inout
端口,端口应默认为默认网络类型的网络。`default_nettype
可以使用编译器指令更改默认网络类型
此隐式“net”端口规则与声明输出端口以及端口之外的所有其他声明时使用的规则相反。其背后的原因是输入端口是模块中使用的绝大多数端口,并且将端口连接保持为电线允许端口折叠,这对于仿真来说更有效。