代码之家  ›  专栏  ›  技术社区  ›  pheaver

通过Verilog VPI将256位导线传递到C函数

  •  6
  • pheaver  · 技术社区  · 15 年前

    我在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 ,并打印字符串,它看起来很好。

    因此,有两个问题:

    1. 有没有更好的方法从Verilog读取我的256位值?
    2. 这是怎么回事 20 ? 这是虫子吗?我错过什么了吗?

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

    1 回复  |  直到 11 年前
        1
  •  4
  •   mark4o    15 年前

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