【问题标题】:Array of interface instances of different types不同类型的接口实例数组
【发布时间】:2015-01-10 16:38:56
【问题描述】:

SystemVerilog LRM 第 25.3.3 节描述了generic interfaces

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

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

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

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

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

【问题讨论】:

    标签: system-verilog


    【解决方案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 语句),并且应该通过您的综合工具优化掉未使用的线路。

    【讨论】:

    • 谢谢@Tudor,我也很怀疑,但希望它可能以某种方式成为可能。我有时认为 SystemVerilog 语言委员会非常短视。为什么我们不能将包或模块实例作为第一类对象传递?
    【解决方案2】:

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

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

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

    【讨论】:

    • SV 定义了一个通用接口类型,有效地允许对真实接口进行后期绑定。您可能会争辩说我应该能够将我的接口转换为通用接口类型并将它们添加到数组中。这只是连线,类型在细化时仍然是静态已知的。
    • 我同意综合工具远远落后于曲线,特别是对于 FPGA。然而,SV 混淆了这个问题,因为没有定义什么应该或不应该是可综合的。大多数合成器供应商认为与class 相关的任何内容仅用于验证,因此可以忽略,结果we can't even write reusable functions2015?! (VHDL 可以在1987 我想!)。这太可怕了。
    • 我建议任何可以在数字逻辑计算机上执行的任何语言的程序都可以在数字逻辑硬件中合成。这只是空间、时间和金钱的简单问题。
    • @Chiggs,仅供参考:Verilog 可以通过带有 args 的宏创建非类型函数(第一次出现:IEEE1364-2001 § 19.3.1,最新:IEEE1800-2012 § 22.5.1)。 SV 添加了let 构造(第一次出现:IEEE1800-2009 § 11.13,最新:IEEE1800-2012 § 11.13)作为替代;很少有厂商植入let。此外,SV 并没有造成合成混乱。它从未在 Verilog 中定义。 SV 是一个年轻的标准,随着时间的推移,更多的功能将变得可合成。
    • 为了让您了解事物在合成中的移动速度有多慢,Synopsys 在 1987 年将 `ifdef 添加到 Verilog 之前添加了编译指示“//translate on/off”。人们仍然使用这些编译指示(不要使用宏)而不是使用 `ifdef SYNTHESIS
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多