アルテラの ALTSYNCRAM ブロックの 1 つに推論されるように記述したアルテラ FPGA ターゲット用のメモリ モジュールがあります。メモリは 1024x16 で、属性で指定されたメモリ初期化ファイルがあります。合成中、合成レポートには、必要なタイプの RAM ブロックが生成されたことが示され、初期化ファイルが指定したものであることが示されます。Altera の ModelSim のエディションでシミュレートしようとすると、データ信号が完全に初期化されていない状態で開始され、その理由がわかりません。フォーラムなどを調べたところ、ModelSim は私が使用していた ".mif" フォーマットをサポートしていないかもしれないが、".hex" をサポートしている可能性があるという意見があったので、初期化ファイルを ".hex" に変更しました。また、相対ファイルパスが問題になる可能性があることも読みました。
メモリが初期化されていない理由とその方法についてのアイデアはありますか?
推論されたメモリを含む大幅にトリムされたモデル:
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 文字の変更です)。ファイル)。