【问题标题】:System Verilog typedef of typedeftypedef 的 System Verilog typedef
【发布时间】:2020-02-07 03:57:53
【问题描述】:

typedef enums 提供了一种方便的方式来描述一组名称-值对。有没有办法在所有级别使用枚举来链接它们以创建更深层次的结构?

例如,我有以下内容:

typedef enum logic {ALPHA=0, BETA=1} a_t;
typedef enum logic {GAMMA=0, DELTA=1} b_t;
typedef enum logic {ZETA=0, ETA=1} c_t;
...

我想创建一个由a_tb_t 组成的变量c。这可能吗?

类似:

a_t b_t c;

所以在c 的每个维度上,我都可以拥有enums。

编辑:一些澄清 - 假设 a_tb_tc_t 是不可变的,因为它们是自动生成的。并且有数百个这样不同的枚举。我想根据需要创建更大的结构,因为自动生成它们的所有组合会使代码变得太大和混乱。

例如,假设我的a_t 描述了主设备的数量,而b_t 描述了从设备的数量。我想创建一个结构,在我的信号中有这个层次结构,同时允许enums 让它们易于阅读和使用。

所以,是这样的:

c[MASTER_0][SLAVE_0]
c[MASTER_0][SLAVE_1]
c[MASTER_1][SLAVE_0]
c[MASTER_1][SLAVE_1]

【问题讨论】:

  • 我不明白你想要c 是什么。您谈到“维度”,这表明您需要一个数组。你能用一个typedef声明c吗?
  • 看起来你希望你的 'c' 是一个包含所有 4 个常量的枚举。这是不可能。您可以通过struct {a_t c1; b_t c2} c; 创建一个结构
  • 结构 a_tb_t 是不可变的。我想知道是否有办法使用两个单独的枚举并使用这两个创建第三个。

标签: enums typedef system-verilog


【解决方案1】:

您可能指的是associative array,例如:

c[ALPHA] = BETA;

如果是这样,您可以简单地将其称为:

b_t c[a_t];

这意味着创建一个关联数组c,其键是枚举a_t,值是枚举b_t。如果你愿意,你可以继续:)

typedef enum logic {ALPHA=0, BETA=1} a_t;
typedef enum logic {GAMMA=0, DELTA=1} b_t;
typedef enum logic {BAD_AT=0, GREEK_LETTERS=1} c_t;

c_t my_data_structure[a_t][b_t];

// Assigning a value
my_data_structure[ALPHA][GAMMA] = GREEK_LETTERS;

查看 EDA Playground here 上的示例。

另外,我认为您对typedef 的使用有点误解。它并没有准确地描述一组名称-值对,而是为数据类型提供了一个新名称。 enum 实际上是在创建“一组名称-值对”,但我要澄清的是,它本质上是为值分配标识符。如果您能解释申请以获得更清晰的答案,将会有所帮助。

【讨论】:

  • 对问题添加了一些澄清性的编辑。 a_tb_t 类型是不可变的。我只需要一种方法来使用这两个创建第三种类型。而且我无法修改现有类型。
  • 感谢您的出色回答,阿伦!这对我有用。那么这里的区别是我们使用的是未打包的数组,而不是我的问题中的打包数组吗?这样做还有其他副作用吗?
  • 所以,这不是一个未打包的数组。这是一个关联数组(通过键引用值)。语法看起来很相似,但索引不是通过线性数字完成的,就像使用打包或解包数组一样。有关详细信息,请参阅我的答案中的链接。
  • 知道了!谢谢。
【解决方案2】:

您不能从另一个或一组其他人创建一个enum typedef。有些人可能称之为扩展枚举。您也不能拥有具有多个名称的 enum 相同的值。

您可以做的是拥有一个包含名称/值对的关联数组,并将这些数组连接在一起。

int a[string], b[string], c[string];
initial begin
       a = '{"ALPHA":0, "BETA":1};
       b = '{"GAMMA":0, "DELTA":1};
       c = a;
       foreach(b[s]) c[s]=b[s];
end

还有一些方法可以收集每个枚举类型的名称来初始化关联数组。

【讨论】:

  • 对问题添加了一些澄清性的编辑。 a_tb_t 类型是不可变的。我只需要一种方法来使用这两个创建第三种类型。而且我无法修改现有类型。
  • 我已经更新了我的答案,以澄清你不能直接在 SystemVerilog 中做你想做的事。无论如何,您都不能拥有具有重复编码的 typedef。使用相同或另一个脚本生成组合类型的关联数组。
  • 请注意,散列密钥时性能会下降。可能,它不会很重要,但最好知道:) 具体来说,枚举是数字的标识符(我认为是 32 位),但是字符串比 32 位长,并且会因访问而受到惩罚。我确实相信这是将它们结合起来的唯一合理方法。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2015-01-27
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多