首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SystemVerilog:如何创建一个接口,它是一个简单接口的数组?

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

Stack Overflow用户
提问于 2015-01-24 01:47:24
回答 1查看 9.1K关注 0票数 2

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

代码语言:javascript
复制
`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。

我也试过

代码语言:javascript
复制
interface scorecard_if;
    score_if  [`MAX_TC] if_score;
endinterface

代码语言:javascript
复制
interface scorecard_if;
    score_if [`MAX_TC];
endinterface

但这两种方法都导致了“意想不到的令牌”语法错误。

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

代码语言:javascript
复制
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中的多个独立模块,其中多个模块是一个参数。

EN

回答 1

Stack Overflow用户

发布于 2015-01-25 08:12:09

这也有效: 1.定义一个“容器”接口:

代码语言:javascript
复制
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
  1. 在testbench中,实例化env_if与generate连接serial_if,将虚拟if与非虚拟连接,并将虚拟if传递给验证env:
代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28121432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档