0

DesignWorks 5 の VHDL に 16 * 37 のキャッシュ メモリを実装しようとしています。コードを以下に示します。コードは実行されますが、IO パネルから値を変更したり、とにかくシミュレートしたりすると、タイミング図には何も表示されず、基本的に何らかの理由でコードが実行されません。どんな提案も本当に役に立ちます。

コード:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity Cache is
port(cs, r, clr : in std_logic;
    data : in std_logic_vector(31 downto 0);
    addr : in std_logic_vector(7 downto 0);
    cline : out std_logic_vector(31 downto 0);
    ctag: out std_logic_vector(3 downto 0);
    v : out std_logic);
end Cache;

architecture behav of Cache is
type RAM is array (0 to 15) of std_logic_vector(36 downto 0); 
begin 
 process is
 variable M : RAM; 
 variable locn : natural; 
 variable temp_val : std_logic_vector(36 downto 0); 
 variable cline_val : std_logic_vector(31 downto 0);
 variable ctag_val : std_logic_vector(3 downto 0);
 variable v_val : std_logic;
    begin

        if cs = '1' then
            locn := to_integer(addr); 
            if r = '1' then 
                temp_val := M(locn); 
                cline_val := temp_val(31 downto 0);
                ctag_val := temp_val(35 downto 32);
                v_val := temp_val(36);
            else
                temp_val(31 downto 0) := data;
                temp_val(35 downto 32) := addr(3 downto 0);
                temp_val(36) := '1';
                M(locn) := temp_val;
                v_val := 'Z'; 
                ctag_val:= "ZZZZ"; 
                cline_val:= "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
            end if; 
        end if; 
        if clr ='1' then
            locn := 0;
            while(locn<16) loop
                M(locn) := X"000000000" + "0";
                locn:=locn+1;
            end loop;
        end if;
    cline <= cline_val; 
    ctag <= ctag_val;
    v <= v_val;
    wait on cs; 
end process;

end behav;
4

1 に答える 1

0

この行:

M(locn) := X"000000000" + "0"; 

正しく表示されません。

M は、要素長が 37 の ram 配列型です。ゼロに 36 ビットのゼロを追加しても、36 ビットのままです (このステートメントに到達したようには見えません。実行時エラーになります)。

'0' 値の長さ 37 のベクトルを作成するには、`(others => '0') を使用します。

RAM クリアに for ループを使用することもできます。16 のインデックスを使用する必要はありません。範囲外です。これは、クリアに到達しなかったことを示しています。

あなたの刺激を私たちに見せるべきだと思います。さもなければ、あなたの問題は再現できません。

欠落dataaddrている感度要素 (および、cs サラウンドをケースに入れますが、ここでハードウェア モデルを構築する必要があります)。

機密リストに切り替えます(cs, data, addr)

locn制約のない自然値であり、配列型 ram (0 から 15) に一致する範囲を持つ必要があります。while ループが 16 に達することに注意してください。実際には、for ループを使用します (以下を参照)。制約の理由locnは、アクセス時にバインド エラーを防止するためram(locn)です。

addrナチュラル ( )に変換するには、通常の RAM 操作の範囲エラーを防ぐために、長さ 4 の 1 の実行でlocnAND マスクする必要があることに注意してください。addr

ieee=synopsys -fexplictパッケージ numeric_std は影響です。分析と精緻化の際に、いくつかのコマンド ライン オプションを ghdl() に渡すよりも簡単です。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity cache is
    port (
        cs, r, clr: in  std_logic;
        data:       in  std_logic_vector(31 downto 0);
        addr:       in  std_logic_vector(7 downto 0);
        cline:      out std_logic_vector(31 downto 0);
        ctag:       out std_logic_vector(3 downto 0);
        v:          out std_logic
    );
end entity;

architecture behav of cache is
    type ram is array (0 to 15) of std_logic_vector(36 downto 0);    
begin 

    process (cs, data, addr)
        variable m : ram; 
        variable locn : natural range (ram'range); 
        variable temp_val : std_logic_vector(36 downto 0); 
        variable cline_val : std_logic_vector(31 downto 0);
        variable ctag_val : std_logic_vector(3 downto 0);
        variable v_val : std_logic;
    begin
        if cs = '1' then
            locn := to_integer(unsigned(addr and x"0F")); 
            if r = '1' then 
                temp_val := m(locn); 
                cline_val := temp_val(31 downto 0);
                ctag_val := temp_val(35 downto 32);
                v_val := temp_val(36);
            else
                temp_val(31 downto 0) := data;
                temp_val(35 downto 32) := addr(3 downto 0);
                temp_val(36) := '1';
                m(locn) := temp_val;
                v_val := 'Z'; 
                ctag_val:= "ZZZZ"; 
                cline_val:= (others => 'Z');
            end if; 
        end if; 
        if clr ='1' then
            for i in ram'range loop
                m(i) := (others => '0');
            end loop;
        end if;
        cline <= cline_val; 
        ctag <= ctag_val;
        v <= v_val;
    end process;
end architecture;

このコードは分析して詳しく説明します。言及していない場所でエラーが発生する可能性があり、バインドされた (範囲) エラーが実行時に代入で表示されます (式は気にしません)。

最後にもう 1 つ:

            temp_val(31 downto 0) := data;
            temp_val(35 downto 32) := addr(3 downto 0);
            temp_val(36) := '1';

次のように表現できます。

            temp_val:= '1' & addr(3 downto 0) & data;

としても:

            locn := to_integer(addr);

以下のように表現:

            locn := to_integer(addr(3 downto 0));

ram'rangeジェネリックを使用して RAM サイズを設定する必要がある場合、アルゴリズムによって長さが定義された AND マスクを作成することもできます。

また、刺激が表示されないと、実行時エラーを引き起こす可能性のある場所がいくつかあります。コンソール出力を確認してください。

于 2014-12-01T04:40:19.413 に答える