2013-07-11 1 views
0

Я имитирую 16-битный список соединений MIPS в Icarus Verilog. Это ошибка, я получаю в тестбенчеМоделирование Icarus Verilog: выражение индекса области не является постоянным: i

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 сбрасывал out.In случай списка соединений, я даже не получить VCD файл сгенерирован. Был бы рад услышать ваши мысли.

+0

Как определить 'reg_array'? Пожалуйста, определите «целое число i;» внутри задачи. Там могут быть конфликтующие драйверы с одним и тем же «я». – Greg

+0

попытался добавить целое число i; он говорит синтаксическую ошибку в строке integer i; Ошибка mips_16_core_top_tb_0.v: 140: ошибка синтаксиса mips_16_core_top_tb_0.v: 140: ошибка: неверно сформированное заявление – user2548629

+0

Переместить 'целого числа я,' 'перед тем begin'. Вы не можете прикрепить файл здесь напрямую. Вы можете загрузить его на сайт совместного доступа к файлам с открытым доступом (или своим личным сайтом) и предоставить ссылку. – Greg

ответ

1

Ваш код выглядит отлично, и я только что проверил кросс-модульную индексацию переменных массивов в Icarus (текущая версия, от git), и он работает.

Я подозреваю, что ваша проблема заключается в том, что вы сами компилируете mips_16_core_top_tb_0.v - Icarus предоставит это сообщение, если вы это сделаете. Все исходные файлы должны быть скомпилированы вместе в Icarus. Некоторые другие симуляторы позволят вам скомпилировать этот файл сами по себе, а затем проверять только ошибки во время разработки (т. Е. При запуске имитации), но так, как это делает Икарус, именно так и предполагалось использовать Verilog.

+0

Что вы подразумеваете под компиляцией самостоятельно и исходными файлами, которые нужно скомпилировать вместе?. Вы говорите, что я должен упомянуть имена файлов вообще во время выполнения. Извините, что я новичок. – user2548629

+0

У меня есть версия Icarus 9.5, одна из которых предшествует текущему – user2548629

+1

Запустите команду компиляции как 'iverilog file1.v file2.v .... filen.v', т.е. поместите * все * ваши исходные файлы в командной строке 'iverilog'. Это дает вам исполняемый файл, называемый 'a.out' или что-то подобное. 'iverilog' должен сразу увидеть все исходные файлы, чтобы проверить наличие ошибок и создать исполняемый файл. Verilog не имеет спецификации для «компиляции одного файла за один раз и ссылки и проверки других ошибок позже», как некоторые языки. Однако некоторые производители все равно это сделали. Другими словами, эти поставщики позволят вам скомпилировать «один за раз», но Икар не делает этого. – EML

0

Ваш индекс в регистре [index] должен быть постоянным в этой ситуации. В reg_array [i] i является переменной и не фиксируется. Чтобы имитировать использование этого кода, вы должны переделать проект так, чтобы он не требовал индекса с индексом переменной. Это может быть отсутствие поддержки синтаксиса для этой функции. Если это так, вам следует попробовать другой симулятор.

+0

Изменили индексированное значение на число, все равно я получаю ту же ошибку. Должен ли я объявить реестр в списке портов ?. – user2548629

+0

Хм, когда вы говорите номер, вы имеете в виду константу, такую ​​как число «0»? Ошибка не связана с объявлениями портов. Если вы можете предоставить минимальный размер скомпилируемого примера проблемы, я уверен, что я могу быть более полезным. – travisbartley

Смежные вопросы