SystemVerilog LRM第25.3.3节介绍generic interfaces
:
如果端口声明具有通用接口类型,则它可以连接到任何类型的接口实例。
我的模块中有一系列通用接口:
module bing #(
parameter SOME_VALUE = 4
)(
input clk,
interface my_interfaces[SOME_VALUE-1:0]
);
实例化此模块时,我希望将阵列中的每个接口连接到不同类型的接口实例。这可能吗?
欢迎的替代方案/变通办法 - 需要合成。
答案 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)
您的要求没有多大意义。根据定义,数组是相同类型的元素的集合。我所知道的编程语言不会让元素的类型根据所选索引而改变。
与您正在寻找的最接近的构造是一个基类句柄数组,每个元素包含一个不同基类扩展的句柄。但是,如果要访问特定扩展类所特有的内容,则必须使用虚方法,或将元素转换为正确类型的变量。
这里的问题可能不是语言,而是综合工具没有赶上基于类的描述这一事实。这是一个非常棘手的问题。即使该语言允许您将模块作为对象传递,合成工具也需要静态地确定每个对象的类型。