System verilog 是否可以将压缩结构与DPI一起使用
假设我有一个压缩结构:System verilog 是否可以将压缩结构与DPI一起使用,system-verilog,system-verilog-dpi,System Verilog,System Verilog Dpi,假设我有一个压缩结构: typedef struct packed { logic a; logic [7:0] b; bit [7:0] c; logic [7:0] [31:0] d; } my_struct; 我想把它传递到一个C函数中: import "DPI" context function int my_dpi_function (input my_struct data); 如何读取C端的值 int my_dpi_function (void* da
typedef struct packed {
logic a;
logic [7:0] b;
bit [7:0] c;
logic [7:0] [31:0] d;
} my_struct;
我想把它传递到一个C函数中:
import "DPI" context function int my_dpi_function (input my_struct data);
如何读取C端的值
int my_dpi_function (void* data)
{
... ?
return 0;
}
您需要的类型在
svdpi.h
标题中定义:
svLogicVecVal
所以,你需要像这样的东西:
int my_dpi_function (svLogicVecVal* data)
{
...
return 0;
}
svLogicVecVal
本身就是一个结构。它有两个字段-aval
和bval
(有时,例如在Cadence中,a
和b
)。从svdpi.h
:
aval
和bval
字段是这样编码的(所谓的“规范表示”):
因此,您可以访问C中的aval
和bval
字段。结果表明,对于大于32位的向量,最重要的32位字位于最高指针地址
SV
module test;
typedef struct packed {
logic a;
logic [7:0] b;
bit [7:0] c;
logic [7:0] [31:0] d;
} my_struct;
import "DPI-C" context function int my_dpi_function (logic [272:0] data);
initial
begin
automatic my_struct data = '{1'b0,8'hAA,8'h55,256'h0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF};
$display("%h",data);
my_dpi_function (data);
end
endmodule
C++
#include <iostream>
#include <iomanip>
#include <svdpi.h>
using namespace std;
extern "C" int my_dpi_function (svLogicVecVal* data) {
data+=8;
cout << "# C++: ";
for (int i=0; i<9; i++)
cout << std::hex << std::setw(8) << std::setfill('0') << (data--)->aval;
cout << "\n";
return 0;
}
#包括
#包括
#包括
使用名称空间std;
外部“C”int my_dpi_函数(svLogicVecVal*数据){
数据+=8;
是的,您可以使用它们。在c
端,您只需要得到一个比特流。您可以遍历它,使用svdpi.h
中的get
函数来重新创建您的结构字段。这看起来是错误的。X被编码为11。您似乎颠倒了X和Z。
module test;
typedef struct packed {
logic a;
logic [7:0] b;
bit [7:0] c;
logic [7:0] [31:0] d;
} my_struct;
import "DPI-C" context function int my_dpi_function (logic [272:0] data);
initial
begin
automatic my_struct data = '{1'b0,8'hAA,8'h55,256'h0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF};
$display("%h",data);
my_dpi_function (data);
end
endmodule
#include <iostream>
#include <iomanip>
#include <svdpi.h>
using namespace std;
extern "C" int my_dpi_function (svLogicVecVal* data) {
data+=8;
cout << "# C++: ";
for (int i=0; i<9; i++)
cout << std::hex << std::setw(8) << std::setfill('0') << (data--)->aval;
cout << "\n";
return 0;
}