如何在综合级别访问文本文件

时间:2013-02-07 06:44:54

标签: verilog fpga lattice-diamond

我正在使用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.

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

2 个答案:

答案 0 :(得分:2)

一种方法是将数据构建到已合成的网表中。您可以使用$readmemb初始化包含数据的只读存储器(ROM),然后从设备中将其作为普通存储器进行访问。

以下是一些内存初始化方法的介绍:

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)部分。

答案 1 :(得分:0)

将Simulation视为一种环境而非一种水平。您应该将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

通过includesincdir或文件列表,将thing_to_test(DUT)的代码拉入模拟,将其更改为指向合成版本。

如果您要做的是初始化ROM,并将数据保存在合成设计中,Martin Thompson的答案将涵盖$readmemb的正确用法。