我在Verilog中有一个256位的值:
reg [255:0] val;
我想定义一个系统任务$foo,它使用VPI调用外部C,所以我可以这样调用$foo:
$foo(val);
现在,在函数“foo”的C定义中,我不能简单地将参数作为整数(PLI_INT32)来读取,因为我有太多的位不能放入其中一个。但是,我可以将参数读取为字符串,这与字节数组是一样的。以下是我写的:
static int foo(char *userdata) {
vpiHandle systfref, args_iter, argh;
struct t_vpi_value argval;
PLI_BYTE8 *value;
systfref = vpi_handle(vpiSysTfCall, NULL);
args_iter = vpi_iterate(vpiArgument, systfref);
argval.format = vpiStringVal;
argh = vpi_scan(args_iter);
vpi_get_value(argh, &argval);
value = argval.value.str;
int i;
for (i = 0; i < 32; i++) {
vpi_printf("%.2x ", value[i]);
}
vpi_printf("\n");
vpi_free_object(args_iter);
return 0;
}
几乎
00
总是被解读为
20
. 例如,如果我按如下方式分配Verilog注册表:
val = 256'h000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f;
并称之为使用
$foo(val)
,然后C函数在模拟时打印:
VPI: 20 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
00
总是映射到
20
val
.
vpiHexStrVal
,并打印字符串,它看起来很好。
因此,有两个问题:
-
有没有更好的方法从Verilog读取我的256位值?
-
这是怎么回事
20
? 这是虫子吗?我错过什么了吗?
注意:我使用Aldec进行模拟。