Как правильно преобразовать массивы в SystemVerilog?

Приведение битового потока в SystemVerilog для массивов и структур не кажется очень безопасным.

Например, следующая проблема с кастингом будет обнаружена только во время выполнения (а это может занять несколько часов в симуляции):

bit [31:0] bit_queue[$];
logic [31:0] logic_array[5];
for (int i = 0; i < 10; i++) begin
  bit_queue[i] = $urandom;
end

if (catch_issue) begin
  typedef logic [31:0] logic_array_t [5];
  logic_array = logic_array_t'(bit_queue); // <-- ISSUE
end

Существует ли надлежащая «безопасная» процедура для приведения битового потока? Где какие-либо проблемы могут быть обнаружены во время компиляции или безопасно обработаны во время выполнения? Или язык сломан в этом случае?

Пример кода выше на EDA Playground: http://www.edaplayground.com/x/2tp


person Victor Lyuboslavsky    schedule 24.04.2014    source источник


Ответы (2)


Подобно $cast, пользователь должен проверять совместимость во время выполнения с

if ( $bits(bit_queue) == $bits(logic_array) )
  logic_array = logic_array_t'(bit_queue);
else
  $error("sizes do not match");

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

person dave_59    schedule 25.04.2014

Поскольку вы используете очередь (подразумевая размер переменной) в RHS, я не думаю, что компилятор может статически проверить это (поскольку он не оценивает цикл for). Обратите внимание, что если вы измените свой typedef на неупакованный массив фиксированного размера > 5 записей, вы получите ошибку времени компиляции.

person msy2    schedule 24.04.2014