OpenCores
URL https://opencores.org/ocsvn/sardmips/sardmips/trunk

Subversion Repositories sardmips

[/] [sardmips/] [trunk/] [source/] [cpu/] [sc_cpu.h] - Rev 18

Compare with Previous | Blame | View Log

//
// $Id: sc_cpu.h,v 1.1 2006-01-25 17:00:01 igorloi Exp $
//
 
#ifndef _SC_CPU_H
#define _SC_CPU_H
 
#include <systemc.h>
#include "../constants/config.h"
#include "../constants/constants.h"
#include "pc_stage.h"
#include "if_stage.h"
#include "id_stage.h"
#include "ex_stage.h"
#include "mem_stage.h"
#include "enable_stage.h"
#include "writeback_ctrl.h"
#include "mux_instaddr.h"
 
#ifdef _MULT_PIPELINE_
#include "or_gate.h"
#endif
 
SC_MODULE(sc_cpu) 
{
// to CP0_STAGE
  sc_in<sc_lv<32> >	new_pc;
  sc_in<sc_logic> 	load_epc;
  sc_out<sc_lv<32> >	pc_in;
  sc_out<sc_lv<32> >	pc_out;
  sc_out<sc_logic> 	id_branch;
  sc_out<sc_logic> 	id_ctrl;
  sc_out<sc_logic>	id_ex_datarw;
  sc_out<sc_logic>	id_ex_datareq;
  sc_in<sc_logic>	addr_err;
  sc_in<bool>		insthold;
  sc_out<sc_lv<4> >	cp0_inst;
  sc_out<sc_lv<32> >	reg_rs;
  sc_in<sc_lv<32> >	reg_out;
  sc_out<sc_uint<5> >	reg_no;
  sc_out<sc_logic>	reg_rw;
  sc_out<sc_lv<32> >	ex_id_forward;
 
 
  // EXCEPTION SIGNAL FROM DATAMEM AND INSTMEM
  //*****************************************************************************************************
  sc_in<sc_logic>	inst_addrl;		// disaligned address in instmem during fetch stage
  sc_in<sc_logic>	IBUS;			//page fault in instmem
  sc_in<sc_logic>	data_addrl;		//disaligned address in datamem during  load instruction
  sc_in<sc_logic>	data_addrs;		//disaligned address in datamem during store instruction
  sc_in<sc_logic>	DBUS;			//page fault in instmem
  //*****************************************************************************************************
 
  // EXCEPTION SIGNALS TO ENABLE/DISABLE PIPELINED STAGE
  //*****************************************************************************************************
  sc_signal<sc_logic>	enable_pc;
  sc_signal<sc_logic>	enable_fetch;
  sc_signal<sc_logic>	enable_decode;
  sc_signal<sc_logic>	enable_execute;
  sc_signal<sc_logic>	enable_memstage;
  sc_signal<sc_logic>	if_exception;
  sc_signal<sc_logic>	id_exception;
  sc_signal<sc_logic>	ex_exception;
  sc_signal<sc_logic>	mem_exception;
  sc_signal<sc_logic>	wb_exception;
  sc_signal<sc_logic>	interrupt_exception;
  //*****************************************************************************************************
 
  // INTERRUPT SIGNALS
  //**********************************************
  sc_in<bool>	interrupt_signal;
  sc_out<bool>	m_wb_interrupt_signal;
  sc_in<sc_logic>	enable_interrupt;
  sc_in<sc_logic>	enable_kernel_mode;
  //**********************************************
 
 
  // PIPELINED EXCEPTION SIGNALS
  //*****************************************************************************************************
  	sc_signal<sc_lv<32> > 	id_ex_inst;		// from id_stage  to ex_stage
  	sc_signal<sc_lv<32> > 	ex_mem_inst;		// from ex_stage  to mem_stage
  	sc_signal<sc_lv<32> > 	mem_wb_inst;		// from mem_stage to WriteBack
  sc_signal<sc_logic> 	if_id_inst_addrl;		// from if_stage  to id_stage
  sc_signal<sc_logic> 	if_id_IBUS;			// from if_stage  to id_stage
  sc_signal<sc_logic> 	id_ex_inst_addrl;		// from id_stage  to ex_stage
  sc_signal<sc_logic> 	id_ex_IBUS;			// from id_stage  to ex_stage
  sc_signal<sc_logic> 	id_ex_syscall_exception;	// from id_stage  to ex_stage
  sc_signal<sc_logic> 	id_ex_illegal_instruction;	// from id_stage  to ex_stage
  sc_signal<sc_logic> 	ex_m_ovf_excep;			// from ex_stage  to mem_stage
  sc_signal<sc_logic> 	ex_m_inst_addrl;		// from ex_stage  to mem_stage
  sc_signal<sc_logic> 	ex_m_IBUS;			// from ex_stage  to mem_stage
  sc_signal<sc_logic> 	ex_m_syscall_exception;		// from ex_stage  to mem_stage
  sc_signal<sc_logic> 	ex_m_illegal_instruction;	// from ex_stage  to mem_stage
  sc_out<sc_logic> 	m_wb_DBUS;			// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_data_addrl;		// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_data_addrs;		// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_ovf_excep;			// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_syscall_exception;		// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_illegal_instruction;	// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_IBUS;			// from mem_stage to cp0_cause
  sc_out<sc_logic> 	m_wb_inst_addrl;		// from mem_stage to cp0_cause
 
  sc_signal<sc_uint<32> >	if_id_instaddr;		// from if_stage  to id_stage  (victim address instruction)
  sc_signal<sc_uint<32> >	id_ex_instaddr;		// from id_stage  to ex_stage  (victim address instruction)
  sc_signal<sc_uint<32> >	ex_m_instaddr;		// from ex_stage  to mem_stage address for INTERRUPT EPC
  sc_signal<sc_uint<32> >	m_wb_instaddr;		// from mem_stage to mux_instaddr (victim address instruction)
  sc_out<sc_uint<32> >		m_wb_instaddr_s;	// from mux_instaddr to EPC
  sc_out<sc_uint<32> >		m_wb_dataaddr;		// from mem_stage to cpo_cause (victim address instruction)
  //*****************************************************************************************************
 
 
 
  //
  // Very basic signals for the CPU!
  //
  //! Main clock signal
  sc_in<bool> in_clk;
  //! Main reset signal
  sc_in<bool> reset;
 
  //
  // Instruction memory interface
  //
  //! Instruction memory input data
  // sc_inout_rv<32> instdata;
  sc_in<sc_lv<32> > instdataread;
  sc_out<sc_lv<32> > instdatawrite;
  //! Instruction memory address
  sc_out<sc_uint<32> > instaddr;
  //! Instruction memory request
  sc_out<sc_logic> instreq;
  //! Instruction memory read/write signal. 1 for write. 0 for read.
  sc_out<sc_logic> instrw;
  //! Hold signal from cp0 (Was: instruction memory)
 
 
  //sc_in<bool> x_insthold;  //in sc_risc!
 
  //
  // Data memory interface
  //
  //! Data memory in/out data
  // sc_inout_rv<32> data;
  sc_in<sc_lv<32> > dataread;
  sc_out<sc_lv<32> > datawrite;
  //! Data memory address
  sc_out<sc_uint<32> > dataaddr;
  //! Data memory request
  sc_out<sc_logic> datareq;
  //! Data memory read/write signal. 1 for write. 0 for read.
  sc_out<sc_logic> datarw;
  //! Byte select signal. Select bytes to be written. 01 for byte, 10 for halfword
  sc_out<sc_lv<2> > databs;
  //! Hold signal from data memory
  sc_in<bool> datahold;
 
 
  // Misc. signals
  sc_signal<sc_lv<32> > id_new_pc;
  sc_signal<sc_lv<32> > id_jmp_tar;
  sc_signal<sc_lv<32> > if_id_inst;
  sc_signal<sc_lv<32> > if_id_next_pc;
 
  // signal from id_stage to ex_stage
  sc_signal<sc_lv<32> > id_ex_alu1;
  sc_signal<sc_lv<32> > id_ex_alu2;
  sc_signal<sc_lv<32> > id_ex_datastore;
  sc_signal<sc_lv<6> >  id_ex_alu_ctrl;
  sc_signal<sc_lv<6> >	id_ex_alu_opcode;
  sc_signal<sc_lv<6> >	id_ex_alu_function;
  sc_signal<sc_logic>   id_ex_equal;
  sc_signal<sc_lv<2> >  id_ex_byteselect;
  sc_signal<sc_logic>   id_ex_bssign;
  sc_signal<sc_lv<5> >  id_ex_alu_sa;
 
  // signal to mem_stage through ex_stage
  sc_signal<sc_logic>  id_ex_memtoreg;
  sc_signal<sc_lv<2> > id_ex_m_byteselect;
  sc_signal<sc_logic>  id_ex_m_bssign; 
 
  // signal to mem_stage
  sc_signal<sc_logic>   id_ex_m_datareq;
  sc_signal<sc_logic>   id_ex_m_datarw;
  sc_signal<sc_lv<32> > id_ex_m_datastore;
  sc_signal<sc_lv<32> > ex_m_alu;
  sc_signal<sc_logic>   id_ex_m_memtoreg;
  sc_signal<sc_logic>   m_ocp_cmd;
 
  // signal to control save in register
  sc_signal<sc_lv<5> > id_ex_writeregister_out;
  sc_signal<sc_logic>  id_ex_regwrite_out;
 
  // forwarding control signal
  sc_signal<sc_lv<5> >  id_ex_m_writeregister;
  sc_signal<sc_lv<5> >  id_ex_m_wb_writeregister;
  sc_signal<sc_logic>   id_ex_m_regwrite;
  sc_signal<sc_logic>   id_ex_m_wb_regwrite;
  //sc_signal<sc_lv<32> > ex_id_forward;
  sc_signal<sc_lv<32> > m_id_forward;
  sc_signal<sc_lv<32> > wb_id_forward;
 
 
  // signals between ID stage and cp0
 
  sc_signal<sc_logic>   inst_break;
  sc_signal<sc_logic>   inst_syscall;
 
#ifdef _MULT_PIPELINE_
  sc_signal<bool> 	hold_pipe;
  sc_signal<bool> 	insthold_W;
#endif
 
  pc_stage *pc;
  if_stage *if_s;
  id_stage *id;
  ex_stage *ex;
  mem_stage *mem;
  enable_stage *enable_stage1;
  writeback_ctrl *writeback_ctrl1;
  mux_instaddr *mux_instaddr1;
#ifdef _MULT_PIPELINE_
  or_gate *og1;
#endif  
 
  void clocktik()
    {
    };
 
  SC_HAS_PROCESS(sc_cpu);
  sc_cpu(const sc_module_name& name_);
 
};
 
#endif
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.