将多维systemverilog端口连接到vhdl模块

时间:2013-12-16 10:47:40

标签: vhdl verilog system-verilog

我正在尝试在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模块中更改端口类型外,是否有人可以提出另一种选择?

1 个答案:

答案 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项目时,多维数组在综合工具中自动扩展为一维数组。但是,模拟工具可能不允许它。古德勒克!