我们正在研究系统verilog DPI调用。在编译C++
文件时,我们得到如下错误:
错误:无法在赋值时将'bool'转换为'svLogic *'
这里svLogic
是4状态变量。
VCS模拟器在DirectC方法vc_putScalar
中具有预定义函数,其中vc_putScalar是“通过引用将标量reg或bit的值传递给vc_handle”。 vc_handle是函数中的输入或输出变量。使用VCS我们可以使用:vc_putScalar(mem_req_rdy, mm->req_cmd_ready());
我们正在开发Modelsim questa模拟器,因此DirectC不起作用。我们厌倦了将vc_putScalar
修改为DPI IEEE Std 1800-2012标准的w.r.t.我们将预定义的函数逻辑更改为:mem_req_rdy = mm->req_cmd_ready();
这里mem_req_rdy是svLogic,req_cmd_ready是bool。
鉴于你有:
vc_putScalar(mem_req_rdy, mm->req_cmd_ready());
我猜测mem_req_rdy是指针类型svLogic *(因为从函数vc_putScalar的名称,它似乎打算更改mem_req_rdy中保存的值)。因此,您需要取消引用指针,如下面的语句所示:
*mem_req_rdy = mm->req_cmd_ready();
错误:无法在赋值时将'bool'转换为'svLogic *'
svLogic
似乎是一个指针。您不能将bool
值分配给指针变量。
TYPE* p = /* initialized somehow */;
bool b = /* initialized somehow */;
p = b; // YOU CANNOT DO THAT
您可能想要重新考虑DPI界面。你的C代码真的需要处理4态逻辑吗?
在许多情况下,访问两种语言之间传递的参数不需要访问例程。这总是正确的是传递类型是C兼容的(int,byte,string和unpacked数组以及这些类型的结构)。
例如,这个DirectC示例
SV:
extern "C" void foo(input bit A, output bit B);
C:
void foo(vc_handle A, vc_handle B)
{ vc_scalar value;
value = vc_getSalar(A);
vc_putScalar(B,value);
}
转换为此DPI代码
SV:
import "DPI-C" void foo(input bit A, output bit B);
C:
void foo(svBit A, svBit *B)
{ svBit value;
value = A;
*B = value;
}
我们强烈建议Questa DPI用户使用vlog -dpiheader filename.h,switch然后他们的C代码应该#include该文件。然后编译器将捕获参数处理语法中的任何不匹配。
svLogic是unsiged char
的typedef,参见IEEE Std 1800-2012§H.10.1.1类型位和逻辑的标量
对于bool到svLogic转换,您需要一个函数,而不是直接赋值。如果bool值为true,则应将svLogic分配给sv_1
。如果bool值为falue,则应将svLogic分配给sv_0
。
这样的事情应该有效:
mem_req_rdy = mm->req_cmd_ready() ? sv_1 : sv_0;