Rigid Pipeline

From Lyra

Jump to: navigation, search

This example models a rigid pipeline stage.

Rigid pipeline stage
Rigid pipeline stage
module rp_stage(in<int> enq, out<int> deq)
{
    reg int myreg;

    init                                                      
    {
        myreg = 0;
    }

    fsm my_fsm                                                
    {
        init S:
            when (enq, deq)
            {
                /* enqueue and dequeue occurs simultaneously 
                    => pipelined transfer */
                deq.write(myreg);
                myreg = enq.read();
                goto S;
            }
    }
}
module producer(out<int> produce)
{
    reg int myreg;

    init
    {
        myreg = 1;
    }

    fsm my_fsm
    {
        init U: // start state
            when (produce)
            {
            // rendezvous to synchronize with and forward data to buffer
                produce.write(myreg);
                myreg = myreg + 1;
                goto U;
            }
    }
}

module consumer(in<int> consume)
{
    reg int myreg;

    init
    {
        myreg = 0;
    }

    fsm my_fsm
    {
        init X: // start state
            when (consume)
            {
                // rendezvous to synchronize with and receive data from buffer
                myreg = consume.read();
                goto X;
            }
    }
}

                                                              
module toplevel
{

    /* two rendezvous, point to point */                      
    rendv p1, p2, p3, p4, p5;

    /* instantiation of modules */                            
    rp_stage s1(p1, p2);
    rp_stage s2(p2, p3);
    rp_stage s3(p3, p4);
    rp_stage s4(p4, p5);

    producer pro(p1);                                         
    consumer con(p5);
}
Personal tools