当使用typedef声明用户定义类型时, EDA Playground接受这两种形式:
typedef reg[4:0] reg5;
typedef logic[4:0] logic5;
但是,如果根据类型做类似的事情wire
,那么这种格式会失败:
typedef wire[4:0] wire5;
我得到“语法错误”。
这怎么解释?
当使用typedef声明用户定义类型时, EDA Playground接受这两种形式:
typedef reg[4:0] reg5;
typedef logic[4:0] logic5;
但是,如果根据类型做类似的事情wire
,那么这种格式会失败:
typedef wire[4:0] wire5;
我得到“语法错误”。
这怎么解释?
根据 IEEE Std 1800-2017,typedef
用类型声明 a 是非法的。wire
请参阅第 6.18 节用户定义类型:
type_declaration ::= // from A.2.1.3
typedef data_type type_identifier { variable_dimension } ;
Awire
不是 a data_type
,而reg
和logic
是。Awire
是一个net_type
。
Atypedef
定义了可应用于网络或变量对象种类的数据类型。由于隐式定义,保持与 Verilog 的向后兼容性令人困惑。
当你看到
logic [4:0] v;
这是一个隐含的变量声明a
,具有显式的 5 位 4 状态打包数组数据类型。
var logic [4:0] v;
当你看到
wire [4:0] w;
这是一个显式的a
带有 5 位隐式 4 状态打包数组数据类型的网络声明。
wire logic [4:0] w;
您可以同时使用 a typedef
:
typedef 逻辑 [4:0] uint5;
var uint5 v; // var can be implicit
wire uint5 w;
请注意,模块input
和inout
端口具有wire
隐式对象类型。也是4-state 类型的同义词,reg
是首选关键字。A并不总是与寄存器相关联。logic
logic
reg