2014-04-24 3 views
1

Битовая обработка потока в 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

ответ

2

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

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

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

0

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