2013-12-16 25 views
3

我想实例化一个vhdl顶层模块内的systemverilog模块。 SystemVerilog的模块使用一个2维压缩数组“channel_addr_i”(3个地址的封装阵列的每个包括3个比特)将多维systemverilog端口连接到vhdl模块

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模块中的端口类型,任何人都可以提出另一种选择吗?

回答

2

感谢马丁的评论。你的问题可以通过使用来解决:

type two_dim_array is array (natural range <>, natural range <>) of std_logic;

我宣布,成功地分配。对不起我的愚蠢的答案:(


OLD ANSWER

我不认为系统Verilog的是在这种情况下VHDL兼容,因为老VHDL没有真正支持多维数组,但是,你应该试试这个一个(我还没有尝试过,因为我们的实验室中使用很老的ModelSim):

更改设置到2008 VHDL,那么你可以声明式

type two_dim_array is array (natural range <>) of std_logic_vector;

然后再试一次。

但是,最好的情况是扩展你的系统 - verilog扩展数组包装。

P/S:上一次我尝试使用system-verilog项目时,多维数组在自动合成工具中被自动扩展为1维数组。但是,仿真工具可能不允许。祝你好运!

+2

[VHDL确实支持二维数组](http://parallelpoints.com/reading-image-files-with-vhdl-part-1-again/):'类型twod是数组(自然范围<>,自然范围<>)std_logic;' –

+0

@MartinThompson:非常感谢,我真的忘了它:( – Khanh

+0

没问题,对于尖锐的评论道歉,它本意是“简单而翔实”,但出来了一点“突然”! –