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

如何通过VPI与Verilator访问SystemVerilog自定义结构体成员?

使用VPI访问SystemVerilog打包结构体的成员

在Verilator中通过VPI访问packed struct类型的端口成员,有两种可行方式:

方法1:通过结构体句柄遍历获取成员

先拿到结构体的顶层句柄,再迭代遍历其内部成员,定位到目标成员后读取值:

vpiHandle issue_instr = vpi_handle_by_name((PLI_BYTE8*)"TOP.core.issue_instr_i", NULL);
// 获取结构体成员的迭代器
vpiHandle member_iter = vpi_iterate(vpiMember, issue_instr);
vpiHandle member_h;

// 遍历所有成员,找到目标成员rs1
while ((member_h = vpi_next(member_iter)) != NULL) {
    char* member_name = vpi_get_str(vpiName, member_h);
    if (strcmp(member_name, "rs1") == 0) {
        s_vpi_value val;
        val.format = vpiHexStrVal; // 也可根据需求选用vpiIntVal等格式
        vpi_get_value(member_h, &val);
        printf("rs1 value: %s\n", val.value.str);
        vpi_free_object(member_iter); // 释放迭代器资源
        break;
    }
}

方法2:直接使用成员的完整层次路径

VPI支持通过完整层次化路径直接访问结构体成员,需包含从顶层到目标成员的全路径:

// 直接获取rs1的句柄
vpiHandle rs1_h = vpi_handle_by_name((PLI_BYTE8*)"TOP.core.issue_instr_i.rs1", NULL);
if (rs1_h != NULL) {
    s_vpi_value val;
    val.format = vpiHexStrVal;
    vpi_get_value(rs1_h, &val);
    printf("rs1 value: %s\n", val.value.str);
} else {
    printf("Failed to get rs1 handle\n");
}

关键说明

  • 你的结构体是packed类型,Verilator会将其视为连续比特流,但VPI仍能识别内部成员划分,只要端口已通过/*verilator public_flat_rd*/暴露给VPI。
  • 直接用issue_instr_i.rs1失败的核心原因是缺少完整层次前缀(如TOP.core),VPI需要明确的全路径才能准确定位信号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:27:47