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

Subversion Repositories sardmips

[/] [sardmips/] [trunk/] [source/] [cpu/] [ex_stage.h] - Rev 17

Go to most recent revision | Compare with Previous | Blame | View Log

// EX_STAGE
#ifndef _EX_STAGE_H
#define _EX_STAGE_H
 
  #include <systemc.h>
 
  #include "./ex_stage/reg_ex.h"
  #include "./ex_stage/alu.h"
  #include "./ex_stage/backwrite.h" 
  #include "./ex_stage/multiply.h"
  #include "./ex_stage/mux_lo.h"
  #include "./ex_stage/mux_hi.h"
  #include "./ex_stage/mux_rd.h"
  #include "./ex_stage/execute_ctrl.h"
  #include "../constants/config.h"
 
#ifdef _MULT_PIPELINE_
  #include "./ex_stage/fsm.h"
#endif
 
SC_MODULE(ex_stage) 
{
	sc_in<bool> in_clk;
	sc_in<bool> reset;
 
	sc_in<bool> insthold;
	sc_in<bool> datahold;
 
	// signals from id_stage
	sc_in<sc_lv<32> > id_ex_alu1;
	sc_in<sc_lv<32> > id_ex_alu2;
	sc_in<sc_lv<32> > id_ex_datastore;
	sc_in<sc_lv<6> >  id_ex_alu_ctrl;
	sc_in<sc_lv<6> >  id_ex_alu_opcode;
	sc_in<sc_lv<6> >  id_ex_alu_function;
	sc_in<sc_logic>   id_ex_equal;
	sc_in<sc_lv<2> >  id_ex_byteselect;
	sc_in<sc_logic>   id_ex_bssign;
	sc_in<sc_lv<5> >  id_ex_alu_sa;
 
	// signals to be sent on to mem_stage
	sc_in<sc_logic> id_ex_datareq;
	sc_in<sc_logic> id_ex_datarw;
	sc_in<sc_logic> id_ex_memtoreg;
 
	// signal to control save in register
	sc_in<sc_lv<5> > id_ex_writeregister_out;
	sc_in<sc_logic> id_ex_regwrite_out;
 
	sc_out<sc_lv<5> > id_ex_m_writeregister;
	sc_out<sc_logic> id_ex_m_regwrite;
 
	sc_out<sc_logic> id_ex_m_datareq;
	sc_out<sc_logic> id_ex_m_datarw;
	sc_out<sc_lv<32> > id_ex_m_datastore;
	sc_out<sc_lv<32> > ex_m_alu;
 
	sc_out<sc_logic> id_ex_m_memtoreg;
 
	sc_out<sc_lv<32> > ex_id_forward;
 
	// Signals directly to mem stage
	sc_out<sc_lv<2> > id_ex_m_byteselect;
	sc_out<sc_logic>  id_ex_m_bssign;
 
	sc_signal<sc_logic> 	ovf_excep;
 
		sc_in<sc_lv<32> > 	id_ex_inst;  // instruction coming from ID_STAGE
		sc_out<sc_lv<32> > 	ex_mem_inst;  // instruction to MEM_STAGE
 
	sc_in<sc_logic> 	id_ex_IBUS;
	sc_in<sc_logic>		id_ex_inst_addrl;
	sc_in<sc_logic> 	id_ex_syscall_exception;
	sc_in<sc_logic>		id_ex_illegal_instruction;
	sc_out<sc_logic>	ex_m_IBUS;
	sc_out<sc_logic>	ex_m_inst_addrl;
	sc_out<sc_logic>	ex_m_syscall_exception;
	sc_out<sc_logic>	ex_m_illegal_instruction;
	sc_out<sc_logic>	ex_m_ovf_excep;
 
	sc_out<sc_logic>	ex_exception;
	sc_in<sc_logic>		enable_execute;
 
	sc_in<sc_uint<32> >	id_ex_instaddr;
	sc_out<sc_uint<32> >	ex_m_instaddr;
 
	// Signals from cp0
	// To prevent memory access in case of Address Error Exception
	sc_in<sc_logic> addr_err;
 
	sc_signal<sc_lv<32> > ex_alu_s;
	sc_signal<sc_lv<32> > ex_id_forward_s;
	sc_signal<sc_lv<32> > in_ex_alu_s;
	sc_signal<sc_lv<32> > in_ex_id_forward_s;
 
	// special registers
	sc_signal<sc_lv<32> > hi;
	sc_signal<sc_lv<32> > lo;
	sc_signal<sc_lv<32> > in_lo;
	sc_signal<sc_lv<32> > in_hi;
	sc_signal<sc_lv<32> > out_lo;
	sc_signal<sc_lv<32> > out_hi;
 
 
	// Output from pipelined Multiplier
	//********************************
#ifdef _MULT_PIPELINE_
	sc_out<bool>		hold_pipe;
	sc_signal<bool>		ready;
#endif
	//*********************************
 
 
	sc_signal<sc_logic> carry;
 
	reg_ex *reg_ex1;
	alu *alu1;
	backwrite *backwrite1;
	multiply *multiply1;
	mux_lo *mux_lo1;
	mux_hi *mux_hi1;
	mux_rd *mux_rd1;
	execute_ctrl *execute_ctrl1;
#ifdef _MULT_PIPELINE_
	fsm *fsm1;
#endif
	SC_CTOR(ex_stage)
	{
		reg_ex1 = new reg_ex("reg_ex");
		reg_ex1->in_clk(in_clk);
		reg_ex1->reset(reset);
		reg_ex1->insthold(insthold);
		reg_ex1->datahold(datahold);
		reg_ex1->addr_err(addr_err);
		reg_ex1->ex_alu_s(ex_alu_s);
		reg_ex1->ex_m_alu(ex_m_alu);
		reg_ex1->id_ex_datastore(id_ex_datastore);
		reg_ex1->id_ex_m_datastore(id_ex_m_datastore);
		reg_ex1->id_ex_datareq(id_ex_datareq);
		reg_ex1->id_ex_m_datareq(id_ex_m_datareq);
		reg_ex1->id_ex_datarw(id_ex_datarw);
		reg_ex1->id_ex_m_datarw(id_ex_m_datarw);
		reg_ex1->id_ex_memtoreg(id_ex_memtoreg);
		reg_ex1->id_ex_m_memtoreg(id_ex_m_memtoreg);
		reg_ex1->id_ex_writeregister_out(id_ex_writeregister_out);
		reg_ex1->id_ex_m_writeregister(id_ex_m_writeregister);
		reg_ex1->id_ex_regwrite_out(id_ex_regwrite_out);
		reg_ex1->id_ex_m_regwrite(id_ex_m_regwrite);
		reg_ex1->id_ex_byteselect(id_ex_byteselect);
		reg_ex1->id_ex_m_byteselect(id_ex_m_byteselect);
		reg_ex1->id_ex_bssign(id_ex_bssign);
		reg_ex1->id_ex_m_bssign(id_ex_m_bssign);
		reg_ex1->in_lo(in_lo);
		reg_ex1->out_lo(out_lo);
		reg_ex1->in_hi(in_hi);
		reg_ex1->out_hi(out_hi);
		//**************************************************************
		reg_ex1->id_ex_IBUS(id_ex_IBUS);
		reg_ex1->id_ex_inst_addrl(id_ex_inst_addrl);
		reg_ex1->id_ex_syscall_exception(id_ex_syscall_exception);
		reg_ex1->id_ex_illegal_instruction(id_ex_illegal_instruction);
		reg_ex1->ovf_excep(ovf_excep);
		reg_ex1->ex_m_IBUS(ex_m_IBUS);
		reg_ex1->ex_m_inst_addrl(ex_m_inst_addrl);
		reg_ex1->ex_m_syscall_exception(ex_m_syscall_exception);
		reg_ex1->ex_m_illegal_instruction(ex_m_illegal_instruction);
		reg_ex1->ex_m_ovf_excep(ex_m_ovf_excep);
		reg_ex1->id_ex_instaddr(id_ex_instaddr);
		reg_ex1->ex_m_instaddr(ex_m_instaddr);
			// instruction  from ID_STAGE to EX_STAGE
			//******************************************************
			reg_ex1->id_ex_inst(id_ex_inst);
			reg_ex1->ex_mem_inst(ex_mem_inst);
			//******************************************************
		//**************************************************************
		reg_ex1->enable_execute(enable_execute);
 
		execute_ctrl1 = new execute_ctrl("execute_ctrl");
		execute_ctrl1->id_ex_IBUS(id_ex_IBUS);
		execute_ctrl1->id_ex_inst_addrl(id_ex_inst_addrl);
		execute_ctrl1->id_ex_syscall_exception(id_ex_syscall_exception);
		execute_ctrl1->id_ex_illegal_instruction(id_ex_illegal_instruction);
		execute_ctrl1->ovf_excep(ovf_excep);
		execute_ctrl1->ex_exception(ex_exception);
 
		alu1 = new alu("alu");
		alu1->id_ex_alu1(id_ex_alu1);
		alu1->id_ex_alu2(id_ex_alu2);
		alu1->id_ex_alu_ctrl(id_ex_alu_ctrl);
		alu1->id_ex_equal(id_ex_equal);
		alu1->id_ex_alu_sa(id_ex_alu_sa);
		alu1->ovf_excep(ovf_excep);
		alu1->carry(carry);
		alu1->ex_alu_s(in_ex_alu_s);
		alu1->ex_id_forward_s(in_ex_id_forward_s);
 
		backwrite1 = new backwrite("backwrite");
		backwrite1->ex_id_forward_s(ex_id_forward_s);
		backwrite1->ex_id_forward(ex_id_forward);
 
 
		multiply1 = new multiply("multiply"); 
		multiply1->in_clk(in_clk);
		multiply1->reset(reset);
	#ifdef _MULT_PIPELINE_
		multiply1->ready(ready);
	#endif
		multiply1->id_ex_alu1(id_ex_alu1);
		multiply1->id_ex_alu2(id_ex_alu2);
		multiply1->id_ex_alu_function(id_ex_alu_function);
		multiply1->id_ex_alu_opcode(id_ex_alu_opcode);
		multiply1->hi(hi);
		multiply1->lo(lo);
 
#ifdef _MULT_PIPELINE_
		fsm1 = new fsm("fsm");
		fsm1->hold_pipe(hold_pipe);
		fsm1->ready(ready);
		fsm1->in_clk(in_clk);
		fsm1->reset(reset);
		fsm1->id_ex_alu_function(id_ex_alu_function);
		fsm1->id_ex_alu_opcode(id_ex_alu_opcode);
#endif	
		mux_lo1 = new mux_lo("mux_lo");
		mux_lo1->lo(lo);
		mux_lo1->rs(id_ex_alu1);
		mux_lo1->id_ex_alu_ctrl(id_ex_alu_ctrl);
		mux_lo1->out(in_lo);
 
		mux_hi1 = new mux_hi("mux_hi");
		mux_hi1->hi(hi);
		mux_hi1->rs(id_ex_alu1);
		mux_hi1->id_ex_alu_ctrl(id_ex_alu_ctrl);
		mux_hi1->out(in_hi);
 
		mux_rd1 = new mux_rd("mux_rd");
		mux_rd1->in_ex_id_forward_s(in_ex_id_forward_s);	// dalla ALU
		mux_rd1->in_ex_alu_s(in_ex_alu_s);      		// dalla ALU
		mux_rd1->out_lo(out_lo);            			// dai registri LO
		mux_rd1->out_hi(out_hi);            			// dai registri HI 
		mux_rd1->id_ex_alu_ctrl(id_ex_alu_ctrl);		// selettore del MUX
		mux_rd1->out_ex_id_forward_s(ex_id_forward_s);		// USCITE verso i registri di pipeline
		mux_rd1->out_ex_alu_s(ex_alu_s);
	}
};
 
#endif
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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