首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Verilator和VPI读取regs数组

使用Verilator和VPI读取regs数组
EN

Stack Overflow用户
提问于 2020-02-20 02:43:05
回答 1查看 448关注 0票数 3

因此,我在verilog中定义了以下寄存器

代码语言:javascript
复制
reg [31:0] register_mem [0:15]/* verilator public */;

我的目标是从我的验证器c++代码中读取存储在其中的16个值。

我发现这个VPI的文档很难找到。我仍然不知道t_vpi_vecval是什么,它的参数是什么,或者它是否是正确的方法。

下面是我读取寄存器中第五个值的方法

代码语言:javascript
复制
unsigned int read_regs() {
    const std::string path = "TOP.TOP.cpu.reg_file.register_mem";
    vpiHandle vh1 = vpi_handle_by_name((PLI_BYTE8*)path.c_str(), NULL);
    if (!vh1) { 
        printf("Name %s", path.c_str());
        vl_fatal(__FILE__, __LINE__, "sim_main", "No handle found: ");
    }
    const char* name = vpi_get_str(vpiName, vh1);


    s_vpi_value v;
    v.format = vpiVectorVal;
    vpi_get_value(vh1, &v);
    return v.value.vector[4].aval;
}

无论我在这里做什么,该方法都会返回0,这表明我没有查看register_mem数组。

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-02-20 06:34:01

为了获取数组的值,您需要分别获取数组中每个元素的值。VPI不返回完整数组的值。

实际上,您为数组获得的句柄是vpiRegArray类型的句柄。可以迭代它来访问每个单独的元素。

下面是一段简单的代码,它执行迭代并打印数组中每个元素的值:

代码语言:javascript
复制
#include "vpi_user.h"

PLI_INT32 preg_calltf( char *txt ) {
    vpiHandle hreg = vpi_handle_by_name("rarr.register_mem", 0);
    vpi_printf("reg type: %s\n", vpi_get_str(vpiType, hreg)); // vpiRegArray

    s_vpi_value val = {vpiDecStrVal}; // struct t_vpi_value

    vpiHandle arrayIterator = vpi_iterate( vpiReg, hreg); 
    if( arrayIterator != NULL ) {
        vpiHandle item = NULL;
        while( NULL != ( item = vpi_scan( arrayIterator ) ) ) {
            vpi_get_value(item, &val);
            vpi_printf("item type: %s = %s\n", vpi_get_str(vpiType, item), val.value.str); // vpiReg
            vpi_free_object( item );
        }
    }

    return 0;
}

在本例中,我用vpiDecStrVal初始化了val。它指示编译器将值结果准备为十进制字符串。该值现在可以作为val.value.str访问。您有多种选择来获取2状态或4状态表示形式的字符串或二进制数据。

对于最多32位的2状态值,可以使用整数格式。但是,对于较长的值或4状态,您需要vpiVectorVal。它实际上请求verilog创建两个32位整数数组,aval和bval。两者的大小都足够大,可以保留所有位的值。aval和bval中的位的组合表示矢量中所有位的4状态值。

所有vpi信息在LRM中都可用,包括关系图和数据结构。也有一些书,例如萨瑟兰的《verilog pli handbook》。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60307212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档