推断的RAM在ModelSim Altera版本中没有初始化

时间:2014-04-21 07:50:19

标签: vhdl modelsim intel-fpga

我有一个用于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模拟和综合文件之间的字符变化)。

3 个答案:

答案 0 :(得分:0)

能够在FPGA上初始化RAM取决于合成器和您使用的特定FPGA。一些FPGA系列支持这一点,其他人则不支持。我知道这不是您想听到的答案,但您需要查看Altera的文档。

答案 1 :(得分:0)

Modelsim没有注意综合属性。这是供应商特定的惯例。您可以像在任何其他用户定义的属性中一样在模拟中引用它们,但它不知道某些属性在各种第三方合成器中调用特殊行为。

如果要初始化RAM以进行模拟,则需要执行以下操作之一:

  1. 编写一个读取内存文件内容的函数,并在初始化data信号期间调用它。

  2. 将存储器内容转换为在单独的包中定义的VHDL常量,并将常量指定为data信号作为初始化器。这可以通过脚本自动完成。

  3. 使用Verilog系统任务$readmemh(要求Modelsim使用混合语言许可证)

  4. 对于选项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”命令,您可以在模拟开始时使用该命令来初始化内存。看一下这个帖子的结尾:

Initialization altsyncram