【发布时间】:2019-03-18 19:41:52
【问题描述】:
我有以下结构:
typedef struct packed {
type1_t info1;
type2_t info2;
} module_info_registers_t;
typedef struct packed {
logic [0:0] data1;
logic [2:0] data2;
logic [11:0] data3;
logic [15:0] data4;
} info1;
typedef struct packed {
logic [1:0] data1;
logic [3:0] data2;
logic [10:0] data3;
logic [14:0] data4;
} info2;
如您所见,type1_t 和 type2_t 被定义为 32 位数据结构。
我想实例化以下内容:
module_info_registers_t myregs;
我想根据索引访问寄存器(而不是输入 myreqs.info2.data4):
myregs[1].data4
这是因为 module_info_registers_t 的定义会不时改变并且是自动生成的,所以我不想在我的 RTL 中硬编码 'info2'
但是,我收到一条错误消息,提示我不能对标量对象进行切片。
我了解由于某种原因我无法以我想要的方式访问数据。还有其他方法可以实现我想要实现的目标吗?
【问题讨论】:
-
stackoverflow.com/questions/7613782/… 我会将所有成员迭代到一个列表中,然后您可以按索引访问。
-
@EJD,这是给 verilog 的。你的回答还适用吗?谢谢
-
我对verilog一无所知,更多的是为您指明方向。
-
如果名称 (
info2) 将更改,该特定寄存器的索引 ([1]) 是否也会更改?理想情况下,您的寄存器名称不会更改,您始终可以将寄存器称为info2 -
@Unn,是的,数据会改变。我有一个 FSM 将数据从一些寄存器发送到另一个模块。它对所有寄存器执行此操作,但在写入 RTL 时,寄存器的总数是未知的,但上限是已知的,因此可以适当地设置索引位宽。对于该结构中的大量 32 位数据结构,代码需要灵活。
标签: verilog system-verilog register-transfer-level