У меня есть набор интерфейсов. Я знаю, что массив экземпляров и интерфейсов не похож на обычные массивы, которые можно индексировать с помощью переменной, здесь мы должны индексировать с помощью константы (или с помощью блока генерации), и именно в этом проблема.
Я использую блок генерации для хранения идентификатора подчиненного устройства назначения, которому мастер отправляет пакеты в соответствии с предоставленным адресом. Здесь m_ahb — это массив интерфейсов мастера. Я также сохранил идентификатор подчиненного устройства назначения, т. Е. Для мастера 0 идентификатор назначения находится в dest_slave [0], для мастера 1 он находится в dest_slave [1] и так далее.
Пока здесь все хорошо.
Затем, скажем, для мастера 0 я использую значение dest_slave[0] для индексации массива подчиненных интерфейсов (s_ahb) и выбора соответствующего подчиненного интерфейса назначения для проверки сигнала и использования его в утверждении. Но теперь я получаю сообщение об ошибке «непостоянный индекс массива в массиве экземпляров».
Любая помощь/совет по этому поводу будет принята с благодарностью. Спасибо.
int dest_slave[NUM_MASTERS];
generate
for (genvar i = 0; i < NUM_MASTERS; i++) begin
always_ff @(posedge clk, negedge resetn) begin
if (m_ahb[i].haddr >= 'h0000_0000 && m_ahb[i].haddr <= 'h0000_ffff) dest_slave[i] = 0;
if (m_ahb[i].haddr >= 'h1000_0000 && m_ahb[i].haddr <= 'h1000_ffff) dest_slave[i] = 1;
if (m_ahb[i].haddr >= 'h4000_0000 && m_ahb[i].haddr <= 'h4000_ffff) dest_slave[i] = 2;
end
end
endgenerate
generate
for (genvar i = 0; i < NUM_MASTERS; i++) begin
assert property my_proprty(m_ahb[i].hburst,s_ahb[dest_slave[i]]].hburst); //this line creates error it is not liking s_ahb[dest_slave[i]]
end
endgenerate
Я предполагаю, что s_ahb
— это экземпляр модуля или не виртуальный интерфейс. К этим типам массивов путей нельзя получить динамический доступ. Вы можете создать логику для разделения зондирования и сопоставления.
int dest_slave[NUM_MASTERS];
int slave_hburst_val[NUM_MASTERS]; // <- change data type as needed
generate
for (genvar i = 0; i < NUM_MASTERS; i++) begin
always_ff @(posedge clk, negedge resetn) begin
if (m_ahb[i].haddr >= 'h0000_0000 && m_ahb[i].haddr <= 'h0000_ffff) dest_slave[i] = 0;
if (m_ahb[i].haddr >= 'h1000_0000 && m_ahb[i].haddr <= 'h1000_ffff) dest_slave[i] = 1;
if (m_ahb[i].haddr >= 'h4000_0000 && m_ahb[i].haddr <= 'h4000_ffff) dest_slave[i] = 2;
end
assign slave_hburst_val[i] = s_ahb[i].hburst; // intermediate assignment
assert property my_proprty( m_ahb[i].hburst, slave_hburst_val[ dest_slave[i] ] );
end
endgenerate
К вашему сведению: в вашем исходном коде есть лишний ]
. s_ahb[dest_slave[i]]].hburst