error: cannot convert 'bool' to 'svLogic*' in assignment

error: cannot convert 'bool' to 'svLogic*' in assignment

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

error: cannot convert 'bool' to 'svLogic*' in assignment

这里svLogic是4态变量

VCS模拟器在DirectC方法vc_putScalar中有预定义函数,其中vc_putScalar是"Passes the value of a scalar reg or bit to a vc_handle by reference"。 vc_handle 是函数中的输入或输出变量。使用 VCS 我们可以使用:vc_putScalar(mem_req_rdy, mm->req_cmd_ready());

我们正在开发 Modelsim 任务模拟器,因此 DirectC 将无法运行。我们很累把vc_putScalar修改成w.r.t的DPIIEEE Std 1800-2012标准。 我们将预定义的功能逻辑更改为: mem_req_rdy = mm->req_cmd_ready(); 这里 mem_req_rdy 是 svLogic 而 req_cmd_ready 是 bool.

error: cannot convert 'bool' to 'svLogic*' in assignment

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

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

假设你有:

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();

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

在许多情况下,不需要访问例程来访问在两种语言之间传递的参数。如果传递类型是 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 filename.h,切换然后他们的 C 代码应该 #include 该文件。然后编译器将捕获参数处理语法中的任何不匹配。

svLogic 是 unsiged char 的类型定义,参见 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;