首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Verilog VPI将256位线传递给C函数。

通过Verilog VPI将256位线传递给C函数。
EN

Stack Overflow用户
提问于 2010-02-17 17:16:13
回答 1查看 1.8K关注 0票数 7

我在Verilog中有一个256位的值:

代码语言:javascript
复制
reg [255:0] val;

我想要定义一个系统任务$foo,它使用VPI调用外部C,所以我可以这样调用$foo:

代码语言:javascript
复制
$foo(val);

现在,在函数'foo‘的C定义中,我不能简单地将参数读取为整数(PLI_INT32),因为我有太多的位来适应其中之一。但是,我可以将参数读入字符串,这与字节数组是一样的。以下是我所写的:

代码语言:javascript
复制
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 reg:

代码语言:javascript
复制
 val = 256'h000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f;

然后使用$foo(val)调用它,然后C函数在模拟时打印它:

代码语言:javascript
复制
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?

  • What's中读取的256位值?这是个虫子吗?我错过了什么吗?

注意:我正在使用Aldec进行模拟。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-18 03:02:40

当该值被期望为ASCII文本时,将使用vpiStringVal,以便将该值作为指向C字符串的指针。如果您想将它与期望C字符串的C函数一起使用,例如printf()%s格式、fopen()等。但是,C字符串不能包含空字符(因为null用于终止C字符串),也不能表示x或z位,因此如果需要区分任何可能的向量值,就不应该使用这种格式。看起来,您使用的模拟器将空字符格式化为空格(0x20);其他模拟器只是跳过它们,但这也无助于您。要区分任何可能的向量值,可以使用vpiVectorVal (最紧凑的表示形式)或vpiBinStrVal (每个位具有一个0/1/x/z字符的二进制字符串)。

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

https://stackoverflow.com/questions/2282840

复制
相关文章

相似问题

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