0

在 SystemVerilog 我可以做

typedef logic [15:0] bus16;
typedef reg [15:0] reg16;

interface myif;
   bus16 mybus;
   wor [15:0] myotherbus;
endinterface

但我做不到

typedef wor [15:0] wor16;

interface myif;
   wor16 myotherbus;
endinterface

我得到“未知的变量声明类型”

似乎,至少在我的 Synplicity 版本中,'wor' 的 typedef 是不允许的。

这是 IEEE1800 规范中定义的限制还是可能是错误?

4

2 回答 2

1

SystemVerilog 将网络/网络类型(类似于 VHDL 中已解析的信号)和变量(未解析)的概念与数据类型分开。网络类型wire, wand,wor等具有内置解析函数,默认数据类型为logic. 以下 net 声明是等价的:

wor [15:0] w;
wor logic [15:0] w;
typedef logic [15:0] bus16;
wor bus16 w;

类似地,以下变量声明是等价的:

logic [15:0] v;
var logic [15:0] v;
typedef logic [15:0] bus16;
var bus16 v;
bus16 v;

在大多数地方,var声明变量时关键字是隐含的。

有一个nettype声明将数据类型与用户定义的解析函数绑定。不幸的是,无法nettype使用内置解析函数之一定义 a,因此您必须编写自己的or函数。

于 2021-09-01T15:41:44.420 回答
0

这是不允许的,因为系统 Verilog 标准不允许netstypedefs 中使用。对不起,没有其他解释。

您可以查看第 6.18 段中的语法。遵循data_type定义。它基于系统 verilog vars,但不包括nets (6.8)。

您可以使用该nettype构造定义新的网络类型,但它仍然不允许您使用其他网络类型。但是,您可以使用自定义解析行为来创建它们(检查 6.6.7)。这是一种特殊的语法,不适合简单的重命名。顺便说一句,这两者wor都不是可合成的。

所以,你最好的选择是使用宏: `define wor16 wor[15:0]

于 2021-09-01T11:02:03.063 回答