Как получить доступ к элементам в упакованной структуре по индексу? - PullRequest
1 голос
/ 18 марта 2019

У меня есть следующие структуры:

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 будет меняться со временемна время и автоматически генерируется, поэтому я не хочу жестко кодировать 'info2' в моем RTL

Однако я получаю сообщение об ошибке, говорящее о том, что я не могу иметь срез на скалярном объекте.

Я понимаю, что по какой-то причине я не могу получить доступ к данным так, как хочу.Есть ли другой способ сделать то, что я пытаюсь достичь?

1 Ответ

0 голосов
/ 19 марта 2019

В 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;
...