编译错误,还是对 SystemVerilog 的误解?未声明的端口类型在模拟中有效

dan*_*dan 3 hardware hdl system-verilog

我有一个带有多个input logicoutput logic端口的模块,一个端口应该是input foo::bar,其中 foo 是一个包,而 bar 是一个枚举。但是,我离开了input,所以很简单foo::bar。然而,它仍然可以在模拟中工作(测试通过,您可以在波形上看到该值正在正确传输)。

LRM,我们有:

inout_declaration ::= 
  inout port_type list_of_port_identifiers 
input_declaration ::= 
  input port_type list_of_port_identifiers 
  | input data_type list_of_variable_identifiers 
output_declaration ::= 
  output port_type list_of_port_identifiers 
  | output data_type list_of_variable_port_identifiers 
interface_port_declaration ::= 
  interface_identifier list_of_interface_identifiers 
  | interface_identifier . modport_identifier list_of_interface_identifiers 
ref_declaration ::= 
  ref data_type list_of_port_identifiers 
port_type ::=  
  [ net_type_or_trireg ] [ signing ] { packed_dimension } 
Run Code Online (Sandbox Code Playgroud)

它显然不是 inout_dec、input_dec、output_dec 或 ref_dec。深入研究 LRM,net_type_or_triregsupply0 | supply1 | tri | triand | trior | tri0 | tri1 | wire | wand | wortri,而不是那些。

它可能是 interface_port_dec 吗?嗯,interface_identifier ::= identifierenum_identifier ::= identifier。但是,可以肯定 := 不是对称和可传递的,因此interface_identifier := enum_identifier.

我在这里缺少什么?

Gre*_*reg 5

它开始定义为inout.

请参阅IEEE Std 1800-2012 § 23.2.2.3 确定端口种类、数据类型和方向的规则

对于端口列表中的第一个端口:
— 如果方向、端口种类和数据类型都被省略,则端口应假定为非 ANSI 样式 list_of_ports 的成员,端口方向和类型声明应为在端口列表之后声明。
否则:
— 如果省略方向,则默认为 inout。
— 如果省略端口种类,则应按以下规定确定。
— 如果省略数据类型,除了没有数据类型的互连端口外,默认为逻辑。

在一些示例之后的同一部分中,LRM指出:

对于端口列表中的后续端口:
— 如果方向、端口种类和数据类型都省略,则它们应从前一个端口继承。如果前一个端口是互连端口,则该端口也应是互连端口。
否则:
— 如果省略方向,则应从前一个端口继承。
— 如果省略端口种类,则应按上述规定确定。
— 如果省略数据类型,除了没有数据类型的互连端口外,它应默认为逻辑。