#verilog #fpga #hdl
Вопрос:
Я использую readmemh
, как:
reg [11:0] rom [0:121];
initial $readmemh("x.data", rom);
Мой x.data
файл выглядит так:
line 1: 1
line 2: 10
.
.
.
line 118: 1110101
line 119: 1110110
line 120: 1110111
Когда я пытаюсь использовать rom[20]
во время моделирования, я вижу значение XXX. Кроме того, я проверил все rom
значения данных во время моделирования, и я увидел XXX,XXX,..,XXX
Я не уверен, что использовал $readmemh
его должным образом.
Ответ №1:
Когда я использую ваш код для чтения файла, я получаю предупреждающие сообщения с 2 различными симуляторами. В обоих случаях имитатору не удается прочитать файл и загрузить данные в rom
переменную. Если я добавлю следующий код:
integer i;
initial for (i=0; i<=121; i=i 1) $displayb(rom[i]);
Я вижу x
все места внутри rom
. Вы объявили rom
как reg
тип, а reg
типы по умолчанию x
имеют значение .
Проблема в том, что Line 1:
, Line 2:
и т.д., Являются неправильным синтаксисом. Вам нужно удалить их из x.data
файла. Ваш файл должен выглядеть примерно так:
1
10
1110101
1110110
1110111
Тем не менее, я все еще получаю предупреждения симулятора, потому что симулятор интерпретирует 1110101
как шестнадцатеричное значение. Поскольку это значение слишком велико для 12-разрядной переменной, симулятор не загружает его rom
, оставляя значение по умолчанию x
.
Я предполагаю, что ваши данные на самом деле имеют двоичный формат, а не шестнадцатеричный. В этом случае используйте $readmemb
вместо $readmemh
:
initial $readmemb("x.data", rom);
Когда я совершаю это изменение, я больше не вижу x
.
См. IEEE Std 1800-2017, раздел 21.4 Загрузка данных массива памяти из файла для получения подробной информации о синтаксисе.