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:
- las listas genéricas en el paquete pueden contener genéricos y paquete constantes genéricos
- el paquete genérico se puede crear una instancia como unidad de diseño, pero no en cualquier región declarativa local.
- Los genéricos no pueden depender de otros genéricos en la misma lista genérica
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?