Skip Nav
Home » Forums » SystemC Forum

Icon - KMLM List KMLM List

View email archives for the history of this mailing list.

List Home All Archives Dates Threads Authors Subjects
systemc-forum - Re: [systemc-forum] Hi need help regarding executing process and methods Message Thread: Previous | Next
  • To: alan.fitch@xxxxxxxxxx
  • From: Rama krishna Reddy <krisreddi46@xxxxxxxxx>
  • Date: Mon, 13 Feb 2012 14:36:28 +0100
  • Cc: andrea.battistella@xxxxxxx, adhikari@xxxxxxxxxxxxxxxx, systemc-forum@xxxxxxxxxxxxxxxxxxx
Send Email to systemc-forum@lists.accellera.org:
Send new message
Reply to this message
Hi Thanks for reply.
I followed Andrea's method and i am getting error as complete binding failed: port not bound: port 'C.port_1' (sc_fifo_out).  

#include <systemc.h>
#include <iostream>

SC_MODULE(a) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(a)  {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(20, SC_US);
fout.write(temp);
cout<<"value of temp from module a :"<<temp<<endl;
}
}
};

SC_MODULE(b) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(b) {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(200, SC_US);
fout.write(temp);
cout<<"value of temp from module b :"<<temp<<endl;
}
}
};
SC_MODULE(c) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(c)  {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(40, SC_US);
fout.write(temp);
cout<<"value of temp from module c :"<<temp<<endl;
}
}
};

int sc_main(int argc, char* argv[])
{
   // module instances
   a     A("A");
   b     B("B");
   c     C("C");

   sc_fifo<int>  fifo1("fifo1");
   sc_fifo<int>  fifo2("fifo2");
   
//   sc_fifo<int>  fifo1(1);
//   sc_fifo<int>  fifo2(1);
   
   // connect instances
   A.fout(fifo1);
   B.fin(fifo1);
   B.fout(fifo2);
   C.fin(fifo2);
   sc_start(1,SC_MS);
   return 0;
}

Also if i initialize fifo in the constructor as
 SC_CTOR(a) : fin(1), fout(1) {
  SC_THREAD(t);
 }
 i am getting error: invalid conversion from `int' to `const char*'



On Mon, Feb 13, 2012 at 2:17 AM, <alan.fitch@xxxxxxxxxx> wrote:
Yes, Andrea's correct, I was thinking of three modules.

But it should still work with one module containing 3 processes and 2 fifos.

However in Rama's code there's a basic mistake. The code

SC_CTOR(example_fifo) {
SC_METHOD(module_b);
sensitive<<clk.pos();
SC_THREAD(module_a);
SC_THREAD(module_c);
// Size the packet_fifo to 5 ints.
sc_fifo<int> packet_fifo (5);
}

// Declare the FIFO
sc_fifo<int> packet_fifo;

should be

SC_CTOR(example_fifo) : sc_fifo<int> packet_fifo(1) {
SC_METHOD(module_b);
sensitive<<clk.pos();
SC_THREAD(module_a);
SC_THREAD(module_c);
}

// Declare the FIFO
sc_fifo<int> packet_fifo;

Also you only have one fifo, not two.

Or you could follow Andrea's outlined code, which looks good to me,

regards
Alan




--
Alan Fitch
Senior Consultant

Doulos - Developing Design Know-how
VHDL * Verilog * SystemVerilog * SystemC * PSL * Perl * Tcl/Tk * Project Services

Doulos Ltd. Church Hatch, 22 Market Place, Ringwood, Hampshire, BH24 1AW, UK
Tel:  + 44 (0)1425 471223                       Email: alan.fitch@xxxxxxxxxx
Fax:  +44 (0)1425 471573                        http://www.doulos.com

--------------------------------------------------------------------------------
Doulos Ltd is registered in England and Wales with company no. 3723454
Its registered office is 4 Brackley Close, Bournemouth International Airport,
 Christchurch, BH23 6SE, UK.

This message (and associated files) may contain information that is confidential,
proprietary, privileged, or subject to copyright. It is intended solely for the use
of the individual to whom it is addressed and others authorised to receive it. If
you have received this email in error, please notify the sender and delete all
copies. This message may contain personal views which are not the views of
Doulos, unless specifically stated.

-----<systemc-forum@xxxxxxxxxxxxxxxxxxx> wrote: -----
To: Rama krishna Reddy <krisreddi46@xxxxxxxxx>
From: andrea.battistella@xxxxxxx
Sent by:
Date: 12/02/2012 09:43
Cc: adhikari@xxxxxxxxxxxxxxxx, systemc-forum@xxxxxxxxxxxxxxxxxxx, alan fitch <alan.fitch@xxxxxxxxxx>
Subject: Re: [systemc-forum] Hi need help regarding executing process and methods sequentially rather then concurrently.

Hi Rama,

Alan suggests you to create 3 different modules comunicating each other through different sc_fifo ... in fact standard read and write FIFO Communication APIs are blocking this will make all your 3 modules synchronized as you are looking for ...
In other terms ...

SC_MODULE(a) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(a) : fin(1), fout(1) {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(20, SC_US);
fout.write(temp);
}
};

SC_MODULE(b) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(b) : fin(1), fout(1) {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(200, SC_US);
fout.write(temp);
}
};
SC_MODULE(c) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(c) : fin(1), fout(1) {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(40, SC_US);
fout.write(temp);
}
};

int main(int argc, char **argv)
{
    // module instances
    a     A("A");
    b     B("B");
    c     C("C");
...  

    sc_fifo<int>  fifo1("fifo1");
    sc_fifo<int>  fifo2("fifo2");
...
  
    // connect instances
...
    A.fout(fifo1);
    B.fin(fifo1);

    B.fout(fifo2);
    C.fin(fifo2);
...

    sc_start();
    return(1);
};


Kind regards
Andrea

P.S. I haven't compiled that code, I hope it is write(!)

----- Mail original -----
De: "Rama krishna Reddy" <krisreddi46@xxxxxxxxx>
À: "alan fitch" <alan.fitch@xxxxxxxxxx>
Cc: adhikari@xxxxxxxxxxxxxxxx, systemc-forum@xxxxxxxxxxxxxxxxxxx
Envoyé: Dimanche 12 Février 2012 00:13:24
Objet: Re: [systemc-forum] Hi need help regarding executing process and methods sequentially rather then concurrently.

Hi Alan,
Thanks for suggestion of using sc_fifo.
As i said in the previous reply my module_a should execute for a duration 20 us, module_b for duration 200 us and module_c for duration of 40 us and then the process should continue till the given simulation time. I made changes to my code using fifos but i am not getting required output. Here i am sending my code please give some suggestions.




#include <systemc.h>
#include <iostream>


SC_MODULE(example_fifo) {
sc_in<bool> clk;
void example_fifo::module_b(void);
void example_fifo::module_a(void);
void example_fifo::module_c(void);
// Constructor
SC_CTOR(example_fifo) {
SC_METHOD(module_b);
sensitive<<clk.pos();
SC_THREAD(module_a);
SC_THREAD(module_c);
// Size the packet_fifo to 5 ints.
sc_fifo<int> packet_fifo (5);
}

// Declare the FIFO
sc_fifo<int> packet_fifo;
};


void example_fifo::module_b(void) {
int val;
std::cout <<sc_time_stamp()<< ": clk pos edge"<<endl;
if (packet_fifo.nb_read(val)) {
std::cout << sc_time_stamp() << ": module_b(): Received " << val <<std::endl;
} else {
std::cout << sc_time_stamp() << ": module_b(): FIFO empty." << std::endl;
}

// next_trigger(200, SC_US);
}


void example_fifo::module_a(void) {
int val = 1000;
for (;;) {
wait(20,SC_US);
val++;
packet_fifo.write(val);
std::cout << sc_time_stamp() << ": module_a(): Wrote " << val << std::endl;
}
}


void example_fifo::module_c(void) {
int val=2000;
for (;;) {
wait(40,SC_US);
val++;
packet_fifo.write(val);
std::cout << sc_time_stamp() << ": module_c(): Wrote " << val << std::endl;
}
}


int sc_main(int argc, char* argv[]) {
sc_clock clk("clk", 12,SC_US);
example_fifo ex_fifo ("ex_fifo0");
ex_fifo.clk(clk);
sc_start(10, SC_MS);
return 0;
}

Thank you.
krishna Reddy.

On Sat, Feb 11, 2012 at 11:49 AM, < alan.fitch@xxxxxxxxxx > wrote:


I would connect the three modules with depth 1 fifos, and then use blocking reads and writes at each end. The you don't need the explicit events at all (unless you are deliberately using immediate notification for some reason - fifos will have delta delays)

For examples

SC_MODULE(c) {
sc_fifo_in<int> fin;
sc_fifo_out<int> fout;

SC_CTOR(c) : fin(1), fout(1) {
SC_THREAD(t);
}

void t () {
int temp;
for (;;) {
temp = fin.read();
wait(200, SC_US);
fout.write(temp);
}
};

If you like you can parameterize the delay, create a generic module.

Obviously the first module must generate writes autonomously,

regards
Alan

P.S. I haven't compiled that code, I hope it is write(!)

--
Alan Fitch
Senior Consultant

Doulos - Developing Design Know-how
VHDL * Verilog * SystemVerilog * SystemC * PSL * Perl * Tcl/Tk * Project Services

Doulos Ltd. Church Hatch, 22 Market Place, Ringwood, Hampshire, BH24 1AW, UK
Tel: + 44 (0)1425 471223 Email: alan.fitch@xxxxxxxxxx
Fax: +44 (0)1425 471573 http://www.doulos.com

--------------------------------------------------------------------------------
Doulos Ltd is registered in England and Wales with company no. 3723454
Its registered office is 4 Brackley Close, Bournemouth International Airport,
Christchurch, BH23 6SE, UK.

This message (and associated files) may contain information that is confidential,
proprietary, privileged, or subject to copyright. It is intended solely for the use
of the individual to whom it is addressed and others authorised to receive it. If
you have received this email in error, please notify the sender and delete all
copies. This message may contain personal views which are not the views of
Doulos, unless specifically stated.

-----< systemc-forum@xxxxxxxxxxxxxxxxxxx > wrote: -----
To: Sumit Adhikari < adhikari@xxxxxxxxxxxxxxxx >
From: Rama krishna Reddy
Sent by:
Date: 11/02/2012 01:44
Cc: " systemc-forum@xxxxxxxxxxxxxxxxxxx " < systemc-forum@xxxxxxxxxxxxxxxxxxx >
Subject: Re: [systemc-forum] Hi need help regarding executing process and methods sequentially rather then concurrently.



Hello sorry for not mentioning test case. Below is the header and classes which i used. Now when i run all methods are executed concurrently, but i need result as method_a,method_b,method_c,method_a,method_b,method_c......continues till simulation time finishes.
suppose module_a duration is 20 us, module_b duration is 200 us and module_c duration is 40 us and total simulation time is 1 ms.

Thank you.

//module_a.h
SC_MODULE (module_a)
{
sc_event event_a;

SC_CTOR(module_a)
{
SC_THREAD(thread_a);
SC_METHOD(method_a);
sensitive<<event_a;
dont_initialize();
}

void thread_a(void);
void method_a(void);
};

//module_b.h
SC_MODULE (module_b)
{
sc_in<bool> clk;

SC_CTOR(module_b)
{
SC_METHOD(method_b);
sensitive<<clk.pos();
dont_initialize();
}

void method_b(void);
};

//module_c.h
SC_MODULE (module_c)
{
sc_event event_c;

SC_CTOR(module_c)
{
SC_THREAD(thread_c);
SC_METHOD(method_c);
sensitive<<event_c;
dont_initialize();
}

void thread_c(void);
void method_c(void);
};


//module_a.cpp
void module_a::method_a(void)
{
cout<<"method_a : "<<sc_time_stamp()<<endl;
}
void module_a::thread_a(void)
{
for(;;)
{
wait(200,SC_US);
event_a.notify();
}
}


//module_b.cpp
void module_b::method_b(void)
{
cout<<"method_b : "<<sc_time_stamp()<<endl;
}

//module_c.cpp
void module_c::method_c(void)
{
cout<<"method_c : "<<sc_time_stamp()<<endl;
}
void module_c::thread_c(void)
{
for(;;)
{
wait(200,SC_US);
event_c.notify();
}
}


//main.cpp
int sc_main(int argc, char* argv[])
{
sc_clock clk("clk",30,SC_US);

module_a imodule_a("imodule_a");
module_b imodule_b("imodule_b");
module_c imodule_c("imodule_c");

imodule_b.clk(clk);

sc_start(1,SC_MS);
return 0;
}


On Thu, Feb 9, 2012 at 11:33 PM, Sumit Adhikari < adhikari@xxxxxxxxxxxxxxxx > wrote:
Rama :

Reporting a problem without a test case will not help.

Can you please send us a minimal test case of your issue ?

Regards,

-------
Sumit Adhikari,
Institute of Computer Technology,
Vienna University of Technology,
Gußhausstraße 27-29,1040 Vienna
________________________________________
From: systemc-forum@xxxxxxxxxxxxxxxxxxx [ systemc-forum@xxxxxxxxxxxxxxxxxxx ] on behalf of Rama krishna Reddy [ krisreddi46@xxxxxxxxx ]
Sent: Thursday, February 09, 2012 11:06 PM
To: systemc-forum@xxxxxxxxxxxxxxxxxxx
Subject: [systemc-forum] Hi need help regarding executing process and methods sequentially rather then concurrently.


Hello Friends,

I am modelling an FSM related to some communication cycle. Each cycle has
some duration and this cycles are repeated for a particular simulation time.
Each cycle is divided into 3 parts static, dynamic and idle. The static and idle
duration is fixed dynamic changes depending on number of slots it has. I
implemented each of them in separate header files and source respectively; and
if i start the simulation they are executed in concurrently. But i need to
execute in sequential way as static,dynamic,idle and this should carry on till
simulation time finishes.



Thanks you.



By Date: Previous | Next Current Thread By Thread: Previous | Next