Icarus Verilog моделирование: выражение индекса области не является постоянным: я
Я имитирую 16-битный список соединений MIPS в Icarus Verilog. Это ошибка, которую я получаю в testbench
mips_16_core_top_tb_0.v:144: error: Scope index expression is not constant: i
mips_16_core_top_tb_0.v:144: error: Unable to bind wire/reg/memory `uut.register_file_inst.reg_array[i]' in `mips_16_core_top_tb_0_v.display_all_regs'
Related code :
task display_all_regs;
begin
$display("display_all_regs:");
$display("------------------------------");
$display("R0\tR1\tR2\tR3\tR4\tR5\tR6\tR7");
for(i=0; i<8; i=i+1)
$write("%d\t",uut.register_file_inst.reg_array[i]); <--- error points to this line
$display("\n------------------------------");
end
endtask
Я получаю ту же самую ошибку, когда я симулирую RTL, но я все еще получаю выгруженный файл vcd. В случае списка соединений я даже не получаю сгенерированный файл vcd. Был бы рад услышать ваши мысли.
2 ответа
Ваш код выглядит хорошо, и я только что протестировал межмодульную индексацию массивов в Icarus (текущая версия, из git), и она работает.
Я подозреваю, что ваша проблема в том, что вы компилируете mips_16_core_top_tb_0.v
сам по себе - Икар даст это сообщение, если вы это сделаете. Все исходные файлы должны быть скомпилированы вместе в Icarus. Некоторые другие симуляторы позволят вам скомпилировать этот файл самостоятельно, а затем проверять только ошибки во время разработки (т. Е. Когда вы запускаете симуляцию), но способ, которым Icarus делает это, - это то, как изначально планировалось использовать Verilog.
Ваш индекс в регистре [index] должен быть постоянным в этой ситуации. В reg_array[i] i является переменной и не является фиксированной. Для имитации использования этого кода вы должны переделать дизайн так, чтобы он не нуждался в регистре с переменными индексами. Это может быть отсутствие поддержки этой функции на тренажере. Если это так, вы должны попробовать другой симулятор.