Error de instrucción de bucle VHDL: el bucle debe terminar dentro de 10,000 iteraciones

1
architecture Behavioral of INST_CACHE is

begin

    init_cache : process (INIT)
        subtype word is std_logic_vector(0 to 31);
        type storage_array is array (natural range 0 to 2**32 - 1) of word;
        --type storage_array is array (0 to 2**32 - 1) of STD_LOGIC_VECTOR (DATA_WIDTH - 1 downto 0);
        variable storage : storage_array;
        variable index : natural;

        type load_file_type is file of word;
        file load_file : load_file_type
            open read_mode is "C:\cachecontent.bin";

    begin

        -- load ROM contents from load_file
        index := 0;
        while not endfile(load_file) loop
            read(load_file, storage(index));
            index := index + 1;
        end loop;

        if rising_edge(CLK) then
            InstCacheOut1 <= storage(to_integer(unsigned(InstCacheIn1)))&InstCacheIn1&'1'; -- instrukcija & PC te instrukcije & valid bit
            InstCacheOut2 <= storage(to_integer(unsigned(InstCacheIn2)))&InstCacheIn2&'1'; -- instrukcija & PC te instrukcije & valid bit
        end if;

    end process;

end Behavioral;

Quiero simular un caché simple. Cargaré las instrucciones de un archivo en una estructura. Sin embargo me sale el error

  

Error (10536): Error de instrucción de bucle VHDL en InstCache.vhd (49): bucle   debe terminar dentro de 10,000 iteraciones

La línea en la que se informa el error es:

    while not endfile(load_file) loop

Supongo que el archivo no se abrió correctamente o quizás no tiene el carácter EOF. Primero, ¿estoy abriendo los archivos de la manera correcta? En segundo lugar, ¿qué extensiones son compatibles? En tercer lugar, tengo que agregar manualmente el carácter EOF. Cuarto: ¿algo más puede ser un problema?

    
pregunta idjuradj

1 respuesta

0

No sé con seguridad por qué aparece ese mensaje de error. Estoy de acuerdo con el comentario de user1155120, esta es una limitación de la herramienta y no un error de VHDL.

Sin embargo, hay muchas cosas incoherentes en su diseño. Tantas que creo que deberías dedicar tiempo a revisar tu diseño en lugar de arreglarlo. Una lista de lo que vi:

  • el almacenamiento describe una memoria de 16 GB, sin embargo, su entidad se llama INST_CACHE . Los cachés suelen oscilar entre unos pocos kilobytes y unos pocos megabytes. ¿Por qué 16GB entonces?

  • Se necesitan al menos 4 bits para simular un std_logic (ya que tiene 9 estados posibles). Su diseño consumiría 64 GB de memoria de su computadora, lo cual es enorme.

  • Has definido el rango de storage_array como natural range 0 to 2**32 - 1 . El problema es que esto es imposible en VHDl ya que natural es un subtipo de integer , que solo puede tomar valores de -2**31 to 2**31-1 , por lo tanto, un natural no puede tener un rango de hasta 2**32-1 .

  • Como señaló el usuario 1155120, su código dentro de rising_edge(clk) probablemente nunca se ejecutará. Para ejecutarse, se requeriría que la señal INIT cambie el valor en el mismo ciclo delta de simulación que clk en aumento. También volverá a activar el código de inicialización cada vez que cambie INIT , mientras que probablemente desee que ese código se ejecute solo una vez.

respondido por el Jonathan Drolet

Lea otras preguntas en las etiquetas