我有一个用于Altera FPGA目标的存储器模块,我已将其编写为推断到Altera的ALTSYNCRAM模块之一。内存是1024x16,我有一个使用属性指定的内存初始化文件。 合成时,综合报告表明它生成了我想要的RAM块类型,它注意到初始化文件是我指定的那个。 当尝试使用Altera的ModelSim版本进行仿真时,数据信号完全未初始化,我无法弄清楚原因。 我查看论坛等等,有些人提到ModelSim可能不支持" .mif"我正在使用的格式,但会支持" .hex"所以我将初始化文件更改为" .hex"。我还读到相对文件路径可能是一个问题,但我检查了我的模拟目录,看起来QuartusII在我尝试模拟时将初始化文件复制到该目录中。
关于为什么记忆没有被初始化以及如何做到这一点的任何想法?
包含推断内存的重度修剪模型:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
--use work.types.all;
entity CPU is
--...
end entity CPU;
architecture rtl of CPU is
--these types are actually included in a package
subtype reg is std_logic_vector(15 downto 0);
type mem is array (0 to 1023) of reg;
--...
--memory read port
signal MR : reg;
signal MRA : std_logic_vector(9 downto 0); --flops
--memory write port
signal MW : reg; --flops
signal MWA : std_logic_vector(9 downto 0); --flops
signal MWE : std_logic; --flop
signal data : mem;
attribute ram_init_file : string;
attribute ram_init_file of data : signal is "RAM_init.hex";
attribute ramstyle : string;
attribute ramstyle of data : signal is "no_rw_check";
begin
--...
--memory spec
MR <= data(to_integer(unsigned(MRA(9 downto 0))));
memory_process : process(clk)
begin
if (clk'event and clk = '1') then
if(MWE = '1') then
data(to_integer(unsigned(MWA(9 downto 0)))) <= MW;
end if;
end if;
end process;
end architecture rtl; --CPU
在编译CPU.vhd时,Modelsim没有显示任何警告或错误,也没有任何加载初始化文件的指示。
这是我第一次使用Altera软件或内存初始化文件的设计,如果问题是真正基本的问题,或者我从一个根本上不正确的角度接近这个问题,我就不会感到惊讶。 我通常在包中定义带有常量的内存,但这是针对一个类的,它要求我有一个内存初始化文件(它也需要.mif格式,但那只是一个3模拟和综合文件之间的字符变化)。
答案 0 :(得分:0)
能够在FPGA上初始化RAM取决于合成器和您使用的特定FPGA。一些FPGA系列支持这一点,其他人则不支持。我知道这不是您想听到的答案,但您需要查看Altera的文档。
答案 1 :(得分:0)
Modelsim没有注意综合属性。这是供应商特定的惯例。您可以像在任何其他用户定义的属性中一样在模拟中引用它们,但它不知道某些属性在各种第三方合成器中调用特殊行为。
如果要初始化RAM以进行模拟,则需要执行以下操作之一:
编写一个读取内存文件内容的函数,并在初始化data
信号期间调用它。
将存储器内容转换为在单独的包中定义的VHDL常量,并将常量指定为data
信号作为初始化器。这可以通过脚本自动完成。
使用Verilog系统任务$readmemh
(要求Modelsim使用混合语言许可证)
对于选项1,该函数应采用以下形式:
impure function read_mem(fname : string) return mem is
variable data : mem;
begin
-- ** Perform read with textio **
...
return data;
end function;
signal data : mem := read_mem(data'ram_init_file);
关于RAM初始化的Quartus文档很稀疏,只演示从VHDL进程中分配的初始化数据,而不是从文件中读取。 Xilinx documentation on RAM/ROM inferencing(p258)提供了使用通用VHDL执行此操作的示例。相同的技术可用于模拟针对Altera的设计。 XST支持使用文件I / O进行合成,但Quartus可能会阻塞它。如果是这种情况,您将不得不使用配置在面向综合的RAM模型和专门用于使用该函数初始化的模拟之间进行交换。
Xilinx示例仅显示如何使用ASCII二进制文件读取文件。我有一个general purpose ROM component读取十六进制和二进制,你可以根据需要调整到RAM。
答案 2 :(得分:0)
看起来,Modelsim可能有一个“mem load”命令,您可以在模拟开始时使用该命令来初始化内存。看一下这个帖子的结尾: