Разница между readmemb и $fscanf в verilog

В Verilog я могу найти две системные функции для чтения данных из текстового файла. Один идентификатор readmemb/readmemh, другой - fscanf. Я запутался в чем разница между двумя? Могу ли я просто всегда использовать readmemb/h и забыть о fscanf?

Насколько я понимаю, memreadb/h используется для инициализации памяти, но таким образом он может инициализировать любую переменную. Например, у меня есть текстовый файл с потоком 0 и 1, и я хочу прочитать его, сохранить и затем последовательно передавать их в регистр сдвига 1 бит каждые часы.

reg [63:0] seq_input;
$memreadb("pattern.in", seq_input);

Я думаю, что это приведет к тому, что потоки, равные нулю и единице, будут помещены в seq_input за один раз, а затем я смогу использовать задержку для передачи битов из этого в DUT. Зачем мне использовать fscanf и в чем разница?

1 ответ

Решение

Разница между $readmemb/h а также $fscanf как файл анализируется $fscanf представляет типичный интерфейс в стиле C для файла (в основном) и позволяет вам анализировать его так, как вы хотите, со строками формата. $readmemb/h принимает файл с очень четко определенной структурой и выполняет весь анализ за вас.

Таким образом, вы, вероятно, просто использовать $readmemb в вашем случае и не забудьте обработать анализ самостоятельно, но вы могли бы использовать $fscanf для работы, если вы действительно хотели (с большей работой в целом, вы должны сначала открыть файл как минимум). Помните, однако, что любой из этих системных вызовов должен быть сделан из процедурного блока, например так:

reg [63:0] seq_input;
...
initial begin
  $readmemb("my_file.b", seq_input);
end

Где ваш файл выглядит так в текстовом редакторе:

101001000110011...

Если вы хотите больше на $readmemb/h формат, я ответил на этот вопрос здесь: Как инициализировать содержимое предполагаемого блока RAM (BRAM) в Verilog

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