在 SystemVerilog 中使用 typedef 和 wire
Using typedef with wire in SystemVerilog
当使用 typedef 声明用户定义类型时,这两种形式都被 EDA Playground 接受:
typedef reg[4:0] reg5;
typedef logic[4:0] logic5;
但是,如果基于 wire
类型做类似的事情,则此格式失败:
typedef wire[4:0] wire5;
我收到“语法错误”。
如何解释?
根据 IEEE 标准 1800-2017,用 wire
类型声明 typedef
是非法的。参考6.18节用户自定义类型:
type_declaration ::= // from A.2.1.3
typedef data_type type_identifier { variable_dimension } ;
A wire
不是 data_type
,而 reg
和 logic
是。 wire
是 net_type
.
A typedef
定义了一个 数据类型 可以应用于网络或变量对象种类。由于隐式定义,很难保持与 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;
您可以对两者使用 typedef
:
typedef 逻辑 [4:0] uint5;
var uint5 v; // var can be implicit
wire uint5 w;
请注意,模块 input
和 inout
端口具有 wire
作为隐式对象种类。 reg
和 logic
也是 4 状态类型的同义词,logic
是首选关键字。 reg
并不总是与 register.
关联
当使用 typedef 声明用户定义类型时,这两种形式都被 EDA Playground 接受:
typedef reg[4:0] reg5;
typedef logic[4:0] logic5;
但是,如果基于 wire
类型做类似的事情,则此格式失败:
typedef wire[4:0] wire5;
我收到“语法错误”。
如何解释?
根据 IEEE 标准 1800-2017,用 wire
类型声明 typedef
是非法的。参考6.18节用户自定义类型:
type_declaration ::= // from A.2.1.3
typedef data_type type_identifier { variable_dimension } ;
A wire
不是 data_type
,而 reg
和 logic
是。 wire
是 net_type
.
A typedef
定义了一个 数据类型 可以应用于网络或变量对象种类。由于隐式定义,很难保持与 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;
您可以对两者使用 typedef
:
typedef 逻辑 [4:0] uint5;
var uint5 v; // var can be implicit
wire uint5 w;
请注意,模块 input
和 inout
端口具有 wire
作为隐式对象种类。 reg
和 logic
也是 4 状态类型的同义词,logic
是首选关键字。 reg
并不总是与 register.