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