错误:无法在赋值时将'bool'转换为'svLogic *'

问题描述 投票:-2回答:4

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

c++ gcc system-verilog modelsim system-verilog-dpi
4个回答
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();

0
投票

错误:无法在赋值时将'bool'转换为'svLogic *'

svLogic似乎是一个指针。您不能将bool值分配给指针变量。

TYPE* p = /* initialized somehow */;
bool b = /* initialized somehow */;
p = b;  // YOU CANNOT DO THAT

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,switch然后他们的C代码应该#include该文件。然后编译器将捕获参数处理语法中的任何不匹配。


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;
© www.soinside.com 2019 - 2024. All rights reserved.