1

非常に標準的なバスを介して RAM と通信するデザイン用のユニバーサル テスト ベンチを作成しています。いくつかの例を参考にして、次のように書きました。

signal memory: mem_array;
signal mem_address: std_logic_vector(31 downto 0);
signal mem_data: std_logic_vector(31 downto 0);
signal mem_read: std_logic;
signal mem_write: std_logic;

cpu_mem_data <= transport memory(to_integer(unsigned(mem_address))) after DELAY when mem_read = '1' else (others => 'Z');

always : PROCESS
    file in_file: text open read_mode is "in.txt";
    variable line_str: line;
    variable address: std_logic_vector(31 downto 0);
    variable data: std_logic_vector(31 downto 0);
BEGIN
    reset <= '1';

    readline(in_file, line_str);
    hread(line_str, address);
    starting_pc <= address;
    while not endfile(in_file) loop
        readline(in_file, line_str);
        hread(line_str, address);
        read(line_str, data);
        memory(to_integer(unsigned(address))) <= data;
        report "Initialized " & integer'image(to_integer(unsigned(address))) & " to " & integer'image(to_integer(unsigned(data)));
    end loop;

    wait for 30 ns;

    reset <= '0';
WAIT;                                                        
END PROCESS always; 

process (mem_write)
begin
    if (rising_edge(mem_write)) then
        memory(to_integer(unsigned(mem_address))) <= transport mem_data after DELAY;
        report "Will write " & integer'image(to_integer(unsigned(mem_data))) & " to " & integer'image(to_integer(unsigned(mem_address)));
    end if;
end process;

私は2つの問題に遭遇しています。

ModelSim Altera SE でコンパイルおよびシミュレーションすると、メモリのすべてのロケーションがすべて X と表示されます。レポートは、in.txt ファイルから正しい値が読み取られていることを示していますが、メモリには何も書き込まれていません。また、すべての場所または単一の場所をすべて「0」に初期化しようとしましたが、どちらも機能しません。逆に、信号 starting_pc は正しい値に設定されています。

もう 1 つの問題は、遅延割り当てが機能していないように見えることです。デザインがメモリからの読み出しを試み、mem_read と mem_address が正しく設定されていますが、DELAY 時間の後、mem_data は高インピーダンスのままです。

私は何を間違っていますか?

4

1 に答える 1

5

信号メモリに複数のドライバがあります。これは、「always」というラベルの付いたプロセスと、ラベルのないプロセスによって書き込まれています。代わりに、次のように構成された単一のプロセスを使用します。

process
    file in_file: text open read_mode is "in.txt";
    variable line_str: line;
    variable address: std_logic_vector(31 downto 0);
    variable data: std_logic_vector(31 downto 0);
begin
    -- Initialize memory by reading file
    reset <= '1';

    readline(in_file, line_str);
    hread(line_str, address);
    starting_pc <= address;
    while not endfile(in_file) loop
        readline(in_file, line_str);
        hread(line_str, address);
        read(line_str, data);
        memory(to_integer(unsigned(address))) <= data;
        report "Initialized " & integer'image(to_integer(unsigned(address))) & " to " & 
              integer'image(to_integer(unsigned(data)));
    end loop;

    wait for 30 ns;

    reset <= '0';

    -- Write to Memory
    Write_loop : loop 
        wait until rising_edge(mem_write) ;
        memory(to_integer(unsigned(mem_address))) <= transport mem_data after DELAY;
    end loop ;
end process ; 

別のプロセスでリセットをコード化することは適切ですが、必須ではありません。

メモリをすべて使用していますか?ストレージ要素としてシグナルを使用し、データ型として std_logic_vector を使用して、メモリの 2**32 のストレージ ロケーションを実装している場合、大量のメモリを消費し、シミュレータの実行が非常に遅くなります。

いくつかのアイデアについては、http://www.freemodelfoundry.com/のメモリ モデルを参照してください。

また、VHDL テストベンチ クラスhttp://www.synthworks.com/vhdl_testbench_verification.htmでは、スパース メモリ データ構造を実装してコーディングを簡素化するパッケージを提供しています。これらのパッケージの利点の 1 つは、共有変数を使用することです。これにより、シグナルを処理しようとしたときに、複数のプロセスがデータ構造にアクセスできるようになります。

于 2014-01-04T00:43:30.443 に答える