我正在尝试在 vhdl 顶层模块中实例化一个 systemverilog 模块。 systemverilog模块使用二维压缩数组“channel_addr_i”(A packed array of 3 addresses each consists of 3 bits)
SystemVerilog 模块声明:
`define N_PORTS 3
`define N_CHANNELS 4
module pwr_ctrl(
input logic clk, rst_n,
input logic [`N_PORTS-1 : 0] [2 : 0] channel_addr_i,
input logic [`N_CHANNELS-1 : 0] transaction_complete_i,
output logic [`N_CHANNELS-1 : 0] sleep
);
我必须将上述模块实例化为顶级 vhdl 模块中的一个组件,并将来自 3 个不同输入端口的地址(每个地址由 3 位组成:因此总共 9 位)传递给 systemverilog 组件。
VHDL 实例化:
signal ch_addr : std_logic_vector(8 downto 0);
component pwr_ctrl is
port(
clk : in std_logic;
rst_n : in std_logic;
channel_addr_i : in std_logic_vector(8 downto 0); --CONSIDERING 3 INPUT PORTS
transaction_complete_i : in std_logic_vector(3 downto 0); -- CONSIDERING 4 CHANNELS
sleep : out std_logic_vector(3 downto 0)
);
ch_addr <= axi_addr(31 downto 29) & axi1_addr_n(31 downto 29) & addr_ahb(31 downto 29);
power_ctrl : pwr_ctrl
port map(
clk => aclk,
rst_n => aresetn,
channel_addr_i => ch_addr,
transaction_complete_i => transaction_complete_i,
sleep => sleep
);
end component;
但是modelsim给出了这个错误: ** 错误:(vsim-8428) 无法将 VHDL 阵列信号连接到 Verilog 多维阵列端口“channel_addr_i”。
除了更改 systemverilog 模块中的端口类型之外,有人可以建议另一种替代方法吗?
最佳答案
感谢 Martin 的评论。您的问题可以通过以下方式解决:
type two_dim_array is array (natural range <>, natural range <>) of std_logic;
我声明并分配成功。抱歉我的愚蠢回答:(
旧答案
在这种情况下,我认为 System-verilog 与 VHDL 不兼容,因为旧的 VHDL 并不真正支持多维数组。但是,你应该试试这个(我还没有试过,因为我们的实验室使用非常旧的 modelsim):
将您的设置更改为 VHDL 2008 然后您可以声明类型
type two_dim_array is array (natural range <>) of std_logic_vector;
然后再试一次。
但是,最好的情况是将您的 system-verilog 扩展为具有扩展数组的包装器。
P/S: 上次尝试system-verilog项目,多维数组在综合工具中自动扩展为一维数组。但是,仿真工具可能不允许这样做。祝你好运!
关于vhdl - 将多维 systemverilog 端口连接到 vhdl 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20608978/