不同类型的接口实例数组

Array of interface instances of different types

SystemVerilog LRM 第 25.3.3 节描述 generic interfaces:

If a port declaration has a generic interface type, then it can be connected to an interface instance of any type.

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

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

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

欢迎替代方案/解决方法 - 需要可综合。

我不认为这是可能的,因为这意味着在您的测试台中您必须具有如下内容:

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 语句),未使用的连线应由您的综合工具优化掉。

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

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

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