#ifndef XRAM_TRANSACTION_H_ #define XRAM_TRANSACTION_H_ #include #include #include #include "arithmetics.h" #define DEBUG_XRAM_TRANSACTION 0 //////////////////////////////////////////////////////////////////////// // A transaction tab entry //////////////////////////////////////////////////////////////////////// class TransactionTabEntry { typedef sc_dt::sc_uint<64> wide_data_t; typedef sc_dt::sc_uint<40> addr_t; typedef uint32_t data_t; typedef uint32_t be_t; public: bool valid; // entry valid bool xram_read; // read request to XRAM addr_t nline; // index (zy) of the requested line size_t srcid; // processor requesting the transaction size_t trdid; // processor requesting the transaction size_t pktid; // processor requesting the transaction bool proc_read; // read request from processor size_t read_length; // length of the read (for the response) size_t word_index; // index of the first read word (for the response) std::vector wdata; // write buffer (one cache line) std::vector wdata_be; // be for each data in the write buffer bool rerror; // error returned by xram data_t ll_key; // LL key returned by the llsc_global_table bool config; // transaction required by CONFIG FSM ///////////////////////////////////////////////////////////////////// // The init() function initializes the entry ///////////////////////////////////////////////////////////////////// void init() { valid = false; rerror = false; config = false; } ///////////////////////////////////////////////////////////////////// // The alloc() function initializes the vectors of an entry // Its arguments are : // - n_words : number of words per line in the cache ///////////////////////////////////////////////////////////////////// void alloc(size_t n_words) { wdata_be.reserve( (int)n_words ); wdata.reserve( (int)n_words ); for(size_t i=0; i &be, const std::vector &data) { assert( (index < size_tab) and "MEMC ERROR: The selected entry is out of range in TRT write_data_mask()"); assert( (be.size()==tab[index].wdata_be.size()) and "MEMC ERROR: Bad be size in TRT write_data_mask()"); assert( (data.size()==tab[index].wdata.size()) and "MEMC ERROR: Bad data size in TRT write_data_mask()"); for(size_t i=0; i &data_be, const std::vector &data, const data_t ll_key = 0, const bool config = false) { assert( (index < size_tab) and "MEMC ERROR: The selected entry is out of range in TRT set()"); assert( (data_be.size()==tab[index].wdata_be.size()) and "MEMC ERROR: Bad data_be argument in TRT set()"); assert( (data.size()==tab[index].wdata.size()) and "MEMC ERROR: Bad data argument in TRT set()"); tab[index].valid = true; tab[index].xram_read = xram_read; tab[index].nline = nline; tab[index].srcid = srcid; tab[index].trdid = trdid; tab[index].pktid = pktid; tab[index].proc_read = proc_read; tab[index].read_length = read_length; tab[index].word_index = word_index; tab[index].ll_key = ll_key; tab[index].config = config; for(size_t i=0; i>32); mask = be_to_mask(tab[index].wdata_be[word+1]); tab[index].wdata[word+1] = (tab[index].wdata[word+1] & mask) | (value & ~mask); } ///////////////////////////////////////////////////////////////////// // The erase() function erases an entry in the transaction tab. // Arguments : // - index : the index of the request in the transaction tab ///////////////////////////////////////////////////////////////////// void erase(const size_t index) { assert( (index < size_tab) and "MEMC ERROR: The selected entry is out of range in TRT erase()"); tab[index].valid = false; tab[index].rerror = false; } ///////////////////////////////////////////////////////////////////// // The is_config() function returns the config flag value. // Arguments : // - index : the index of the entry in the transaction tab ///////////////////////////////////////////////////////////////////// bool is_config(const size_t index) { assert( (index < size_tab) and "MEMC ERROR: The selected entry is out of range in TRT is_config()"); return tab[index].config; } }; // end class TransactionTab #endif // Local Variables: // tab-width: 4 // c-basic-offset: 4 // c-file-offsets:((innamespace . 0)(inline-open . 0)) // indent-tabs-mode: nil // End: // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4