One more attempt to repost:
module top ();
// import functions do a call from SV to C
import "DPI-C" context addone_c= function int addone_sv(input int x);
import "DPI-C" context function void show_vec_inC(input bit [31:0] some_vec);
import "DPI-C" context function void show_logic_inC(input logic [31:0] some_vec);
typedef struct packed {
int a;
bit [9:0] b;
bit [5:0] c;
} mydata_struct_s;
import "DPI-C" context function void pass_struct(inout mydata_struct_s t );
bit [31:0] some_vec = 32'h12345678;
logic [31:0] some_logic = 32'h8765X32Z;
mydata_struct_s mydata_struct_i;
initial
begin
$display("Gimme_Int %d",addone_sv(5));
show_vec_inC(some_vec); // pass reference per SV spec
show_logic_inC(some_logic); // pass reference per SV spec
// stuff the structure with data
mydata_struct_i.a = 9;
mydata_struct_i.b = 10'b10_1011_0110;
mydata_struct_i.c = 6'b11_0101;
pass_struct(mydata_struct_i); // pass reference to packed struct
$display("Verilog a %d", mydata_struct_i.a);
$display("Verilog b %h", mydata_struct_i.b);
$display("Verilog c %h", mydata_struct_i.c);
end
endmodule
----------------
#include
#include
// Copyright Cadence Design Systems, Todd Mackett 2007
// This is an example of manipulating packed data structure in SystemVerilog
// Use /tools/inca/include/svdpi.h as a reference
int addone_c(int x) {
return x +1;
}
void show_vec_inC(svBitVecVal* x) {
io_printf("show_vec_inC\n");
io_printf("a= %x\n", *x);
}
// svLogicVecVal can have 0,1,X,Z
void show_logic_inC(svLogicVecVal* x) {
io_printf("show_Logic_inC\n");
io_printf("a= %x\n", *x);
io_printf("aval %x\n", x->a); // identical to aval bval as in PLI
io_printf("bval %x\n", x->b);
}
// use VPI io_printf() instead of printf() to go to ncsim.log file
void pass_struct( svBitVecVal* x) { // NOT const so that this can be modified
// can use x[0] to reference raw array
// io_printf("Struct = %x, %x\n", x[0], x[1] );
svBitVecVal aa; // define a local svBitVecVal
// extract field a of SV "struct packed {...} mydata_struct_s
svGetPartselBit(&aa , x, 16, 32); // corresponds to mydata_struct.a
io_printf("mydata_struct_s.a: %x \n", aa);
svGetPartselBit(&aa , x, 6, 10); // corresponds to mydata_struct.b
io_printf("mydata_struct_s.b: %x \n", aa);
svGetPartselBit(&aa , x, 0, 6); // corresponds to mydata_struct.c
io_printf("mydata_struct_s.c: %x \n", aa);
io_printf("AA %x \n", aa);
// do some manipulation on the local svBitVecVal
aa = ~aa; // invert the bits (some generic bit manipulation routine)
// can do something like this too: just set the value of Verilog Structure
// aa = 13;
io_printf("AA %x \n", aa);
svPutPartselBit(x, aa, 0, 6); // this will modify the Verilog structure
}
Originally posted in cdnusers.org by tmackett