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

Subversion Repositories sardmips

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

Compare with Previous | Blame | View Log

//! MEM Stage module
//
// $Id: mem_stage.h,v 1.1 2006-01-25 17:00:01 igorloi Exp $
//
#ifndef _MEM_STAGE_H
#define _MEM_STAGE_H
 
#include "systemc.h"
 
#include "./mem_stage/select_mem.h"
#include "./mem_stage/reg_mem.h"
#include "./mem_stage/multiplexer_mem.h"
#include "./mem_stage/memstage_ctrl.h"
#include "./mem_stage/mux_interrupt.h"
#include "./mem_stage/flag_interr.h"
 
SC_MODULE(mem_stage) 
{
	sc_in<bool> in_clk;
	sc_in<bool> reset;
 
	sc_in<bool> insthold;
	sc_in<bool> datahold;
 
	sc_in<sc_logic> id_ex_m_datareq;
	sc_in<sc_logic> id_ex_m_datarw;
	sc_in<sc_lv<32> > id_ex_m_datastore;
	sc_in<sc_lv<32> > ex_m_alu;
 
	// signal to mem_stage from ex_stage
	sc_in<sc_logic>  id_ex_m_memtoreg;
	sc_in<sc_lv<2> > id_ex_m_byteselect;
	sc_in<sc_logic>  id_ex_m_bssign; 
 
	// signal to data memory
	sc_in<sc_lv<32> > dataread;
	sc_out<sc_lv<32> > datawrite;
	sc_out<sc_uint<32> > dataaddr;
	sc_out<sc_logic> datareq;
	sc_out<sc_logic> datarw;
	sc_out<sc_lv<2> > databs;
 
	// signal to control save in register
	sc_in<sc_lv<5> > id_ex_m_writeregister;
	sc_in<sc_logic> id_ex_m_regwrite;
 
	sc_out<sc_lv<5> > id_ex_m_wb_writeregister;
	sc_out<sc_logic> id_ex_m_wb_regwrite;
 
	sc_out<sc_lv<32> > m_id_forward;
	sc_out<sc_lv<32> > wb_id_forward;
 
	sc_in<sc_logic>		enable_memstage;
	sc_out<sc_logic>	mem_exception;
 
	sc_signal<sc_lv<32> > id_store;
 
	// EXCEPTION SIGNALS
	sc_in<sc_logic>		ex_m_IBUS;
	sc_in<sc_logic>		ex_m_inst_addrl;
	sc_in<sc_logic>		ex_m_syscall_exception;
	sc_in<sc_logic>		ex_m_illegal_instruction;
	sc_in<sc_logic>		ex_m_ovf_excep;
	sc_in<sc_logic>		DBUS;
	sc_in<sc_logic>		data_addrl;
	sc_in<sc_logic>		data_addrs;
 
	// INTERRUPT SIGNAL
	sc_in<bool>		interrupt_signal;
	sc_out<bool>		m_wb_interrupt_signal;
	sc_in<sc_logic>		enable_interrupt;
	sc_signal<bool>		interrupt_signal_out;
	sc_signal<bool>		interrupt_out_out;
	sc_signal<bool>		ground;
 
	// exception status vector -> to  CPO-Cause
	sc_out<sc_logic>	m_wb_IBUS;
	sc_out<sc_logic>	m_wb_inst_addrl;
	sc_out<sc_logic>	m_wb_syscall_exception;
	sc_out<sc_logic>	m_wb_illegal_instruction;
	sc_out<sc_logic>	m_wb_ovf_excep;
	sc_out<sc_logic>	m_wb_DBUS;
	sc_out<sc_logic>	m_wb_data_addrl;
	sc_out<sc_logic>	m_wb_data_addrs;
 
		sc_in<sc_lv<32> > 	ex_mem_inst;  // instruction coming from EX_STAGE
		sc_out<sc_lv<32> > 	mem_wb_inst;  // instruction to WRITE_BACK Phases
 
	sc_in<sc_uint<32> >	ex_m_instaddr;
	sc_out<sc_uint<32> >	m_wb_instaddr;
 
	// sc_in<sc_uint<32> >  ex_m_dataaddr; il segnale �dataddr!
	sc_out<sc_uint<32> >	m_wb_dataaddr;
 
#ifdef _MULT_PIPELINE_
	sc_in<bool>		hold_pipe;
#endif
 
	select_mem *select_mem1;
	multiplexer_mem *multiplexer_mem1;
	reg_mem *reg_mem1;
	memstage_ctrl *memstage_ctrl1;
	mux_interrupt *mux_interrupt1;
	flag_interr *flag_interr1;
 
	SC_CTOR(mem_stage)
	{
		select_mem1 = new select_mem("select_mem");
		select_mem1->id_ex_m_datareq(id_ex_m_datareq);
		select_mem1->id_ex_m_datarw(id_ex_m_datarw);
		select_mem1->id_ex_m_byteselect(id_ex_m_byteselect);
		select_mem1->id_ex_m_datastore(id_ex_m_datastore);
		select_mem1->datawrite(datawrite);
		select_mem1->ex_m_alu(ex_m_alu);
		select_mem1->dataaddr(dataaddr);
		select_mem1->datareq(datareq);
		select_mem1->datarw(datarw);
		select_mem1->databs(databs);
		select_mem1->enable_memstage(enable_memstage);	
 
		multiplexer_mem1 = new multiplexer_mem("multiplexer_mem");
		multiplexer_mem1->id_ex_m_byteselect(id_ex_m_byteselect);
		multiplexer_mem1->id_ex_m_bssign(id_ex_m_bssign); 
		multiplexer_mem1->id_ex_m_memtoreg(id_ex_m_memtoreg);
		multiplexer_mem1->ex_m_alu(ex_m_alu);
		multiplexer_mem1->dataread(dataread);
		multiplexer_mem1->id_store(id_store);
		multiplexer_mem1->m_id_forward(m_id_forward);
 
		reg_mem1 = new reg_mem("reg_mem");
		reg_mem1->in_clk(in_clk);
		reg_mem1->reset(reset);
		reg_mem1->insthold(insthold);
		reg_mem1->datahold(datahold);
		reg_mem1->wb_id_forward(wb_id_forward);
		reg_mem1->id_ex_m_wb_writeregister(id_ex_m_wb_writeregister);
		reg_mem1->id_ex_m_wb_regwrite(id_ex_m_wb_regwrite);
		reg_mem1->id_store(id_store);
		reg_mem1->id_ex_m_writeregister(id_ex_m_writeregister);
		reg_mem1->id_ex_m_regwrite(id_ex_m_regwrite);
 
		reg_mem1->ex_m_IBUS(ex_m_IBUS);
		reg_mem1->ex_m_inst_addrl(ex_m_inst_addrl);
		reg_mem1->ex_m_syscall_exception(ex_m_syscall_exception);
		reg_mem1->ex_m_illegal_instruction(ex_m_illegal_instruction);
		reg_mem1->ex_m_ovf_excep(ex_m_ovf_excep);
		reg_mem1->DBUS(DBUS);
		reg_mem1->data_addrl(data_addrl);
		reg_mem1->data_addrs(data_addrs);
		reg_mem1->ex_m_instaddr(ex_m_instaddr);
  		reg_mem1->ex_m_dataaddr(dataaddr);
		reg_mem1->interrupt_signal(interrupt_out_out);
		reg_mem1->m_wb_interrupt_signal(m_wb_interrupt_signal);
 
		reg_mem1->m_wb_IBUS(m_wb_IBUS);
		reg_mem1->m_wb_inst_addrl(m_wb_inst_addrl);
		reg_mem1->m_wb_syscall_exception(m_wb_syscall_exception);
		reg_mem1->m_wb_illegal_instruction(m_wb_illegal_instruction);
		reg_mem1->m_wb_ovf_excep(m_wb_ovf_excep);
		reg_mem1->m_wb_DBUS(m_wb_DBUS);
		reg_mem1->m_wb_data_addrl(m_wb_data_addrl);
		reg_mem1->m_wb_data_addrs(m_wb_data_addrs);
		reg_mem1->m_wb_instaddr(m_wb_instaddr);
		reg_mem1->m_wb_dataaddr(m_wb_dataaddr);
			reg_mem1->ex_mem_inst(ex_mem_inst);
			reg_mem1->mem_wb_inst(mem_wb_inst);
		reg_mem1->enable_memstage(enable_memstage);
 
		memstage_ctrl1 = new memstage_ctrl("memstage_ctrl");
		memstage_ctrl1->ex_m_IBUS(ex_m_IBUS);
		memstage_ctrl1->ex_m_inst_addrl(ex_m_inst_addrl);
		memstage_ctrl1->ex_m_syscall_exception(ex_m_syscall_exception);
		memstage_ctrl1->ex_m_illegal_instruction(ex_m_illegal_instruction);
		memstage_ctrl1->ex_m_ovf_excep(ex_m_ovf_excep);
		memstage_ctrl1->DBUS(DBUS);
		memstage_ctrl1->data_addrl(data_addrl);
		memstage_ctrl1->data_addrs(data_addrs);
		memstage_ctrl1->mem_exception(mem_exception);
		memstage_ctrl1->interrupt_signal(interrupt_out_out);
 
		flag_interr1 = new flag_interr("flag_interr");
		flag_interr1->in_clk(in_clk);
		flag_interr1->reset(reset);
		flag_interr1->interrupt_in(interrupt_signal_out);
		flag_interr1->interrupt_out(interrupt_out_out);
 
		ground.write(false);
 
		mux_interrupt1 = new mux_interrupt("mux_interrupt");
		mux_interrupt1->IN_A(interrupt_signal);
		mux_interrupt1->IN_B(ground);
	#ifdef _MULT_PIPELINE_
		mux_interrupt1->hold_pipe(hold_pipe);
	#endif
		mux_interrupt1->SEL(enable_interrupt);
		mux_interrupt1->OUT(interrupt_signal_out);
	}
};
 
 
#endif
 

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.