0

アルテラの 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 文字の変更です)。ファイル)。

4

3 に答える 3

0

Modelsim には、メモリを初期化するためにシミュレーションの開始時に使用できる「mem load」コマンドがあるようです。このスレッドの最後を見てください。

初期化 altsyncram

于 2014-04-21T17:24:09.387 に答える
0

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 プロセス内から割り当てられた初期化されたデータのみを示しています。RAM/ROM 推論に関するザイリンクスのドキュメント(p258) には、汎用 VHDL でこれを行う例が記載されています。アルテラを対象としたデザインのシミュレーションにも同じ手法を使用できます。XST は、合成のためのファイル I/O のこの使用をサポートしていますが、Quartus はこれを停止する可能性があります。その場合、コンフィギュレーションを使用して、合成指向の RAM モデルと、関数で初期化するシミュレーション専用モデルとの間でスワップする必要があります。

ザイリンクスの例では、ASCII バイナリでファイルを読み取る方法のみを示しています。私は、必要に応じてRAMに適応できるバイナリと同様に16進数を読み取る汎用ROMコンポーネントを持っています。

于 2014-04-21T15:25:02.757 に答える