Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / api / pli / src / SS_ValSync.h
/*
* ========== Copyright Header Begin ==========================================
*
* OpenSPARC T2 Processor File: SS_ValSync.h
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
*
* The above named program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License version 2 as published by the Free Software Foundation.
*
* The above named program is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*
* ========== Copyright Header End ============================================
*/
#ifndef __SS_ValSync_h__
#define __SS_ValSync_h__
#include <stdio.h>
#include <assert.h>
#include <map>
#include <list>
#include "SS_Types.h"
#include "SS_Strand.h"
class SS_ValSync
{
public:
SS_ValSync( SS_Strand* _strand );
void ctr_read( SS_Registers::Index idx, uint64_t data );
void ctr_write( SS_Registers::Index idx, uint64_t data );
void asi_read( uint8_t asi, SS_Vaddr va, uint64_t data );
void asi_write( uint8_t asi, SS_Vaddr va, uint64_t data );
void csr_read( SS_Paddr pa, uint64_t data, bool little_endian );
void csr_write( SS_Paddr pa, uint64_t data, bool little_endian );
void set_multi_entry( uint8_t asi ) { multi_entry[asi] = true; }
protected:
SS_Strand* strand;
std::map<SS_Registers::Index,uint64_t> ctr_rd;
// ASI_READ follow-me is a multi-entry FIFO queue, so that we can have
// a command sequence like: ASI_READ, ASI_READ, ldxa, ldxa. If we use
// single-entry queue, then the command sequence must be: ASI_READ, ldxa,
// ASI_READ, ldxa, which is harder for testbench to line up the commands
// properly. But not all ASI_READ follow-me's need the multi-entry
// functionality, most will be happy with just keeping one entry (the
// latest one) in the queue.
std::map<SS_Vaddr,std::list<uint64_t>*> asi_rd[SS_Asi::MAX];
std::map<SS_Paddr,uint64_t> csr_rd;
// set true means a particular asi can have multi-entry ASI FOLLOW-ME
bool multi_entry[SS_Asi::MAX];
};
#endif