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;
}