In reply to birdluo:
I faced the similar problem recently. I did the following for it.
package dpi_seq_pkg;
import "DPI-C" context task C_Program();
export "DPI-C" task sv_write;
export "DPI-C" task sv_read ;
int Addr, Data;
enum {WRITE, READ} kind;
event cmd_start, seq_done;
task sv_write(input int A, D);
kind = WRITE; Addr = A; Data = D;
->cmd_start;
@(seq_done);
return;
endtask : sv_write
task sv_read(input int A, output int D);
kind = READ; Addr = A;
->cmd_start;
@(seq_done);
D = Data;
return;
endtask : sv_read
endpackage : dpi_seq_pkg
task DPI_sequence::body()
fork
// C Program
dpi_seq_pkg::C_Program();
forever
begin : program_rendering
wait (dpi_seq_pkg::cmd_start.triggered);
if(dpi_seq_pkg::kind == dpi_seq_pkg::WRITE)
begin
agent_write_sequence api_wr_seq = agent_write_sequence::type_id::create("api_wr_seq");
api_wr_seq.Addr = dpi_seq_pkg::Addr;
api_wr_seq.Data = dpi_seq_pkg::Data;
api_wr_seq.start(m_sequencer, this);
end
if(dpi_seq_pkg::kind == dpi_seq_pkg::READ)
begin
agent_read_sequence api_rd_seq = agent_write_sequence::type_id::create("api_rd_seq");
api_rd_seq.Addr = dpi_seq_pkg::Addr;
api_rd_seq.start(m_sequencer, this);
dpi_seq_pkg::Data = api_rd_seq.Data;
end
-> dpi_seq_pkg::seq_done;
end // Program_rending
join_any
disable : fork;
.
.
.
extern "C" void sv_write(int, int );
extern "C" void sv_read (int, int *);
extern "C" void C_Program(void)
{
int * RDATA;
sv_write( 20, 5);
sv_write(100,15);
sv_read (20, RDATA);
cout << " RDATA : " << RDATA << endl;
return;
}
How do you think about this way?