0

我正在使用 Lattice Diamond 编写 Verilog 代码进行综合。

我在一个文本文件中有二进制数据,我想将其用作我的代码的输入。

在模拟级别,我们可以使用$readmemb函数来做到这一点。这是如何在综合层面完成的?

我想访问文本文件中存在的数据作为 FPGA 的输入。

正如 Martin Thompson 先生所建议的(答案如下),我编写了一个 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.

我无法理解为什么会收到此警告以及如何解决它。

4

2 回答 2

2

一种方法是将数据构建到您已综合的网表中。您可以使用数据初始化只读存储器 (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,请忽略该if (we)部分。

于 2013-02-07T10:44:59.913 回答
0

将模拟视为一个环境而不是一个关卡。您应该只是将 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

Viaincludesincdirfile 列出了 thing_to_test (DUT) 的代码被拉入模拟,将其更改为指向合成版本。

如果您要做的是初始化 ROM,并将这些数据保存在综合设计中,Martin Thompson 的回答涵盖了这个的正确用法$readmemb

于 2013-02-07T08:59:18.823 回答