Введение и использование Verilog $ readmemb и $ readmemh

Формат $ readmemx:

Эти две системные задачи используются для чтения данных из файла в память. Его можно выполнить и использовать в любое время во время моделирования, и существует шесть используемых форматов:

$readmemb("<数据文件名>",<存贮器名>)
$readmemb ("<数据文件名>",<存贮器名>,<起始地址>)
$readmemb ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)

$readmemh("<数据文件名>",<存贮器名>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>)
$readmemh ("<数据文件名>",<存贮器名>,<起始地址>,<结束地址>)

В этих двух системных задачах содержимое файла данных для чтения может содержать только: пустые позиции (пробелы, разрывы строк, таблицы, строки комментариев, двоичные или шестнадцатеричные числа. Числа не могут содержать описания разрядности и Формат Описание для системных задач $ readmemb и $ readmemh, каждое число может быть двоичным или шестнадцатеричным, кроме того, числа должны быть разделены пробелом или строкой комментария.

Для шести вышеуказанных форматов системных задач необходимо добавить 5 пунктов:
(1) Если в операторе системной задачи и файле данных нет описания адреса, начальным адресом хранилища по умолчанию является начальный адрес в операторе определения памяти. . Данные в файле данных постоянно хранятся в памяти до тех пор, пока блок хранения не заполнится или данные в файле данных не будут исчерпаны.
(2) Если начальный адрес хранилища указан в системной задаче, но конечный адрес хранилища не указан, данные будут храниться от начального адреса до конечного адреса в операторе определения памяти.
(3) Если и конечный адрес, и начальный адрес указаны в операторе системной задачи, данные в файле данных будут храниться в блоке хранения в соответствии с начальным адресом до конечного адреса, независимо от памяти. Задайте начальный и конечный адреса выписки.
(4) Если информация об адресе указана как в системной задаче, так и в файле данных, адрес в файле данных должен находиться в пределах диапазона, объявленного параметром адреса в системной задаче. В противном случае отображается ошибка и операция загрузки данных в память прерывается.
(5) Если количество данных в файле данных отличается от количества данных, подразумеваемых начальным адресом и конечным адресом в системной задаче, также должно появиться сообщение об ошибке.

Простой код:

module data_read;

reg [31:0] mem [0:11];
integer i;

initial $readmemh("./data.txt",mem);

initial begin
  for(i=0; i<12; i=i+1)
    $display("%d: %h", i, mem[i]);
end

endmodule

data.txt

// Hexadecimal values for $readmemh demo
 // can include comments with double forward slash (standard Verilog comment)
 // second 32-bit value
 // third value
 // etc.

// can break up into related groups, insert comments, etc.

8e700002
ae700001
1232fffa
1210fff9  // last value

нота: 

Если ширина mem отрегулирована на [15: 0], будет сгенерирована ошибка и вывод не будет

Предупреждение: (vsim-PLI-3406) Слишком много цифр (8) в данных в строке 2 файла "./data.txt". (Максимум 4.): data_read.v (6)

Если ширина мем настроена на [63: 0], результат станет

# 0: 0000000002328020

# 1: 0000000002328022

# 2: 0000000002328024 

Это сравнение показывает, что системные задачи читаются по строкам.

нота:$readmemb和$readmemh只能读取二进制和十六进制。

рекомендация

отblog.csdn.net/qq_33231534/article/details/106167484