【问题标题】:Inferred RAM doesn't initialize in ModelSim Altera edition推断的 RAM 在 ModelSim Altera 版本中未初始化
【发布时间】:2014-04-21 07:50:19
【问题描述】:

我有一个用于 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

Modelsim 在编译 CPU.vhd 时没有显示任何警告或错误,也没有任何加载初始化文件的指示。

这是我第一个使用 Altera 软件或内存初始化文件的设计,如果问题是非常基本的问题,或者我从根本上不正确的角度处理这个问题,我不会感到惊讶。 我通常会在包中用常量定义内存,但这是针对一个类的,它要求我有一个内存初始化文件(它也需要 .mif 格式,但这只是模拟和综合之间的 3 个字符变化文件)。

【问题讨论】:

    标签: vhdl modelsim intel-fpga


    【解决方案1】:

    看起来 Modelsim 可能有一个“mem load”命令,您可以在仿真开始时使用它来初始化内存。看看这个帖子的结尾:

    Initialization altsyncram

    【讨论】:

    • 这就是我所做的。我在 tcl 模拟脚本的开头添加了“mem load -i RAM_init.dat -format hex /path/to/RAM/signal”。格式是用 ascii 表示的普通十六进制格式,与更类似于 marco 的 .mif 文件相比,即使对于 1024 字的内存也是如此。这不是我真正想解决的问题,但它确实有效,因为我想避免在要分级的 VHDL 中添加额外的规定。
    【解决方案2】:

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

    【讨论】:

    • 具体的FPGA是Cyclone II EP2C35F672C6。我知道它的内存单元可以被初始化。综合工具表明推断的内存将使用我的初始化文件进行初始化。如果我要将它加载到硬件中,我希望设计能够按预期工作,因为我已经成功地模拟了具有恒定内存初始化的 Xilinx 目标版本。我的问题不在于综合,而在于仿真,以及如何让 ModelSim Altera 版使用内存初始化文件。
    【解决方案3】:

    Modelsim 不关注综合属性。这是特定于供应商的约定。您可以在模拟中将它们与任何其他用户定义的属性一起引用,但它不知道某些属性会调用各种第三方合成器中的特殊行为。

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

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

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

    3. 使用 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 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多