2017-02-27 58 views
1

我有一个带时钟输入的参数化接口。例如:具有不同参数的SystemVerilog接口阵列

interface itf # (PARAM1 = 16, PARAM2 = 8)(input logic clk); 

此接口有一个称为“slave”的modport。

我的模块将这个接口的数组作为输入(modport“slave”)。

module MyModule #(NB_ITFS = 4)(... itf.slave itfs[NB_ITFS]...); 

在为MyModule一台模块,我想一个通用的代码,能够测试的NB_ITFS不同的值。

问题:如何为MyModule instanciation创建我的接口数组(考虑到元素具有不同参数的事实)?

例如,我试图用一个生成的语句:

module testbench() 
... 
generate 
    genvar i; 
    for (i = 0; i < NB_ITFS; i++) 
    begin : interfaces 
     itf #(.PARAM1(PARAM1_TABLE[i]), 
       .PARAM2(PARAM2_TABLE[i])) itf_inst (.clk(clk)); 
    end 
endgenerate 
... 
endmodule 

但是,在这种情况下,接口阵列interfaces[xxx].itf_inst(和.slave如果我要选择“从” modport)和的instanciation MyModule使用interfaces[NB_ITFS].itf_inst.slave会产生错误。

我也尝试没有成功: - 一个通用的定义itf itf_inst[NB_ITFS] (.clk(clk));并试图修改使用defparam里面的参数生成块 - “虚拟接口”功能

什么建议吗?

回答

0

如何把你的generate另一个界面中:

interface itfa #(NB_ITFS = 4)(input logic clk); 
    ... 
    generate 
    genvar i; 
    for (i = 0; i < 4; i++) 
    begin : interfaces 
     itf #(.PARAM1(i), 
      .PARAM2(i)) itf_inst (.clk(clk)); 
    end 
    endgenerate 
    ... 
endinterface 

,然后使用该作为接口MyModule

module MyModule #(NB_ITFS = 4)(itfa itfs); 
    ... 
endmodule 

然后你就可以实例化的外部接口(itfa),并将其连接以通常方式MyModule的实例:

module testbench; 
    ... 
    logic clk; 
    ... 
    itfa #(4) itfa_inst (.clk(clk)); 
    ... 
    MyModule #(4) MyModule0 (.itfs(itfa_inst)); 
    ... 
endmodule 

https://www.edaplayground.com/x/254C

+0

我同意这个解决方案。 – Robby

+0

另外,你有什么想法仍然在itfa中实现它吗?我想为itfa创建一个“slave”modport,它是itf_inst“slave”modports的数组... – Robby