能否通过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
相关产品推荐
相关产品推荐

