• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

使用virtual interface的动态数组

在 SystemVerilog 中,直接声明一个 interface 类型的动态数组 是不允许的,因为 interface 本身是静态的(就像 module 一样)。你需要使用 虚拟接口(virtual interface) 的句柄来动态管理接口实例。

正确做法:声明 virtual interface 的动态数组

// 假设已经定义了接口 my_if
interface my_if;
    logic clk;
    logic data;
endinterface

// 在类或模块中声明动态数组
module top;
    my_if if0();  // 实例化一个具体接口
    my_if if1();  // 另一个实例

    // 声明虚拟接口的动态数组
    virtual my_if vif_array[];

    initial begin
        // 分配动态数组大小
        vif_array = new[2];
        // 将数组元素指向具体的接口实例
        vif_array[0] = if0;
        vif_array[1] = if1;

        // 现在可以通过数组访问接口信号
        vif_array[0].clk = 1'b0;
        $display("%b", vif_array[1].data);
    end
endmodule

关键点

  • 必须使用 virtual:virtual interface 是一个指向实际接口实例的句柄,可以动态分配和赋值。
  • 动态数组声明:virtual my_if array_name[];,然后通过 new[size] 分配空间。
  • 实例化接口:实际接口实例需要像模块一样被例化(如 my_if if0();),然后将其赋值给虚拟句柄。
  • 用途:常用于验证环境中,动态管理多个接口连接,或者在运行时刻决定使用哪个接口。

在类中使用动态接口数组

class driver;
    virtual my_if vif_list[];  // 动态数组句柄

    function new(int num_ports);
        vif_list = new[num_ports];
    endfunction

    task drive_all();
        for(int i=0; i<vif_list.size(); i++)
            vif_list[i].data = i;
    endtask
endclass

注意事项

  • 不能直接声明 my_if array[](不写 virtual),因为 my_if 是一个类型,但没有例化,编译器无法确定其大小。
  • 动态数组中的每个元素是一个独立的虚拟接口句柄,它们可以指向同一个物理接口,也可以指向不同的接口实例。
  • 如果在 module 外部(如 program 或 package)使用,也需要 virtual。

总结:在 SystemVerilog 中,接口的动态数组是通过 virtual interface 句柄的动态数组来实现的。

posted on 2026-04-05 20:57  SOC验证工程师  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3