Кто-нибудь может объяснить использование "$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

Другие вопросы по тегам