| |
|
|
 |

Many of you already received communications about the move of the Cadence user community into cadence.com. And many of you have already joined, with over 4000 registrations in the first two weeks.The new Cadence Community enhances the ability of Cadence users to connect and collaborate. In addition to moving the community into cadence.com -- enabling single sign-on for community, Sourcelink and Cadence events -- the new site is organized around nine technology segments, giving you easy access to product information, training, forums and blogs. Some of the new features include: - Ability to respond to posts via e-mail
- Technology-specific blogs
- Latest Web 2.0 social networking capabilities
- Public profile options
- Private messaging
- Friends lists
Visit the new Cadence Community today at www.cadence.com/community and join the discussions! Registration note: Due to the scope of the enhancements and the new SSO registration system, we were not able to migrate existing cdnusers.org member accounts. So new registrations are required, but this enables a broader set of functionality we think you'll enjoy. Forum note: Under the guidance of forum moderators, we have taken the 20+ cdnusers.org forums and consolidated them into 11 forums on the new site. Posts have been brought over so you can leverage that posting history. CDNusers forums will be set to read only starting 7/30, and cdnusers.org will be redirected to the new community on 8/4.Best regards, Mike and Tom Michael A. Catrambone - Steering Committee Chairman Distinguished Engineer PCB/Mechanical UTStarcom, Inc. Tom Diederich Cadence Community Manager
|
|
|
| Home |
 |
 |
 |
|
 |
 |
Posting to forums is available to community members only. Login or Register |
|
| Author |
Messages |
|
prasad_vc Posts: 0 Online:
 |
| 9/20/2006 2:26 AM |
|
Hi, I am trying my hand on DPI, and have an example in which i want to pass a struct as an argument to 'C'. however i am not getting any results.
**********************************
The code is:
// Program to pass struct data-type as an argument. // Author: Vivek C. Prasad // Date : 20 september 2006
#include #include "svdpi.h"
typedef struct { char a; int b; } AB;
AB sc; int str(const AB sc) { printf("the byte is: %c\n",sc.a); printf("the int is: %d\n",sc.b); return(-1); }
**********************************
// Program to pass struct data-type as an argument. // Author: Vivek C. Prasad // Date : 20 september 2006
module structPass(); int res; typedef struct packed { byte a; shortint b; } AB;
AB dt_struct; import "DPI-C" context str = function int structFunction(input dt_struct);
initial begin dt_struct.a = "V"; dt_struct.b = 10; res = structFunction(dt_struct); $display("The struct is passed as an argument.\n"); $display("Byte: %0d\n",dt_struct.a); $display("Int : %0d\n",dt_struct.b); $display("Return : %0d\n",res); end endmodule
********************************** The Result is:
the byte is: the int is: 0 The struct is passed as an argument.
Byte: 86
Int : 10
Return : -1
**********************************
Vivek.
|
|
|
|
tpylant Posts: 87 Online:
 |
| 9/21/2006 6:28 PM |
|
Using example F9.3 in appendix F of the LRM, it looks like the syntax of the str function should be:
int str(const AB *sc) { printf("the byte is: %c\n", sc->a); printf("the int is: %d\n", sc->b); return(-1); }
Tim |
|
|
|
tpylant Posts: 87 Online:
 |
| 9/21/2006 6:30 PM |
|
Also on the SV side, the import should be:
import "DPI-C" context str = function int structFunction(input AB dt_struct);
You were missing the data type for the input argument.
Tim |
|
|
|
prasad_vc Posts: 0 Online:
 |
| 9/21/2006 10:29 PM |
|
Hi Tim,
I tried it with the same, but could not get the desired result. Also, when i say "(input AB dt_struct)", the compiler says unsupported data-type in formal argument.
I am using ncsim 5.6s005. Is it the tool issue?
Vivek |
|
|
|
prasad_vc Posts: 0 Online:
 |
| 9/22/2006 7:19 AM |
|
Hi Tim, With the ncsim v5.81 i was able to come up those issues, however one more difficulty has arose, the struct i am passing as an argument, is giving me swapped results. I mean, the struct member 'int' of sv is assigned to struct member 'byte' of 'C' and vice-versa. In my previous output it becomes
the byte is: 10 the int is: 86 The struct is passed as an argument. Byte: 86 Int : 10
Isn't there anything like packing.low and packing.high as like specman in SystemVerilog.
Vivek.
|
|
|
|
tmackett Posts: 34 Online:
 |
| 1/23/2007 2:56 PM |
|
Hmmmm, the above example came out with some strange characters when I copied/pasted to this. Let me repost:
---file: top.v------- 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 ⎫:0] some_vec = 32'h12345678; logic ⎫: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
-------file: main_task.c---------- #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) { printf("show_vec_inC\n"); printf("a= %x\n", *x); }
// svLogicVecVal can have 0,1,X,Z void show_logic_inC(svLogicVecVal* x) { printf("show_Logic_inC\n"); printf("a= %x\n", *x); printf("aval %x\n", x->a); printf("bval %x\n", x->b);
}
void pass_struct( svBitVecVal* x) { // NOT const so that this can be modified // can use xΎ] to reference raw array // printf("Struct = %x, %x\n", x Ύ], x Ώ] ); svBitVecVal aa; // define a local svBitVecVal // extract field a of SV "struct packed {...} mydata_struct_s
svGetPartselBit(&aa , x, 16, 32); printf("mydata_struct_s.a: %x \n", aa); svGetPartselBit(&aa , x, 6, 10); printf("mydata_struct_s.b: %x \n", aa); // everything above here works
svGetPartselBit(&aa , x, 0, 6); printf("mydata_struct_s.c: %x \n", aa); // svPutBitselBit(aa, 0, sv_0); 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; printf("AA %x \n", aa); svPutPartselBit(x, aa, 0, 6); // this will modify the Verilog structure }
|
|
Todd Mackett Cadence Incisive |
|
n_prasanna Posts: 1 Online:
 |
| 1/28/2008 12:31 AM |
|
| Hi Tim,
I am trying to run the system verilog example you have given here for passing structure as an argument to C function. even with the modifications you had suggested i still do not see the proper values being printed by the C Function.
I am attaching the SV file and the C Function.
System Verilog :-
--------------------------------------
module structPass();
int res;
typedef struct packed {
byte a;
shortint b;
} AB;
AB dt_struct;
import "DPI-C" context str = function int structFunction(input AB dt_struct);
initial begin
dt_struct.a = "V";
dt_struct.b = 10;
res = structFunction(dt_struct);
$display("The struct is passed as an argument.\n");
$display("Byte: %0d\n",dt_struct.a);
$display("Int : %0d\n",dt_struct.b);
$display("Return : %0d\n",res);
end
endmodule
C Function :-
--------------------------------------------
#include
#include "/tools/cadence/install/tools.lnx86/include/svdpi.h"
#include "/tools/cadence/install/tools.lnx86/include/vpi_user.h"
typedef struct {
char a;
int b;
} AB;
AB sc;
int str(const AB *sc) {
printf("the byte is: %c\n",sc->a);
printf("the int is: %d\n",sc->b);
return(-1);
}
---------------------------------------
Any help would be appreciated.
|
|
|
|
tpylant Posts: 87 Online:
 |
| 1/29/2008 10:31 AM |
|
The problem is that the fields are coming across reversed which I don't understand. Here is the code that demonstrates that:
module structPass();
int res;
typedef struct packed {
byte a;
int b;
} AB;
AB dt_struct;
import "DPI-C" context str = function int structFunction(input AB dt_struct);
initial begin
dt_struct.a = "V";
dt_struct.b = 10;
$display("\nThe struct is passed as an argument.");
$display("SV Byte: %0s",dt_struct.a);
$display("SV Int : %0d",dt_struct.b);
res = structFunction(dt_struct);
$display("\nReturn : %0d\n",res);
end
endmodule
#include <stdio.h>
#include "svdpi.h"
typedef struct {
int b;
char a;
} AB;
AB sc;
int str(const AB *sc) {
printf("\nThe struct is received as an argument.\n");
printf("C Byte: %c\n",sc->a);
printf("C Int : %d\n",sc->b);
return(-1);
}
I know Todd posted a way to do it by treating the struct as a vector, but maybe someone else could shed some light on the struct reversing problem.
Tim |
|
|
|
stephenh Posts: 77 Online:
 |
| 1/29/2008 10:38 AM |
|
The reversing of the struct is apparently deliberate and universal across all simulators, but I can't remember why it's meant to happen. The fun thing is that packed and unpacked structs behave differently - i.e. one reverses, the other doesn't. Hopefully one of the simulator gurus can explain. If I can find the original explanation from a couple of years ago, I'll post that too... |
|
Steve H. |
|
|
Posting to forums is available to community members only. Login or Register |
|
|
|
ActiveForums 3.6
|
|
|
|
 |
| |
|
|
|