Как получить доступ к текстовым файлам на уровне синтеза

Я пишу код 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 за это.

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