不同类型的接口实例数组

时间:2015-01-10 16:38:56

标签: system-verilog

SystemVerilog LRM第25.3.3节介绍generic interfaces

  

如果端口声明具有通用接口类型,则它可以连接到任何类型的接口实例。

我的模块中有一系列通用接口:

module bing #(
    parameter     SOME_VALUE = 4
)(
    input         clk,
    interface     my_interfaces[SOME_VALUE-1:0]
);

实例化此模块时,我希望将阵列中的每个接口连接到不同类型的接口实例。这可能吗?

欢迎的替代方案/变通办法 - 需要合成。

2 个答案:

答案 0 :(得分:1)

我不会这样做,因为这意味着在您的测试平台中,您必须拥有以下内容:

module top
  some_interface if1(...);
  some_other_interface if2(...);

  bing #(SOME_VALUE = 2) (
    .my_interfaces[0](if1),
    .my_interfaces[1](if2)
  );
endmodule

这是非法的语法。连接端口时,您只能使用端口标识符(在您的情况下为my_interfaces),并且您不允许对其进行切片(在 23.3.2模块实例化语法中定义的BNF)不允许它。)

如果您想传入相同类型的接口数组,那么您将不会遇到任何问题。我不认为您考虑的使用模式与语言兼容。即使将my_interfaces端口定义为通用接口数组,它仍然是一个数组,并且它会期望某种类型的接口的数组连接到它。数组只能保存相同类型的对象。

您可以使用最大占地面积方法并始终连接所需的所有接口。您需要将每个明确定义为自己的端口。根据您的参数,您只需排除部分逻辑(使用generate语句),未使用的导线应由综合工具优化。

答案 1 :(得分:1)

您的要求没有多大意义。根据定义,数组是相同类型的元素的集合。我所知道的编程语言不会让元素的类型根据所选索引而改变。

与您正在寻找的最接近的构造是一个基类句柄数组,每个元素包含一个不同基类扩展的句柄。但是,如果要访问特定扩展类所特有的内容,则必须使用虚方法,或将元素转换为正确类型的变量。

这里的问题可能不是语言,而是综合工具没有赶上基于类的描述这一事实。这是一个非常棘手的问题。即使该语言允许您将模块作为对象传递,合成工具也需要静态地确定每个对象的类型。