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

Я пишу код Verilog, используя Алмаз Решетки для синтеза.

У меня есть двоичные данные в текстовом файле, который я хочу использовать в качестве входа для моего кода.

На уровне моделирования мы можем использовать $readmemb функция, чтобы сделать это. Как это сделано на уровне синтеза?

Я хочу получить доступ к данным, существующим в текстовом файле как вход для FPGA.

Как предложил г-н Мартин Томпсон (отвечает ниже) я написал код 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' тогда, я в состоянии назначить булавки ввода-вывода на часы, перезагрузить и ROM. Но если у меня есть один бит, который является '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.

Я неспособен понять, почему я получаю это предупреждение и как я могу решить его.

0
У вас теперь есть различная проблема, которая заслуживает различного вопроса (ТАК не форум). Пожалуйста, вернитесь ваш, редактирует, и поднимите новый вопрос с новой проблемой в нем
добавлено автор Martin Thompson, источник
@Martin Томпсон спасибо за ваше предложение
добавлено автор Saad Rafey, источник

3 ответы

Один путь состоит в том, чтобы встроить данные в netlist, который вы синтезировали. Можно инициализировать постоянную память (ROM) с данными, используя $readmemb и затем доступ что как нормальная память из устройства.

Вот введение в некоторые методы инициализации памяти:

http://myfpgablog.blogspot.co.uk/2011/12/memory-initialization-methods.html

И в здесь:

http://rijndael.ece.vt.edu/schaum/slides/ddii/lecture16.pdf

пример инициализированной файлом RAM на предпоследнем понижении. Если вы хотите просто ROM, не учитываете если (мы) часть.

2
добавлено
<кодовый> $readmem synthesisable, пока это только называют во время разработки - на "начальных" стадиях. Во время этой стадии у синтезатора есть полные ресурсы вашего PC, чтобы выяснить то, что должно войти в финал netlist. Вы can' t требование $readmem в "бегущей" части вашего кода - в всегда блокируют, например,
добавлено автор Martin Thompson, источник
Поскольку вы предложили код Verilog для ROM, я обновил его в своем вопросе, и я сталкиваюсь с некоторой проблемой, осуществляя его на FPGA (обновил рассматриваемый). Пожалуйста, помогите мне в этом отношении.
добавлено автор Saad Rafey, источник
Согласно документу, предложенному вами, это написано инструменты Синтеза прочитают шестнадцатеричный файл, чтобы инициализировать память . Я смущен $readmemh является unsynthesisable функцией, как инструмент синтеза синтезирует $readmemh и прочитает шестнадцатеричный файл?
добавлено автор Saad Rafey, источник
При помощи функции $readmemb мы можем инициализировать переменную. То, как я могу инициализировать ROM через него, как я знал бы, что данные получили доступ, сохранено в ROM и каков его адрес?
добавлено автор Saad Rafey, источник

Думайте о Моделировании как об окружающей среде не уровень. Необходимо просто переключать DUT (Устройство При Тесте) от кода RTL до синтезируемого netlist, кроме этого ничто не должно изменяться в среде моделирования.

От блока кода, который вы дали, не похоже, что вы выделяете тест и код для fpga. Вы не должны пытаться синтезировать свой тест, я рекомендовал бы разделить его по крайней мере между 2 отдельными модулями, ваш тест, иллюстрирующий примерами код, который вы хотите поместить в fpga. Вполне уверенный $fwrite также не synthesizable.

Простой тестовый сценарий мог бы быть похожим:

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

С помощью включает , incdir или списки файлов, код для thing_to_test (DUT) втягивается к моделированию, измените это, чтобы указать на синтезируемую версию.

Если то, что вы пытаетесь сделать, инициализируют ROM и держатся, эти данные в синтезируемом ответе Мартина Томпсона дизайна покрывают правильное использование $readmemb для этого.

0
добавлено
@SaadRafey теперь Вопрос и ответы были обновлены, могли вы, пожалуйста, удалять эти комментарии, чтобы содержать место в чистоте.
добавлено автор Morgan, источник
Большое спасибо
добавлено автор Saad Rafey, источник
Выше мой код, который я пытаюсь синтезировать
добавлено автор Saad Rafey, источник
Я использую симулятор Modelsim, во время моделирования, я получаю правильную продукцию. Но на уровне синтеза, $readmemb функция не synthesizable, поэтому какова альтернатива для него на уровне синтеза
добавлено автор Saad Rafey, источник
Я неспособен интерпретировать то, что точно вы спрашиваете?
добавлено автор Saad Rafey, источник
Спасибо за вашу помощь. Поскольку я - новичок в Verilog, пожалуйста разработайте свой ответ.
добавлено автор Saad Rafey, источник

Думайте о Моделировании как об окружающей среде не уровень. Необходимо просто переключать DUT (Устройство При Тесте) от кода RTL до синтезируемого netlist, кроме этого ничто не должно изменяться в среде моделирования.

От блока кода, который вы дали, не похоже, что вы выделяете тест и код для fpga. Вы не должны пытаться синтезировать свой тест, я рекомендовал бы разделить его по крайней мере между 2 отдельными модулями, ваш тест, иллюстрирующий примерами код, который вы хотите поместить в fpga. Вполне уверенный $fwrite также не synthesizable.

Простой тестовый сценарий мог бы быть похожим:

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

С помощью включает , incdir или списки файлов, код для thing_to_test (DUT) втягивается к моделированию, измените это, чтобы указать на синтезируемую версию.

Если то, что вы пытаетесь сделать, инициализируют ROM и держатся, эти данные в синтезируемом ответе Мартина Томпсона дизайна покрывают правильное использование $readmemb для этого.

0
добавлено
@SaadRafey теперь Вопрос и ответы были обновлены, могли вы, пожалуйста, удалять эти комментарии, чтобы содержать место в чистоте.
добавлено автор Morgan, источник
Выше мой код, который я пытаюсь синтезировать
добавлено автор Saad Rafey, источник
Большое спасибо
добавлено автор Saad Rafey, источник
Я использую симулятор Modelsim, во время моделирования, я получаю правильную продукцию. Но на уровне синтеза, $readmemb функция не synthesizable, поэтому какова альтернатива для него на уровне синтеза
добавлено автор Saad Rafey, источник
Я неспособен интерпретировать то, что точно вы спрашиваете?
добавлено автор Saad Rafey, источник
Спасибо за вашу помощь. Поскольку я - новичок в Verilog, пожалуйста разработайте свой ответ.
добавлено автор Saad Rafey, источник