|HOME |ABOUT |ARTICLES |ACK |FEEDBACK |TOC |LINKS |BLOG |JOBS |


Tutorials



PASSING STRUCTS AND UNIONS

Passing Structure Example

DPI allows to pass the structs and Unions . This can be done by passing pointers or by packing.

In the following example, a "struct" is passed from SystemVerilog to C and also from C to Systemverilog using import and export functions.  While passing the "struct" data type, the data is packed in to array and passed from SV to C and then the array is decoded back to Struct in C. The same when the Struct is passed from C to SystemVerilog.


CODE: C_file.c

     #include "stdio.h"
     #include "vc_hdrs.h"
     #include "svdpi.h"
    
     extern "C" {
    
      
     typedef struct{
       int  a;
       int  b;
       char c;
    
     } C_struct;
      
     extern void export_func(svBitVec32 x[3] );
      
     void import_func()
     {
         C_struct  s_data;
         unsigned int arr[3];
        
         s_data.a = 51;
         s_data.b = 242;
         s_data.c = 35;
        
         printf( "C : s_data.a = %d\n", s_data.a );
         printf( "C : s_data.b = %d\n", s_data.b );
         printf( "C : s_data.c = %d\n\n", s_data.c );
      
         arr[0] =  s_data.a ;
         arr[1] =  s_data.b ;
         arr[2] =  s_data.c ;
      
         export_func(arr);
      
     }
     }
    
CODE: SV_file.sv
    
     program main;
      
         export "DPI-C" function export_func;
         import "DPI-C" function void import_func();
          
         typedef struct packed{
           int  a;
           int  b;
           byte  c;
         } SV_struct;
          
         function void export_func(input int arr[3]);
        
            SV_struct s_data;
            
             s_data.a = arr[0];
             s_data.b = arr[1];
             s_data.c = arr[2];
        
             $display("SV: s_data.a = %0d", s_data.a );
             $display("SV: s_data.b = %0d", s_data.b );
             $display("SV: s_data.c = %0d \n", s_data.c );
         endfunction
          
         initial 
         begin
            import_func();
         end
    
     endprogram


RESULTS:

C : s_data.a = 51
C : s_data.b = 242
C : s_data.c = 35

SV: s_data.a = 51
SV: s_data.b = 242
SV: s_data.c = 35


Passing Openarray Structs

CODE: C_file.c

#include "svdpi.h" 

typedef struct {int p; int q} PkdStru; 

void send2c(const svOpenArrayHandle dyn_arr) 
{ 
 int i;
 PkdStru Sele;      
     printf("\n \n Array Left %d, Array Right %d \n\n", svLeft(dyn_arr,1), svRight(dyn_arr, 1) );
     for (i= svLeft(dyn_arr,1); i <= svRight(dyn_arr,1); i++) {
         Sele = *(PkdStru*)svGetArrElemPtr1(dyn_arr, i);
         printf("C : %d : [%d,%d]\n",i, Sele.q,Sele.p );
     }
     printf("\n\n");
} 

CODE: SV_file.sv

program open_array_struct (); 
  
  typedef struct packed { int p; int q; } PkdStru; 
  
  import "DPI-C" function void send2c (input PkdStru arr []); 
  
  PkdStru arr_data [0:4]; 
  
  initial begin 

    foreach (arr_data[i]) begin
      arr_data[i] = {$random,$random};
      $display("SV: %0d : [%0d,%0d]",i,arr_data[i].p,arr_data[i].q);
    end    
    send2c(arr_data); 
  end 
    
endprogram 

RESULTS:


SV: 0 : [303379748,-1064739199]
SV: 1 : [-2071669239,-1309649309]
SV: 2 : [112818957,1189058957]
SV: 3 : [-1295874971,-1992863214]
SV: 4 : [15983361,114806029]

 
 Array Left 0, Array Right 4

C : 0 : [303379748,-1064739199]
C : 1 : [-2071669239,-1309649309]
C : 2 : [112818957,1189058957]
C : 3 : [-1295874971,-1992863214]
C : 4 : [15983361,114806029]



Passing Union Example

CODE:SV_file
    module m;
    
        typedef bit [2:0] A;
        
        typedef union packed { A a; S s; } U;
        U u;
        A a;
        
        // Import function takes three arguments
        import "DPI-C" function void foo8(input A fa, input U fu);
        
        initial begin
            a = 3'b100;
            u.a = 3'b100;
            foo8(a, u);
        end
    
    endmodule
    
CODE:C_file
    
    #include "svdpi.h"
    
    void foo8(
    const svBitVecVal* fa,
    const svBitVecVal* fu)
    {
        printf("fa is %d,  fu is %d\n", *fa,  *fu);
    }
    



Index
Introductions
Layers
Import
Naming
Export
Pure And Context
Data Types
Arrays
Passing Structs And Unions
Arguments Type
Disablie

Report a Bug or Comment on This section - Your input is what keeps Testbench.in improving with time!





<< PREVIOUS PAGE

TOP

NEXT PAGE >>

copyright © 2007-2017 :: all rights reserved www.testbench.in::Disclaimer