Usando paquetes genéricos con tipo protegido en Modelsim 10.xy

2

Estoy tratando de usar paquetes genéricos con un tipo protegido en Modelsim 10.0a. La nota técnica vhdl2008.note indica:

  
  • un paquete genérico básico y su creación de instancias con algunos notables   restricciones:

         
    1. las listas genéricas en el paquete pueden contener genéricos y paquete constantes   genéricos
    2.   
    3. el paquete genérico se puede crear una instancia como unidad de diseño, pero no en   cualquier región declarativa local.
    4.   
    5. Los genéricos no pueden depender de otros genéricos en la misma lista genérica
    6.   

    Es razonable usar esto para crear una instancia del genérico fijo y flotante
      Paquetes desde IEEE. Puedes escribir tu propio paquete genérico, instanciarlo,   y usarlo. Solo mantenlo dentro de las restricciones.

  •   

Ahora tengo un paquete genérico test_generic_pkg.vhd :

library ieee;
use ieee.std_logic_1164.all;

package test_generic_pkg is
    generic(
        WIDTH : natural := 16
    );

    type test_type is protected
        procedure set(d : std_logic_vector(WIDTH-1 downto 0));
        impure function get return std_logic_vector;
    end protected;
end package test_generic_pkg;

package body test_generic_pkg is
    type test_type is protected body
        variable data : std_logic_vector(WIDTH-1 downto 0);

        procedure set(d : std_logic_vector(WIDTH-1 downto 0)) is
        begin
            data := d;
        end procedure set;

        impure function get return std_logic_vector is
        begin
            return data;
        end function get;
    end protected body;
end package body test_generic_pkg;

Una utilizada por una entidad / arquitectura tb.vhd :

package test_pkg is new work.test_generic_pkg generic map( WIDTH => 16 );

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

use work.test_pkg.all;

entity tb is
end entity tb;

architecture behavioural of tb is
    shared variable test : test_type;
    signal clk : std_logic := '0';
begin

    clk_gen: process is
    begin
        wait for 50 ns;
        clk <= not clk;
    end process;

    test1_p: process(clk) is
        variable cnt : unsigned(15 downto 0) := to_unsigned(0, 16);
    begin
        if rising_edge(clk) then
            test.set(std_logic_vector(cnt));
            cnt := cnt + 1;
        end if;
    end process;

    test2_p: process(clk) is
    begin
        if falling_edge(clk) then
            assert false report to_string(test.get) severity note;
        end if;
    end process;

end architecture behavioural;

Estos dos archivos se pueden probar con el archivo sim.do :

vlib work
vcom -work work -2008 -novopt test_generic_pkg.vhd tb.vhd
vsim -novopt work.tb

Al ejecutar este archivo Do, Modelsim compila ambos archivos y al cargar las bibliotecas para la simulación, falla:

...
# Loading work.queue_pkg(body)
# Loading work.queue64
...
# ** INTERNAL ERROR: pkgref: export lookup failed for package #0
# Error loading design

También intenté poner la creación de instancias del paquete en un archivo separado, pero los resultados siguen siendo los mismos. ¿Cuál es la solución para obtener paquetes genéricos con tipo protegido trabajando con Modelsim? El uso de paquetes genéricos funciona bien sin un tipo protegido y tipos protegidos en un paquete normal también.

P.S .: Modelsim 10.0a parece no ser compatible con esta función, aunque no se menciona en la nota técnica. ¿Qué versión de Modelsim agregó esta función?

    
pregunta Thomas S.

1 respuesta

2

Con la ayuda de un buen tipo de los foros de Mentor Graphics, descubrimos que esta versión de Modelsim no lo admite.

Los resultados para las diferentes versiones de Modelsim son:

  • Modelsim 10.0a: no funciona
  • Modelsim 10.0f: no funciona
  • Modelsim 10.3a: Funciona
respondido por el Thomas S.

Lea otras preguntas en las etiquetas