【问题标题】:How to access text files at synthesis level如何在综合级别访问文本文件
【发布时间】:2013-02-07 06:44:54
【问题描述】:

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

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

【问题讨论】:

  • 你现在有一个不同的问题,值得一个不同的问题(所以不是讨论板)。请还原您的编辑并提出一个新问题,其中包含新问题
  • @Martin Thompson 感谢您的建议

标签: verilog fpga lattice-diamond


【解决方案1】:

一种方法是将数据构建到您已综合的网表中。您可以使用 $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) 部分。

【讨论】:

  • 通过使用函数 $readmemb 我们可以初始化一个变量。如何通过它初始化 ROM,如何知道访问的数据存储在 ROM 中以及它的地址是什么?
  • 根据你建议的文档写成合成工具会读取hex文件来初始化内存。我很困惑 $readmemh 是不可合成的功能,合成工具如何合成 $readmemh 并读取 hex 文件?
  • $readmem 是可综合的,只要它仅在精化时调用 - 在“初始”阶段。在此阶段,合成器拥有您 PC 的全部资源来确定最终网表中应该包含哪些内容。您不能在代码的“运行”部分调用$readmem - 例如在always 块中
  • 正如您为 ROM 建议的 Verilog 代码,我已经在我的问题中更新了它,并且在 FPGA 上实现它时遇到了一些问题(有问题更新)。请在这方面帮助我。
【解决方案2】:

将模拟视为环境而非关卡。您应该只是将 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 的正确用法。

【讨论】:

  • 感谢您的帮助。由于我是 Verilog 的初学者,请您详细说明您的答案。
  • 我无法解释你到底在问什么?
  • 我正在使用 Modelsim 模拟器,在模拟过程中我得到了正确的输出。但是在综合级别,$readmemb 函数是不可综合的,那么在综合级别有什么替代方法
  • @SaadRafey 现在问题和答案已经更新,请您删除这些 cmets 以保持网站清洁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2013-08-24
  • 1970-01-01
相关资源
最近更新 更多