我没有在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
答案 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