如何创建一个由更简单的接口数组组成的接口?

问题描述 投票:0回答:3

我正在尝试创建一个界面,它是一个更简单界面的数组。在 VHDL 中,我可以简单地定义两种类型:记录和记录数组。但如何在 SystemVerilog 中做到这一点呢?这是我尝试过的:

define MAX_TC 15

...

interface scorecard_if;
    score_if if_score [`MAX_TC];
endinterface

interface score_if;
    integer tc;
    integer pass;
    integer fail;
    bit     flag_match;
    real    bandwidth;
endinterface

但我从 Aldec Active-HDL 收到错误:

错误:VCP2571 TestBench/m3_test_load_tb_interfaces.sv : (53, 34): 实例化必须有括号 ():if_score。

我也尝试过

interface scorecard_if;
    score_if  [`MAX_TC] if_score;
endinterface

interface scorecard_if;
    score_if [`MAX_TC];
endinterface

但这两者都导致了“意外标记”语法错误。

有可能做到这一点吗?如果没有办法做到这一点,我可以想到两种解决方法。首先,我可以将 Score_if 的所有单个元素定义为解包数组:

interface score_if;
    integer tc         [1:`MAX_TC];
    integer pass       [1:`MAX_TC];
    integer fail       [1:`MAX_TC];
    bit     flag_match [1:`MAX_TC];
    real    bandwidth  [1:`MAX_TC];
endinterface

这个可以编译,但它很难看,因为我不能再将单个分数作为一个组来引用。

我也可能要实例化一个score_if数组(使用原始代码),但我真的想在一个生成循环内实例化scorecard_if,这样我就可以根据参数实例化可变数量的scorecard_if接口。

只是为了对我想要做的事情提供一些解释,score_if 应该是给定测试用例的分数记录,而 Scorecard_if 应该是所有测试用例的数组。但我的测试平台有多个独立的激励发生器、监视器和记分卡来处理 DUT 内的多个独立模块,其中倍数是一个参数。

arrays interface system-verilog
3个回答
3
投票

第 1 部分:声明接口数组

在接口实例化的末尾添加括号。根据 IEEE Std 1800-2012,分层实例的所有实例都需要端口列表的括号,即使端口列表为空也是如此。如果接口声明中没有任何端口并且实例化很简单,某些工具允许删除括号;但这不是标准的一部分。最佳实践是对所有分层实例化使用括号。

解决方案:

score_if if_score [`MAX_TC] () ;

语法引用:

  • § 25.3 接口语法 & § A.4.1.2 接口实例化

    interface_instantiation ::= // 来自 A.4.1.2
    接口标识符 [ 参数值分配 ] 分层实例 { , 分层实例 } ;

  • § A.4.1.1 模块实例化

    分层实例 ::= 实例名称 ( [ 端口连接列表 ] )


第 2 部分:访问该数组的元素

分层引用必须是恒定的。数组分层实例无法通过动态索引访问。 这是至少从 IEEE Std 1364 开始的规则/限制。在 IEEE Std 1800-2012 § 23.6 分层名称中了解更多信息,语法规则是:

hierarchical_identifier ::= [ $root . ] { 标识符constant_bit_select . } 标识符

您可以使用generate-for-loop,因为它在编译/精化时进行静态展开。限制是您不能使用显示消息来累积循环中的失败计数。您可以使用生成循环将数据复制到本地数组并对其求和,但这违背了您的意图。

接口通常是一组网络,用于将模块与基于类的测试平台或共享总线协议连接起来。您将其用作嵌套记分卡。

typedef struct
可能更适合您的目的。 A
struct
是一种数据类型,没有模块和接口那样的层次引用限制。看来您已经在“上一个问题”中尝试击溃了。不知道为什么你切换到嵌套接口。 看起来您正在尝试创建一个相当复杂的测试环境。如果是这样,我建议在花费大量时间重新发明高级测试平台架构之前学习

UVM

。从 1.1d 开始,因为 1.2 还不是主流。


1
投票

interface environment_if (input serial_clk); serial_if eng_if[`NUM_OF_ENGINES](serial_clk); virtual serial_if eng_virtual_if[`NUM_OF_ENGINES]; endinterface

2.在测试台中实例化env_if,将serial_if与generate连接,将虚拟if与非虚拟连接,并将虚拟if传递给验证env:

module testbench; .... environment_if env_if(serial_clk); ..... dut i_dut(...); genvar eng_idx generate for(eng_idx=0; eng_idx<`NUM_OF_ENGINES; eng_idx++) begin env_if.eng_if[eng_idx].serial_bit = assign i_dut.engine[eng_idx].serial_bit; end endgenerate ...... initial begin env_if.eng_virtual_if = env_if.eng_if[0:`NUM_OF_ENGINES-1]; //now possible to iterate over eng_virtual_if[] for(int eng_idx=0; eng_idx<`NUM_OF_ENGINES; eng_idx++) uvm_config_db#(virtual serial_if)::set(null, "uvm_test_top.env", "tx_vif", env_if.env_virtual_if[eng_idx]); end endmodule



0
投票

模块测试台; .... 环境_if env_if(serial_clk); ......

dut i_dut(...);

genvar eng_idx

生成

for(eng_idx=0;eng_idx

最终生成 ......<`NUM_OF_ENGINES; eng_idx++) begin env_if.eng_if[eng_idx].serial_bit = assign i_dut.engine[eng_idx].serial_bit; end

初始开始 env_if.eng_virtual_if = env_if.eng_if[0:

NUM_OF_ENGINES-1]; //now possible to iterate over eng_virtual_if[] for(int eng_idx=0; eng_idx<

NUM_OF_ENGINES; eng_idx++) uvm_config_db#(虚拟serial_if)::set(null, "uvm_test_top.env", "tx_vif", env_if.env_virtual_if[eng_idx]); 结尾 结束模块

谢谢你。

© www.soinside.com 2019 - 2024. All rights reserved.