加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SystemC实例六:fifo

(2010-05-10 06:03:06)
标签:

systemc

channel

fifo

分类: IC设计
本例子实现了一个简单的fifo,生产者和消费者利用fifo进行通信。系统原理如下图所示。
http://s11/middle/676fb938g8630882817da&690
系统共四个模块:fifo、producer、consumer和test。其中fifo为通信的channel,实现了读和写两个接口,而producer具有一个写接口的port,consumer具有一个读接口的port。

1、read_if、write_if接口定义
读接口:read_if
class read_if: virtual public sc_interface
{
public:
    virtual void read(char &)=0;
    virtual int num_available()=0;
};

写接口:write_if
class write_if: virtual public sc_interface
{
public:
    virtual void write(char)=0;
    virtual void reset()=0;
};

2、fifo channel
fifo模块继承sc_channel,并实现了read和write两个interface。
class read_if: virtual public sc_interface
{
public:
    virtual void read(char &)=0;
    virtual int num_available()=0;
};

class write_if: virtual public sc_interface
{
public:
    virtual void write(char)=0;
    virtual void reset()=0;
};

class fifo: public sc_channel,public read_if,public_write_if
{
private:
    enum e{max=10};
    char data[max];
    int num_elements,first;
    sc_event write_event,read_event;
public:
    
    fifo(sc_module_name name):sc_channel(name),num_elements(0),first(0){}
    
    void read(char &c)
    {
        if(num_elements == 0)
            wait(write_event);
        c = data[first];
        num_elements--;
        first = (first+1) % max;
        read_event.notify();
    }

    void write(char c)
    {
        if(num_elements == max)
            wait(read_event);
        data[(first + num_elements) % max] = c;
        num_elements++;
        write_event.notify();
    }

    void reset()
    {
        num_elements = 0;
    }

    int num_available()
    {
        return num_elements;
    }
};

3、producer模块
producer模块定义了一个具有写接口的port。
SC_MODULE(producer)
{
public:
    sc_port<write_if> out;
    
    SC_CTOR(producer)
    {
        SC_THREAD(run);
    }
    void run()
    {
        const char *str = "hello,world.\n";
        while(*str)
            out->write(*str++);
    }
};

4、consumer模块
consumer模块定义了一个具有读接口的port。
SC_MODULE(producer)
{
public:
    sc_port<read_if> in;
    
    SC_CTOR(consumer)
    {
        SC_THREAD(run);
    }
    void run()
    {
        char c;
        cout << endl << endl;
        while(true)
        {
            in->read(c);
            cout << c << flush;
        }
    }
};

5、Test模块
Test模块中定义了producer、consumer和fifo三个实例
SC_MODULE(test)
{
public:
    fifo *f;
    producer *p;
    consumer *c;

    SC_CTOR(test)
    {
        f = new fifo("fifo1");
        p = new producer("producer1");
        c = new consumer("consumer1");

        p->out(*f);
        c->in(*f);
    }
};

6、sc_main
int sc_main(int argc,char *argv[])
{
    test t("top");
    sc_start(-1);
    return 0;
}

7、仿真测试结果

0

阅读 收藏 喜欢 打印举报/Report
前一篇:历史性的一刻
后一篇:两只小鸭
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有