在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。