TEXTIO: leer el final del archivo más allá en ModelSim Simulation

1
architecture Behavioral of INST_CACHE is

        subtype word is std_logic_vector(63 downto 0);
        type storage_array is array (0 to 2*16 - 1) of word;
        --type storage_array is array (0 to 2**10 - 1) of STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0);

        signal InstCacheOut1_t  : STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0); -- data output line 1
        signal InstCacheOut2_t  : STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0); -- data output line 2

        type load_file_type is file of word;
        file load_file : text open read_mode is "D:\instcachecontent.txt";

        shared variable storage : storage_array;

begin

    clk_part : process (CLK, RST)

        variable index      : natural;
        variable rdline     : line;
        variable char       : STD_LOGIC_VECTOR (7 downto 0);

    begin


        if (RST = '1') then


                -- load ROM contents from load_file
                index := 0;
                readline(load_file, rdline);
                while not endfile(load_file) loop
                    readline(load_file, rdline);
                    hread(rdline, storage(index)(63 downto 32));
                    read(rdline, char);
                    read(rdline, storage(index)(31 downto 0));
                    index := index + 1;
                end loop;

        elsif (clk'event and clk = '1') then

            InstCacheOut1 <= InstCacheOut1_t;
            InstCacheOut2 <= InstCacheOut2_t;

        end if;

    end process;

end Behavioral;

Arriba está mi diseño de arquitectura. Se supone que no debo sintetizarlo, solo simularlo en ModelSim.

Sin embargo, durante la ejecución, recibo este error:

  

Fatal: (vsim-3551) TEXTIO: Lee el final del archivo "D: \ instcachecontent.txt".

la línea en la que se informa el error es (antes del bucle)

        readline(load_file, rdline);

Este es el contenido del archivo:

00000010
00000010    01111000000000100000000000000001
00000011    01111000000000000001000000000000
00000012    10100000000001000000000000000000
00000013    00001000100001000001000000000000
00000014    11010111111111111111111111111110
00000015    10101000000001000000000000000000
00000016    11111000000000000000000000000000

Cualquier ayuda sería apreciada, ya que no sé cómo se puede leer más allá del final del archivo en la primera línea.

    
pregunta idjuradj

1 respuesta

3

Lamento omitir todos los comentarios, pero para mí, la solución a esto realmente no depende de nada. No tienes if (rising_edge(RST)) then <ROM init loop> , pero if (RST = '1') then <ROM init loop> . Dado que tiene CLK en la lista de sensibilidad para el proceso, cualquier cambio en CLK mientras RST sea alto, hará que el bucle se vuelva a ejecutar, causando el error que ha visto.

Puede asegurarse fácilmente de que esto ocurra solo una vez con una variable booleana:

variable rom_init_complete : boolean := false;

...

if (not rom_init_complete) then
  -- load ROM contents from load_file
  rom_init_complete := true;
  index := 0;
  readline(load_file, rdline);
  while not endfile(load_file) loop
    readline(load_file, rdline);
    hread(rdline, storage(index)(63 downto 32));
    read(rdline, char);
    read(rdline, storage(index)(31 downto 0));
    index := index + 1;
  end loop;
end if;
    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas