Индексирование массива экземпляров и интерфейсов - PullRequest
0 голосов
/ 19 июня 2019

У меня есть массив интерфейсов.Я знаю, что массив экземпляров и интерфейсов не похож на обычные массивы, которые могут быть проиндексированы с помощью переменной, здесь мы должны индексировать с помощью константы (или использовать блок генерации), и это именно проблема.

Яиспользование генерирующего блока для хранения идентификатора подчиненного получателя, которому ведущий отправляет пакеты в соответствии с предоставленным адресом. Здесь m_ahb - массив мастер-интерфейсов.Я также получил сохраненный идентификатор подчиненного устройства, т. Е. Для мастера 0 идентификатор назначения находится в dest_slave [0], для мастера 1 он находится в dest_slave [1] и т. Д.

Пока здесь все хорошо.

Затем, скажем, для master 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

1 Ответ

2 голосов
/ 19 июня 2019

Я предполагаю, что 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

...