将泛型传递给泛型包以在 VHDL 中设置端口

Passing generic to generic package to set port in VHDL

我正在查看 eda playground (https://www.edaplayground.com/x/6Mpm) 中的通用包示例,并且正在尝试做类似的事情。我试图通过实体中的通用字段从顶层获取一个整数,然后将通用值传递给通用包以设置记录的一部分的大小。然后,此记录类型将用于泛型来源实体的端口。

这可能吗,还是我必须像示例中那样在包裹声明中对数字进行硬编码?尝试在实体中声明包给我错误声明端口看不到记录类型。如示例中正常声明包意味着包看不到实体中的泛型。

我一直想用常量包来规避“问题”,但我想知道是否可以使用泛型和通用包来做到这一点,而无需对数字进行硬编码。这样一来,我在重用模块时就不必记住更改常量包了。

包裹:

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

-- pps_control_generic_pkg
package pps_control_generic_pkg is
  generic(
    -- Size of register. Max 32. Default 32
    g_reg_size : integer := 32
  );

type t_apb3_pif2core is record
  rw_config    : std_logic_vector(g_register_size-1 downto 0);
  rw_config_we : std_logic;
end record;

type t_apb3_core2pif is record
  rw_config    : std_logic_vector(g_register_size-1 downto 0);
end record;

end package pps_control_generic_pkg;

代码

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

-- Trying to declare this correctly
-----------------------------------------------------------
package pps_control_pkg is new work.pps_control_generic_pkg
generic map(
  g_reg_size => g_reg_size
);
use work.pps_control_pkg.all;
-----------------------------------------------------------

entity pps_control_core is
  generic(
    -- Size of register. Default 32
    g_register_size  : integer := 32;
  );
  port(
    csi_sys_clk   : in std_logic;
    rsi_sys_reset : in std_logic;

    -- Interface to access register
    p2c           : in  t_apb3_pif2core;
    c2p           : out t_apb3_core2pif;

    pps_in        : in  std_logic;
    pps_out       : out std_logic;
    pps_en_n      : out std_logic
  );
end entity;

architecture rtl of pps_control_core is
...
begin
...
end rtl;

具有记录约束的记录类型的无约束复合元素有效。感谢 Tricky 提到了解决方案,感谢 user1155120 将其输入。

library ieee;
use ieee.std_logic_1164.all;

package pps_control_generic_pkg is
  type t_apb3_pif2core is record
    rw_config    : std_logic_vector;
    rw_config_we : std_logic;
  end record;
  type t_apb3_core2pif is record
    rw_config    : std_logic_vector;
  end record;
end package pps_control_generic_pkg;

library ieee;
use ieee.std_logic_1164.all;
use work.pps_control_pkg.all;

entity pps_control_core is
  generic(
    g_register_size  : integer := 32;
  );
  port(
    csi_sys_clk   : in std_logic;
    rsi_sys_reset : in std_logic;
    p2c           : in  t_apb3_pif2core
                        (arw_config(g_register_size-1 downto 0));
    c2p           : out t_apb3_core2pif
                        (aro_config(g_register_size-1 downto 0));
    pps_in        : in  std_logic; --! External pps signal
    pps_out       : out std_logic; --! Outputted pulse
    pps_en_n      : out std_logic  --! Enable pps signal to instrument
  );
end entity;