隐式网络类型声明和`default-nettype

Hir*_*ani 6 system-verilog

我对 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

dav*_*_59 7

Verilog 有太多隐式规则,无法适应懒惰的程序员(即对设计硬件而不是编写软件感兴趣的人)

此错误在第23.2.2.3 节确定端口种类、数据类型和方向的规则中进行了解释

对于 ANSI 样式端口列表中的第一个端口:

  • 如果省略端口类型:
    • 对于inputinout端口,端口应默认为默认网络类型的网络。`default_nettype可以使用编译器指令更改默认网络类型

此隐式“net”端口规则与声明输出端口以及端口之外的所有其他声明时使用的规则相反。其背后的原因是输入端口是模块中使用的绝大多数端口,并且将端口连接保持为电线允许端口折叠,这对于仿真来说更有效。