我正在尝试在vhdl顶层模块中实例化systemverilog模块。 systemverilog模块使用一个二维打包数组“channel_addr_i”(一个3个地址的打包数组,每个地址由3位组成)
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模块中更改端口类型外,是否有人可以提出另一种选择?
答案 0 :(得分:2)
感谢Martin的评论。您可以使用以下方法解决您的问题:
type two_dim_array is array (natural range <>, natural range <>) of std_logic;
我宣布并成功分配。抱歉我的愚蠢回答:(
老答案
在这种情况下,我不认为System-verilog与VHDL兼容,因为旧的VHDL并不真正支持多维数组。但是,你应该尝试这个(我还没有尝试过,因为我们的实验室使用的是非常古老的模型):
将您的设置更改为VHDL 2008,然后您可以声明类型
type two_dim_array is array (natural range <>) of std_logic_vector;
然后再试一次。
但是,最好的情况是将system-verilog扩展为包含扩展数组的包装器。
P / S:上次我尝试使用system-verilog项目时,多维数组在综合工具中自动扩展为一维数组。但是,模拟工具可能不允许它。古德勒克!