You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过VPI C函数迭代非int索引的SystemVerilog关联数组?

是否可以通过VPI C函数迭代索引类型为非int的SystemVerilog关联数组?

你尝试通过vpi_handle_by_name直接访问以类对象为索引的关联数组元素失败,现咨询是否可通过VPI迭代或获取这类关联数组中存储的值。

SystemVerilog示例代码

// test.sv
class cls;
    int b;
endclass

module m;
    cls testObj;
    int map[cls];
    initial begin
      testObj = new;
      testObj.b = 10;
      map[testObj] = 12;
      $VPIcall;
    end
endmodule

VPI伪代码

// pseudocode vpi c
vpiHandle mapHandle = vpi_handle_by_name("m.map", 0); // 返回有效句柄
vpiHandle valueHandle = vpi_handle_by_name("map[testObj]", mapHandle); // 返回空句柄

解决方案

1. 迭代关联数组元素

可以通过VPI的迭代机制遍历关联数组的所有元素,步骤如下:

  • 获取关联数组的有效句柄(如你已拿到的mapHandle)
  • 调用vpi_iterate(vpiElement, mapHandle)获取元素迭代器
  • 循环调用vpi_scan遍历每个元素句柄
  • 对每个元素句柄,分别获取索引对象和对应的值

2. 示例VPI代码片段

// 迭代关联数组的实现代码
vpiHandle elemIter = vpi_iterate(vpiElement, mapHandle);
vpiHandle elemHandle;

while (elemHandle = vpi_scan(elemIter)) {
    // 获取索引对象的句柄(这里是类对象)
    vpiHandle indexObj = vpi_handle(vpiIndex, elemHandle);
    
    // 获取关联数组元素对应的值
    s_vpi_value val;
    val.format = vpiIntVal;
    vpi_get_value(vpi_handle(vpiValue, elemHandle), &val);
    
    // 操作索引对象的成员(比如获取类对象的b属性)
    vpiHandle bHandle = vpi_handle_by_name("b", indexObj);
    s_vpi_value bVal;
    bVal.format = vpiIntVal;
    vpi_get_value(bHandle, &bVal);
    
    // 输出信息
    vpi_printf("索引对象的b值:%d,关联数组对应值:%d\n", bVal.value.integer, val.value.integer);
}

// 释放迭代器资源
vpi_free_object(elemIter);

3. 关键说明

  • 直接用vpi_handle_by_name访问map[testObj]失败,是因为VPI的名字解析机制无法直接识别类对象作为索引的语法,必须通过迭代或索引对象句柄定位元素。
  • 对于非int类型的索引(如类对象),VPI会返回索引对象的句柄,你可以通过VPI对象相关函数(如vpi_handle_by_name访问成员、vpi_get_str获取类型)操作该对象。

内容的提问来源于stack exchange,提问作者tarik jhin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:17:17