Кто-нибудь может объяснить использование "$sreadmemh" в SystemVerilog? Я нигде не получаю четкого объяснения
Пожалуйста, объясните, как этот код работает...
module top;
//string mem [5];
real mem [5];
initial begin
$sreadmemh(mem,2,3,"A","B");
$display("mem = %p",mem);
end
endmodule
1 ответ
Как вы правильно нашли, $sreadmemh
а также $sreadmemb
они определены как дополнительные системные задачи в IEEE 1800-2009 (возможно, в IEEE 1800-2005, я не могу проверить это так же легко). Они в основном служат дополнением к традиционным $readmemh
а также $readmemb
, принимая строковые аргументы вместо имени файла.
Из LRM (пр.14):
$sreadmemb ( mem_name , start_address , finish_address , string { , string } ) ;
$sreadmemh ( mem_name , start_address , finish_address , string { , string } )
Системные задачи
$sreadmemb
а также$sreadmemh
загрузить данные в памятьmem_name
из строки символов.
$sreadmemh
а также$sreadmemb
системные задачи принимают значения данных памяти и адреса в виде строковых литералов. Начальный и конечный адреса указывают границы, в которых данные из строк будут храниться в памяти. Эти строки имеют тот же формат, что и строки, которые появляются во входных файлах, передаваемых в качестве аргументов$readmemb
а также$readmemh
В принципе, если они поддерживаются, их можно использовать как $readmemh
или же $readmemb
где нет файла (таким образом, нет аргумента имени файла), но вместо этого вы можете поместить то, что будет содержимым файла, непосредственно в виде строки и использовать это в функции инициализации (вроде как fscanf
против sscanf
в с). Однако в отличие от $readmemh
или же $readmemb
, начальный и конечный адреса не являются обязательными, и вы можете поместить столько строковых аргументов, сколько захотите, и их так, как если бы они были соединены вместе. Итак, это все одно и то же:
logic [7:0] mem[10];
...
$sreadmemh(mem, 0, 9, "AB", "BC", "12");
$sreadmemh(mem, 0, 9, "AB BC 12");
$sreadmemh(mem, 0, 9, {"AB", " BC", " 12"});
Обратите внимание, что поскольку входная строка обрабатывается так же, как это было бы для $readmemh
а также $readmemb
, вы можете разделить значения по любому пробелу, используйте 'bx
а также 'bz
для четырех переменных состояния, и используйте @addr
начать загрузку по определенным адресам. Более подробную информацию об этом формате можно найти в IEEE 1800-2012 21.4 или в другом ответе: Как инициализировать содержимое предполагаемого блочного ОЗУ (BRAM) в Verilog