错误:无法转换' bool'到&#s; svLogic *'在任务中

时间:2015-06-02 05:19:46

标签: c++ gcc system-verilog modelsim system-verilog-dpi

我们正在研究系统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。

4 个答案:

答案 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;