【问题标题】:How do I access elements in a packed struct by index?如何按索引访问打包结构中的元素?
【发布时间】: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


【解决方案1】:

verilog 没有办法做你想做的事。您可能会使用宏或对结构字段的位级访问来解决问题。

宏可以这样完成:

`define ACCESS_REG(R, NUM) R.info``NUM
module_info_registers_t regs;
`ACCESS_REG(regs, 1).data1 = 0;

假设某些命名约定应用于字段,上述方法将起作用。

通过位级访问,您需要能够计算每个结构成员的偏移量和宽度,从而使声明和使用更加复杂。为了清楚起见,这是一个非常简化的 System Verilog 示例:

typedef struct packed {
  logic [1:0] f1;
  logic [2:0] f2;
  logic [3:0] f3;
} sp_t;

sp_t sp;
sp[$bits(sp.f3) + $bits(sp.f2)  +: $bits(sp.f3)] = 2'b10;

上面的例子将设置'sp.f1'。

因此,在您的情况下,您可以创建描述相应字段的偏移量和宽度的参数数组,并将它们用于索引。因此,类似的事情可能适用于您的情况:

parameter int info[2] = {0, 32};
parameter int data1Offset[2] = {31, 30};
parameter int data1Width[2] = {1, 2};

module_info_registers_t regs;
regs[info[1] + data1Offset[1] +: data1Width[1]] = 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    相关资源
    最近更新 更多