我有一个模块有许多input logic
和output logic
端口,一个端口应该是input foo::bar
,其中foo是一个包,bar是一个枚举。但是,我离开了input
,所以它只是简单的foo::bar
。然而,它仍然可用于模拟(测试通过,您可以在波形上看到值正在正确传输)。
来自the 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 }
它显然不是inout_dec,input_dec,output_dec或ref_dec。更深入研究LRM,net_type_or_trireg
是supply0 | supply1 | tri | triand | trior | tri0 | tri1 | wire | wand | wor
或tri
,而不是那些。
它可以是interface_port_dec吗?好吧,interface_identifier ::= identifier
和enum_identifier ::= identifier
。但是,确定:=不对称和传递,所以interface_identifier := enum_identifier
不是这样。
我在这里错过了什么?
它开始定义为inout
。
请参阅IEEE Std 1800-2012§23.2.2.3确定端口类型,数据类型和方向的规则
对于端口列表中的第一个端口: - 如果省略了方向,端口类型和数据类型,则应假定端口是非ANSI样式list_of_ports的成员,并且应在端口列表之后声明端口方向和类型声明。 除此以外: - 如果省略方向,则默认为inout。 - 如果省略端口类型,则应按以下规定确定。 - 如果省略数据类型,除了没有数据类型的互连端口外,它应默认为逻辑。
在一些例子后的同一部分中,LRM说:
对于端口列表中的后续端口: - 如果省略了方向,端口类型和数据类型,则它们应从前一个端口继承。如果以前的端口是互连端口,则此端口也应是互连端口。 除此以外: - 如果省略方向,则应从前一个端口继承。 - 如果省略端口类型,则应按上述规定确定。 - 如果省略数据类型,除了没有数据类型的互连端口外,它应默认为逻辑。