Разница между 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