SystemC自带example的cpu之Data Cache研习

        例子中并没有数据缓冲的体现,和指令缓冲一样,仅仅就是RAM的读写设计。上来先是对RAM内容进行初始化,然后就是根据输入的使能信号和读写地址,直接进行相应的操作了。

struct dcache : sc_module { 
    sc_in<signed> 		datain; 	// input data
    sc_in<unsigned>  	statein; 	// input state bit MESI(=3210)
    sc_in<bool>  		cs;    		// chip select
    sc_in<bool>  		we;    		// write enable 
    sc_in<unsigned >  	addr;  		// address
    sc_in<unsigned>  	dest;    	// write back to which register

    sc_out<unsigned>  	destout;    // write back to which register
    sc_out<signed>  	dataout;  	// dataram data out
    sc_out<bool>  		out_valid;  // output valid
    sc_out<unsigned>  	stateout;  	// state output
    sc_in_clk 		CLK;

    // Parameter
    unsigned *dmemory;	 				// data memory
    unsigned *dsmemory;	 				// data state memory
    unsigned *dtagmemory;	 		    // tag memory
    int wait_cycles; 					// cycles # it takes to access dmemory

    void init_param(int given_delay_cycles) {
        wait_cycles = given_delay_cycles; 
    }
 
    //Constructor 
    SC_CTOR(dcache) {
        SC_CTHREAD(entry, CLK.pos());
        
        // initialize instruction dmemory from external file
        FILE *fp = fopen("dcache.img","r");
        int size=0;
        int i=0;
        unsigned mem_word;
        dmemory = new unsigned[4000];
        dsmemory = new unsigned[4000];
        dtagmemory = new unsigned[4000];
        printf("** ALERT ** DCU: initialize Data Cache\n");
        while (fscanf(fp,"%x", &mem_word) != EOF) {
            dmemory[size] = mem_word;
            dsmemory[size] = 0;
            dtagmemory[size] = size;
            size++;
        }
        
        for (i=size; i<4000; i++) {
            dtagmemory[i] = 0xdeadbeef;
            dmemory[i] = 0xdeadbeef;
            dsmemory[i] = 0;
        }
    }

    // Process functionality in member function below
    void entry();
};

void dcache::entry()
{
    unsigned int	address;			// address to DataCache
    unsigned int  dest_tmp = 0;
    
    while (true) {
        do { wait(); } 
        while ( !(cs == true) ); 
        dest_tmp = dest.read();
        address = addr.read();
        if (we.read() == true) { 		// Write operation
            wait();
            out_valid.write(false);
            dmemory[address] = datain.read();
            dsmemory[address] = statein.read();
            dtagmemory[address] = addr.read();
            wait();
        }
        else { 					// Read operation
            wait(); 	
            dataout.write(dmemory[address]);
            stateout.write(dsmemory[address]);
            destout.write(dest_tmp);
            out_valid.write(true);

            if (dsmemory[address] == 3) {
                printf(" (M)");
            } else if (dsmemory[address] == 2) {
                printf(" (E)");
            } else  if (dsmemory[address] == 1) {
                printf(" (S)");
            } else if (dsmemory[address] == 0) {
                printf(" (I)");
            } else 
                printf(" (X)");

            wait();
            out_valid.write(false);
            wait();
        }    
    }
} // end of entry function

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clyfk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值