SystemVerilog:如何创建一个简单接口数组的接口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SystemVerilog:如何创建一个简单接口数组的接口?相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个接口,它是一个更简单的接口数组。在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数组(使用原始代码),但我真的想在generate循环中实例化scorecard_if,这将允许我基于参数实例化可变数量的scorecard_if接口。

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

答案

Part 1 : Declaring an array of interfaces

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

解:

score_if if_score [`MAX_TC] () ;

语法引用:

  • §25.3接口语法&§A.4.1.2接口实例化 来自A.4.1.2的interface_instantiation :: = // interface_identifier [parameter_value_assignment] hierarchical_instance {,hierarchical_instance};
  • §A.4.1.1模块实例化 hierarchical_instance :: = name_of_instance([list_of_port_connections])

Part 2: Accessing elements for that array

分层引用必须是常量。动态索引无法访问阵列分层实例。它至少是IEEE Std 1364的规则/限制。在IEEE Std 1800-2012中阅读更多关于它的信息§23.6分层名称,语法规则是:

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

您可以使用generate-for-loop,因为它在编译/精化时执行静态展开。限制是您无法使用显示消息我们在循环中累积您的失败计数。您可以使用generate循环将数据复制到本地数组并对其求和,但这会打败您的意图。

接口通常是一组网络,用于连接模块与基于类的测试平台或共享总线协议。您正在将它用作嵌套记分卡。 typedef struct可能更适合您的目的。 struct是一种数据类型,没有作为模块和接口的分层参考限制。看起来你已经在你的previous question尝试溃败了。不确定为什么要切换到嵌套接口。

看起来您正在尝试创建一个相当复杂的测试环境。如果是这样,我建议学习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.在testbench实例化env_if connect serial_if with generate,将virtual if与非virtual连接,并将virtual 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 

以上是关于SystemVerilog:如何创建一个简单接口数组的接口?的主要内容,如果未能解决你的问题,请参考以下文章

systemverilog 测试台中的时钟切换

SystemVerilog 采样和数据驱动

如何生成依赖于 systemverilog 中先前参数的参数

如何定义 coverpoint system verilog

如何在 systemverilog 中转换为 longint unsigned?

Systemverilog中的队列操作