在 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,而 reglogic 是。 wirenet_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;

请注意,模块 inputinout 端口具有 wire 作为隐式对象种类。 reglogic 也是 4 状态类型的同义词,logic 是首选关键字。 reg 并不总是与 register.

关联