我们正在研究系统verilog DPI调用。在编译C++
文件时,我们会收到如下错误:
错误:无法转换' bool'到&#s; 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。
答案 0 :(得分:0)
错误:无法在分配
中将'bool'转换为'svLogic *'
svLogic
似乎是一个指针。您不能将bool
值分配给指针变量。
TYPE* p = /* initialized somehow */;
bool b = /* initialized somehow */;
p = b; // YOU CANNOT DO THAT
答案 1 :(得分:0)
鉴于你有:
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();
答案 2 :(得分:0)
您可能想要重新考虑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,切换,然后他们的C代码应该#include该文件。然后编译器将捕获参数处理语法中的任何不匹配。
答案 3 :(得分:0)
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;