在DPI-C中,哪些数据类型用于内部变量?

时间:2017-09-08 09:27:59

标签: c system-verilog system-verilog-dpi

我没有在EDA Playground中使用VCS中的DPI-C获得以下代码的正确输出。我希望6作为答案,但我每次都得到248,无论a和b值如何。我尝试在helloFromC.c中使用svLogic,int和unsigned char作为a_int的数据类型。

module automatic test;

  import "DPI-C" function void helloFromC(logic [2:0] a, logic [2:0] b);

  initial run();

  task run();
    logic [2:0] a; 
    logic [2:0] b; 
    logic [2:0] c;
    a = 3'b100;
    b = 3'b010;
    c = a+b;
    $display("Output from SV is %0d", c);
    helloFromC(a,b);

  endtask

endmodule

这是我的C程序

#include <stdio.h>
#include <svdpi.h>


extern "C" int helloFromC(svLogic a, svLogic b) {
  svLogic a_int = a+b;
  printf("Output from C is %d", a_int);
  return 0;
}

我输出为

Output from SV is 6
Output from C is 248

2 个答案:

答案 0 :(得分:1)

svLogic应该映射到单个位logic。你有一个矢量(也就是打包数组),因此你应该使用svLogicVecVal。它仍然是一个4状态值,因此在C端执行的SystemVerilog值的算法运算可能无法按预期方式工作。在SystemVerilog端使用bit [2:0],在C端使用svBitVecVal可以更好地工作。或简化事情并双方使用int

有关DPI的更多信息,请参阅IEEE1800-2012第35节,附录H和附件I.

答案 1 :(得分:1)

从其中一个链接addition using DPI call我可以找到我要找的内容

#include <stdio.h>
#include <svdpi.h>


extern "C" void
add_bpv(
    const svBitVecVal* a,
    const svBitVecVal* b,
    svBitVecVal* c) {
    *c = *a + *b;
    printf("Output from C is %d", *c);
}

现在SV程序DPI调用

module automatic test;

  import "DPI-C" function void add_bpv(input bit [3:0] a,b, output bit [3:0] c);

  initial run();

  task run();
    bit [3:0] a,b,c;
    a = 3'b100;
    b = 3'b010;
    c = a+b;
    $display("Output from SV is %d", c);
    add_bpv(a,b,c);
  endtask

endmodule

输出是我想要的

Output from SV is  6
Output from C is 6