$readmemh не считывает значения из файла данных

#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 Загрузка данных массива памяти из файла для получения подробной информации о синтаксисе.