我正在使用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.
我无法理解为什么我会收到此警告以及如何解决此问题。
答案 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
通过includes
,incdir
或文件列表,将thing_to_test(DUT)的代码拉入模拟,将其更改为指向合成版本。
如果您要做的是初始化ROM,并将数据保存在合成设计中,Martin Thompson的答案将涵盖$readmemb
的正确用法。