在EDA操场的VCS中使用DPI-C,我没有得到以下代码的正确输出。我希望答案是6,但不管a和b值是多少,我每次都会得到248。我尝试过在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

最佳答案

svLogic应该映射到单个位logic。您有一个向量(也称为压缩数组),因此应该使用svLogicVecVal。它仍然是一个4状态值,因此在C端执行的SystemVerilog值的算法操作可能无法按您预期的方式工作。在SystemVerilog端使用bit [2:0]和在C端使用svBitVecVal将比您预期的更有效。或者把事情简单化,两边都用int
有关DPI的更多信息,请参阅IEEE1800-2012第35节,附件H和附件I。

08-08 00:51