-2

我们正在处理系统 verilog DPI 调用。在编译C++文件时,我们收到如下错误:

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

svLogic是四态变量。

VCS 模拟器在 DirectC 方法中具有预定义函数vc_putScalar,其中 vc_putScalar 是“通过引用将标量 reg 或位的值传递给 vc_handle”。vc_handle 是函数中的输入或输出变量。使用 VCS,我们可以使用:vc_putScalar(mem_req_rdy, mm->req_cmd_ready());

我们正在开发 Modelsim questa 模拟器,因此 DirectC 将无法工作。我们厌倦了修改vc_putScalarDPI IEEE Std 1800-2012标准的内容。我们将预定义的函数逻辑更改为: mem_req_rdy = mm->req_cmd_ready();这里 mem_req_rdy 是 svLogic,req_cmd_ready 是 bool。

4

4 回答 4

0

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

svLogic似乎是一个指针。您不能bool为指针变量赋值。

TYPE* p = /* initialized somehow */;
bool b = /* initialized somehow */;
p = b;  // YOU CANNOT DO THAT
于 2015-06-02T06:37:29.710 回答
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();
于 2015-06-02T07:44:14.873 回答
0

您可能需要重新考虑您的 DPI 界面。你的 C 代码真的需要处理四态逻辑吗?

在许多情况下,不需要访问例程来访问在两种语言之间传递的参数。这总是正确的,因为传递的类型是 C 兼容的(int、byte、string 以及这些类型的解包数组和结构)。

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

于 2015-06-02T16:38:50.653 回答
0

svLogic 是 的 typedef unsiged char,参见IEEE Std 1800-2012 § H.10.1.1 Scalars of type bit and logic

对于 bool 到 svLogic 的转换,您需要一个函数,而不是直接赋值。如果 bool 值为 true,则应将 svLogic 分配给sv_1. 如果 bool 值为 falue,则应将 svLogic 分配给sv_0.

像这样的东西应该工作:

mem_req_rdy = mm->req_cmd_ready() ? sv_1 : sv_0;
于 2015-06-02T16:40:25.213 回答