Формат $ 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
Это сравнение показывает, что системные задачи читаются по строкам.