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;
我们正在处理系统 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;