System verilog 不同类型的接口实例数组

System verilog 不同类型的接口实例数组,system-verilog,System Verilog,第25.3.3节描述了通用接口: 如果端口声明具有通用接口类型,则可以将其连接到任何类型的接口实例 我的模块中有一系列通用接口: module bing #( parameter SOME_VALUE = 4 )( input clk, interface my_interfaces[SOME_VALUE-1:0] ); 在实例化此模块时,我希望将阵列中的每个接口连接到不同类型的接口实例。这可能吗 备选方案/解决方案欢迎-需要可合成。我不

第25.3.3节描述了
通用接口

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

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

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
语句),未使用的线路应通过您的合成工具进行优化。

您的请求没有多大意义。根据定义,数组是相同类型元素的集合。我所知道的任何编程语言都不会允许元素的类型根据所选索引进行更改

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


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

谢谢@Tudor,我也这么怀疑,但希望它可能以某种方式实现。我有时认为SystemVerilog语言委员会的目光短浅得令人印象深刻。为什么我们不能将包或模块实例作为第一类对象传递?SV定义了一个通用接口类型,有效地允许实际接口的后期绑定。您可能会争辩说,我应该能够将接口转换为通用接口类型,并将它们添加到数组中。这只是布线,在精化时,类型仍然是静态已知的。我同意合成工具远远落后于曲线,特别是对于FPGA。然而,SV混淆了这个问题,因为没有定义什么应该或不应该是可合成的。大多数synth供应商认为任何与
类相关的内容都只是为了验证,因此可以忽略,结果是,2015年?!(我想VHDL可以在1987年做到这一点!)。这太糟糕了。我建议,任何语言的、可以在数字逻辑计算机上执行的程序都可以在数字逻辑硬件中合成。这只是空间、时间和金钱的简单问题。@Chiggs,仅供参考:Verilog可以通过宏w/args创建非类型函数(首次出现:IEEE1364-2001§19.3.1,最新版本:§22.5.1)。SV添加了
let
构造(第一次出现:IEEE1800-2009§11.13,最新版本:§11.13)作为替代;很少有供应商植入了
let
。SV也没有造成合成混乱;它从未在Verilog中定义过。SV是一个年轻的标准,随着时间的推移,更多的功能将成为可合成的。为了让您了解合成过程中的进展有多慢,Synopsys在1987年将ifdef添加到Verilog之前添加了pragmas“//translate on/off”。人们仍然使用这些pragma(不适用于宏),而不是使用“ifdef合成”