📄 cache_fetch.cpp
字号:
/* * TU Eindhoven * Eindhoven, The Netherlands * * Name : cache_fetch.cpp * * Author : A.S.Slusarczyk@tue.nl * * Date : * * Function : Cache fetch/store unit * * */#include "cache_fetch.h"void CACHE_FETCH::update_state(){ //busy = (next_state != IDLE); current_state = next_state; storing = n_storing;}void CACHE_FETCH::word_latch(){ if( word_clr.read() ) { word = 0; word_out = 0; } else if( word_inc.read() ) { word_out = word.read(); word = word.read()+1; }}void CACHE_FETCH::store_latch(){ if( storew.read() || storeb.read() || fetch.read() ){ din_reg.write( din.read() ); addr_reg.write( addr.read() ); }}void CACHE_FETCH::logic(){ sc_bv<28> ma; sc_bv<2> off; sc_bv<2> byte; bool store_byte, store_word; store_byte = storeb.read(); store_word = storew.read(); if( current_state == IDLE ){ ma = addr.read().range(31,4); off = addr.read().range(3,2); byte = addr.read().range(1,0); mem_din.write( din.read() ); } else{ ma = addr_reg.read().range(31,4); off = addr_reg.read().range(3,2); byte = addr_reg.read().range(1,0); mem_din.write( din_reg.read() ); } if( store_word ) byte = 0; // storing word - ignore byte number else if( !store_byte ) { byte=0; off = word; } // fetching word - replace word offset mem_addr.write( (ma,off,byte) ); dout.write(mem_dout.read()); word_rdy.write(false); mem_ww.write(false); mem_wb.write(false); mem_r.write(false); busy.write(false); word_inc=false; word_clr=true; next_state = current_state.read(); n_storing = 0; switch( current_state.read() ) { case IDLE : if( fetch.read() ){ next_state = WAIT_MEM; mem_r.write(true); word_clr = false; word_inc = true; busy.write(true); } else if( storing.read()!=0 && !mem_rdy.read() ){ mem_ww.write( storing.read()[0]==true ); mem_wb.write( storing.read()[1]==true ); next_state = IDLE; n_storing = storing.read(); busy.write(true); } else if( storew.read() || storeb.read() ){ next_state = IDLE; mem_ww.write( storew.read() ); mem_wb.write( storeb.read() ); sc_bv<2> s; s[0] = storew.read(); s[1] = storeb.read(); n_storing = s; } else { next_state = IDLE; } break; case WAIT_MEM : word_clr = false; busy.write(true); n_storing = storing.read(); if( mem_rdy.read() ){ if( storing.read()==0 ) word_rdy.write(true); if( storing.read() != 0 || word.read() == 0 ){ mem_ww.write( false ); mem_wb.write( false ); mem_r.write( false ); n_storing = 0; next_state = IDLE; word_clr = true; busy.write(false);// if( storing.read()!=0 ){ // mem_ww.write( false );// mem_wb.write( false );// mem_r.write( false );// n_storing = 0;// next_state = IDLE;// busy.write(false);// }// else {// next_state = LAST_WORD;// } } else { mem_r.write( storing.read()==0 ); mem_ww.write( storing.read()[0]==true ); mem_wb.write( storing.read()[1]==true ); word_inc = true; } } else { next_state = WAIT_MEM; } break; case LAST_WORD : word_rdy.write(true); busy.write(true); n_storing = 0; next_state = IDLE; break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -