【问题标题】:Using typedef with wire in SystemVerilog在 SystemVerilog 中使用带有线的 typedef
【发布时间】:2021-12-31 18:01:00
【问题描述】:
当使用 typedef 声明一个用户定义的类型时,这两种形式都被 EDA Playground 接受:
typedef reg[4:0] reg5;
typedef logic[4:0] logic5;
但是,如果基于wire 类型做类似的事情,那么这种格式会失败:
typedef wire[4:0] wire5;
我收到“语法错误”。
这怎么解释?
【问题讨论】:
标签:
verilog
typedef
system-verilog
edaplayground
【解决方案1】:
根据 IEEE Std 1800-2017,使用 wire 类型声明 typedef 是非法的。请参阅第 6.18 节 用户定义的类型:
type_declaration ::= // from A.2.1.3
typedef data_type type_identifier { variable_dimension } ;
wire 不是data_type,而reg 和logic 是。 wire 是 net_type。
【解决方案2】:
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-state 类型的同义词,logic 是首选关键字。 reg 并不总是与 register 相关联。