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

SOC/IP验证工程师

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

公告

View Post

UVM整型枚举转字符串方法

在UVM中,使用uvm_field_automation机制注册二维数组需要特殊处理,因为UVM没有直接支持二维数组的宏。以下是三种实现方法,从推荐程度排序:

方法1:使用动态数组的动态数组 + 自定义处理(推荐)

class my_item extends uvm_sequence_item;
  // 定义二维动态数组(动态数组的动态数组)
  int my_2d_array[][];
  
  `uvm_object_utils_begin(my_item)
    // 注册第一维动态数组
    `uvm_field_array_int(my_2d_array, UVM_ALL_ON)
  `uvm_object_utils_end

  // 必须重载这些方法处理第二维数组
  virtual function void do_pack(uvm_packer packer);
    super.do_pack(packer);
    packer.pack_field_int(my_2d_array.size(), 32);  // 打包第一维大小
    foreach(my_2d_array[i]) begin
      packer.pack_field_int(my_2d_array[i].size(), 32);  // 打包第二维大小
      foreach(my_2d_array[i][j]) begin
        packer.pack_field_int(my_2d_array[i][j], 32);  // 打包元素
      end
    end
  endfunction

  virtual function void do_unpack(uvm_packer packer);
    int size1, size2;
    super.do_unpack(packer);
    size1 = packer.unpack_field_int(32);  // 解包第一维大小
    my_2d_array = new[size1];
    for(int i=0; i<size1; i++) begin
      size2 = packer.unpack_field_int(32);  // 解包第二维大小
      my_2d_array[i] = new[size2];
      for(int j=0; j<size2; j++) begin
        my_2d_array[i][j] = packer.unpack_field_int(32);  // 解包元素
      end
    end
  endfunction

  // 类似重载do_copy, do_compare等方法...
endclass

方法2:使用静态二维数组 + uvm_field_sarray_int

class my_item extends uvm_sequence_item;
  // 定义二维静态数组(第二维固定大小)
  int my_2d_array[][3];  // 第二维固定为3
  
  `uvm_object_utils_begin(my_item)
    // 注册为动态数组(第一维)
    `uvm_field_array_int(my_2d_array, UVM_ALL_ON)
    
    // 需要手动处理每个元素
    // UVM不会自动处理第二维
  `uvm_object_utils_end

  // 仍需重载do_pack/do_unpack处理第二维
  virtual function void do_pack(uvm_packer packer);
    super.do_pack(packer);
    foreach(my_2d_array[i]) begin
      foreach(my_2d_array[i][j]) begin
        packer.pack_field_int(my_2d_array[i][j], 32);
      end
    end
  endfunction

  virtual function void do_unpack(uvm_packer packer);
    super.do_unpack(packer);
    foreach(my_2d_array[i]) begin
      foreach(my_2d_array[i][j]) begin
        my_2d_array[i][j] = packer.unpack_field_int(32);
      end
    end
  endfunction
endclass

方法3:封装为单独类(适用于复杂场景)

// 先定义一维数组包装类
class int_array extends uvm_object;
  int data[];
  
  `uvm_object_utils_begin(int_array)
    `uvm_field_array_int(data, UVM_ALL_ON)
  `uvm_object_utils_end
  
  function new(string name = "int_array");
    super.new(name);
  endfunction
endclass

// 主事务类
class my_item extends uvm_sequence_item;
  int_array my_2d_array[];  // 一维数组的数组
  
  `uvm_object_utils_begin(my_item)
    `uvm_field_array_object(my_2d_array, UVM_ALL_ON)
  `uvm_object_utils_end
  
  function new(string name = "my_item");
    super.new(name);
  endfunction
  
  // 访问二维数组的便捷方法
  function int get_value(int i, int j);
    return my_2d_array[i].data[j];
  endfunction
endclass

关键说明:

  1. UVM限制:

    • 没有直接的uvm_field_2d_array宏
    • 标准宏只支持一维数组(uvm_field_array_*)
  2. 推荐方法:

    // 最佳实践代码结构:
    class my_item extends uvm_sequence_item;
      int array[][];  // 二维动态数组
      
      `uvm_object_utils_begin(my_item)
        `uvm_field_array_int(array, UVM_ALL_ON)  // 注册第一维
      `uvm_object_utils_end
      
      // 必须重载以下方法:
      virtual function void do_pack(uvm_packer packer);
      virtual function void do_unpack(uvm_packer packer);
      virtual function void do_copy(uvm_object rhs);
      virtual function bit do_compare(uvm_object rhs, uvm_comparer comparer);
      virtual function string convert2string();
    endclass
    
  3. 必须重载的方法:

    • do_pack/do_unpack:处理二维数据的序列化
    • do_copy:深度复制二维数组
    • do_compare:比较二维数组内容
    • convert2string:打印二维数组
  4. 性能考虑:

    • 对于大型数组,建议使用自定义打包/解包
    • 静态数组比动态数组性能更好
  5. 替代方案:

    • 使用一维数组模拟二维数组(计算偏移量)
    • 使用SystemVerilog关联数组(如果适用)

建议使用方法1(动态数组+自定义处理),它提供了最大的灵活性,同时保持了UVM字段自动化的优势。对于固定大小的二维数组,方法2更简洁。方法3适用于需要额外封装逻辑的复杂场景。

posted on 2025-07-21 22:31  SOC验证工程师  阅读(43)  评论(0)    收藏  举报

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