我具有以下结构:
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”进行硬编码
但是,我收到一个错误消息,说我无法在标量对象上切片。
我了解由于某种原因,我无法以自己想要的方式访问数据。我还有其他方法可以做我想达到的目标吗?
答案 0 :(得分:0)
verilog中无法执行您想要的操作。您可能会使用宏或对结构字段的位级访问来解决问题。
宏可以这样完成:
`define ACCESS_REG(R, NUM) R.info``NUM
module_info_registers_t regs;
`ACCESS_REG(regs, 1).data1 = 0;
假设某些命名约定应用于字段,以上内容将起作用。
使用位级访问,您需要能够计算每个struct成员的偏移量和宽度,从而使声明和用法更加复杂。为了清楚起见,这是一个非常简化的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;