为了获取数组的值,您需要分别获取数组中每个元素的值。 VPI 不返回完整数组的值。
实际上,您获得的数组句柄是vpiRegArray
类型。可以迭代它来访问每个单独的元素。
这是一个简单的代码,它执行迭代并打印数组中每个元素的值:
#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;
}
在这种情况下我初始化了val
with vpiDecStrVal
。它指示编译器将值结果准备为十进制字符串。现在可以通过以下方式访问该值val.value.str
。您有多种选择来获取 2 状态或 4 状态表示形式的字符串或二进制数据。
对于高达 32 位的 2 状态值,您可以使用整数格式。但是,对于较长的值或 4 状态,您需要vpiVectorVal
。它实际上请求verilog创建2个32位整数数组,aval和bval。两者的大小都足以保留该值的所有位。 aval 和 bval 中的位组合表示向量中所有位的 4 状态值。
LRM 中提供所有 vpi 信息,包括关系图和数据结构。还有一些书籍,例如 Sutherland 的《the verilog pli handbook》。