Как получить доступ к текстовым файлам на уровне синтеза
Я пишу код Verilog с использованием Lattice Diamond для синтеза.
У меня есть двоичные данные в текстовом файле, которые я хочу использовать в качестве ввода для моего кода.
На уровне симуляции мы можем использовать функцию $readmemb. Как это делается на уровне синтеза?
Я хочу получить доступ к данным, присутствующим в текстовом файле, в качестве входных данных для ПЛИС.
По предложению г-на Мартина Томпсона (ответы ниже) я написал код Verilog для чтения данных из файла.
Код Verilog указан ниже:
module rom(clock,reset,o0);
input clock,reset;
output o0;
reg ROM [0:0];
reg o0;
initial
$readmemb("rom.txt",ROM);
always @(negedge clock,negedge reset )
begin
if(reset==0)
begin
o0<=0;
end
else
begin
o0<=ROM[0];
end
end
endmodule
Когда я запускаю этот код на fpga, я сталкиваюсь с проблемой ниже:-
Если текстовый файл, который я хочу прочитать, имеет только один бит, равный '1', тогда я могу назначить входные выходные контакты для синхронизации, сброса и ПЗУ. Но если у меня есть один бит, который равен "0" или больше, чем один бит данных в текстовом файле, я не могу назначить входные контакты (например, часы, сброс) и отображается предупреждение:-
WARNING: IO buffer missing for top level port clock...logic will be discarded.
WARNING: IO buffer missing for top level port reset...logic will be discarded.
Я не могу понять, почему я получаю это предупреждение и как я могу его разрешить.
2 ответа
Один из способов - встроить данные в список соединений, который вы синтезировали. Вы можете инициализировать постоянное запоминающее устройство (ПЗУ) с данными, используя $readmemb
а затем получить доступ к нему как к обычной памяти из вашего устройства.
Вот введение в некоторые методы инициализации памяти:
http://myfpgablog.blogspot.co.uk/2011/12/memory-initialization-methods.html
И здесь:
http://rijndael.ece.vt.edu/schaum/slides/ddii/lecture16.pdf
пример инициализированного файлом ОЗУ на втором до последнего слайде Если вы хотите просто ROM, оставьте if (we)
часть.
Думайте о симуляции как о среде, а не как об уровне. Вы должны просто переключать DUT (тестируемое устройство) с RTL-кода на синтезированный список соединений, кроме этого ничего не должно измениться в вашей среде симуляции.
Из блока кода, который вы дали, не похоже, что вы отделяете тест и код для fpga. Вы не должны пытаться синтезировать ваш тест, я бы порекомендовал разделить его по крайней мере на 2 отдельных модуля, чтобы ваш тест создавал экземпляр кода, который вы хотите поместить в fpga. Довольно уверен $fwrite
также не синтезируется.
Простой тестовый пример может выглядеть так:
module testcase
//Variables here
reg reg_to_drive_data;
thing_to_test DUT (
.input_ports ( reg_to_drive_data )
.output_ports ()
...
);
//Test
initial begin
#1ns;
reg_to_drive_data = 0;
...
end
endmodule
С помощью includes
, incdir
или в файле перечислены коды для thing_to_test (DUT), которые извлекаются в симуляцию, измените это, чтобы указать на синтезированную версию.
Если то, что вы пытаетесь сделать, это инициализировать ПЗУ и хранить эти данные в синтезированной схеме, то ответ Мартина Томпсона охватывает правильное использование $readmemb
за это.