Verilog 如何在合成级别访问文本文件

Verilog 如何在合成级别访问文本文件,verilog,fpga,lattice-diamond,Verilog,Fpga,Lattice Diamond,我正在使用Lattice Diamond编写Verilog代码进行合成 我有一个文本文件中的二进制数据,我想用它作为代码的输入 在模拟级别,我们可以使用$readmemb函数来实现。这是如何在合成级别完成的 我想访问文本文件中的数据作为FPGA的输入 正如Martin Thompson先生所建议的(下面的答案),我已经编写了一个Verilog代码来读取文件中的数据 Verilog代码如下所示:- module rom(clock,reset,o0); input clock,reset; o

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

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

将模拟视为一个环境而不是一个级别。您只需将DUT(被测设备)从RTL代码切换到综合网络列表,除此之外,您的模拟环境中不会有任何变化

从您给出的代码块来看,您似乎没有将fpga的测试和代码分开。你不应该试图综合你的测试,我建议你将它分为至少两个独立的模块,你的测试实例化你想放在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
或文件列出要拉入模拟的东西的代码,将其更改为指向合成版本


如果您要做的是初始化ROM,并将此数据保存在综合设计中,MartinThompson的回答涵盖了正确使用
$readmemb
的方法。

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

下面介绍一些内存初始化方法:

在这里:


是倒数第二张幻灯片上文件初始化RAM的示例。如果您只想要一个ROM,请省去“如果(我们)部分”。

谢谢您的帮助。由于我是Verilog的初学者,请详细说明您的答案。我无法解释您的确切要求。我使用的是Modelsim模拟器,在模拟过程中,我得到了正确的输出。但是在合成级别,$readmemb函数是不可合成的,那么在合成级别它的替代方案是什么呢level@SaadRafey现在问题和答案已更新,请删除这些评论以保持网站干净。通过使用函数$readmemb,我们可以初始化变量。我如何通过它初始化ROM,我如何知道访问的数据存储在ROM中,它的地址是什么?根据您建议的文档,它是写合成工具将读取十六进制文件来初始化内存。我很困惑$readmemh是不可合成的函数,合成工具将如何合成$readmemh并读取十六进制文件?
$readmem
是可合成的,只要它只在精化时调用-在“初始”阶段。在这一阶段,合成器拥有您电脑的全部资源,以确定最终网络列表中应该包含哪些内容。您不能在代码的“运行”部分调用
$readmem
——在
始终
块中,当您建议为ROM使用Verilog代码时,我已经在我的问题中对其进行了更新,并且在FPGA上实现它时,我面临一些问题(正在更新)。请在这方面帮助我。你现在有一个不同的问题,这应该是一个不同的问题(所以不是一个讨论板)。请还原您的编辑,并在中提出新问题it@Martin汤普森:谢谢你的建议
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