非常に標準的なバスを介して 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 は高インピーダンスのままです。
私は何を間違っていますか?