HierarchyFilesModulesSignalsTasksFunctionsHelp
Prev12345678
		| (dopc_hidiv0_op & help_ctr[1]==1'b1)
		}
		;

//                d_opcode==HIFLUSH0
//              | d_opcode==HSTA0

/*
 * was part of bit 0
		  d_opcode==HSTDF0
		| d_opcode==HSTD0 | d_opcode==HSTDA0
		| d_opcode==HSTDFQ0
 */

/*
 * See after Mpipe_control instanciation for iu_help_w
// Generate a signal iu_help_w whiich says there is a help in W

	wire iu_help_w = w_hhn2;
 *
 */


// LOAD INTERLOCK LOGIC

	wire d_nod_st_op = 
		  d_hop3==`STB | d_hop3==`STBA
		| d_hop3==`STH | d_hop3==`STHA
		| d_hop3==`ST | d_hop3==`STA
		;

	wire d_all_ist_op =
		  d_nod_st_op
		| d_hop3==`STD | d_hop3==`STDA
		;

	// these ilock terms don't really need to include
	// the dependant store terms.  however, for timing
	// from the D$, ldalgn, to RF mux, to d$if mux to d$
	// is too long, so interlock.
	wire load_ilock = e_load & ~rd_ex_g0 & ~(d_opcode==`HLDA) &
			( 	  b1_eq_src1
				| b1_eq_src2 & ~d_imm
			   	| drd_eq_erd & d_all_ist_op
			)
			;
	
	wire ldd_ilock =
		e_hldd &
			(
			  b1_eq_src1
			| b1_eq_src2 & ~d_imm
			| drd_eq_erd & d_nod_st_op
			);

/*
 * Modify for SUNERGY
 *
	// Co-processor cc's invalid interlock
	// when FPU is present and enabled
	// a BFCC in decode
	// interlocks until the pfccv (pcccv) line becomes active
	// when FPU is present and enabled and FHOLD asserted
	// a FPOP or FPCMP in decode
	// interlocks until the FHOLD line becomes inactive. 

	// NOTE - FPU interface has changed so that FHOLD is
	// no longer qualified in the fpu.  we qualify it here
	// in the iu with valid_decode_fpu. -

	// NOTE 2 - we no longer have to qualify it with
	// valid_decode_fpu.
 *
 */

	assign fcc_ilock = 
		  d_hop2==`BFCC
		& ~pfccv & ef
		;


//	wire fhold_ilock;
//	assign fhold_ilock =
//		  FHOLD
//		& ef
//		;

/*
 * New FP interlock cases - in the event a ldf/lddf is followed
 * by a dependant stf/stdf, we interlock.  the interlock determination
 * is done across only the high 4 bits of the rd fields so
 * we may be a bit pessimisstic.  in addition, there is a dependancy
 * on ldfsr/stdfq followed by any FPops.  these dependancies are
 * set by the FPU.
 */

	wire d_stf = d_hop3==`STF | d_hop3==`STDF;
	wire d_fp_op_mem_cmp =
		  d_hop3 == `FPOP
		| d_hop3 == `FPCMP
		| d_hop3[8:4]==`MEMF
		;

	wire d_ldf = valid_decode & (d_hop3==`LDF | d_hop3==`LDDF);
	wire e_ldf;
	Mflipflop_1 e_ldf_reg_1(e_ldf,d_ldf,ss_clock,hold) ;

	wire d_ldfsr_stdfq = valid_decode & (
		  d_hop3==`LDFSR | d_hop3==`STDFQ);
	wire e_ldfsr_stdfq;
	Mflipflop_1 e_ldfsr_stdfq_reg_1(e_ldfsr_stdfq,d_ldfsr_stdfq,ss_clock,hold) ;

	wire fp_ldst_ilock =
		  e_ldf & dfrd_eq_efrd & d_stf
		| e_ldfsr_stdfq & d_fp_op_mem_cmp
		;

/*
 * New interlock case for SUNERGY.  On calls, if the delay slot
 * of the call uses r15 (%o7), interlock for one cycle.  This was
 * not necessary for Suntan since Suntan was able to use bypass 1
 * because of the Master/Slave architecture.  Puma is register
 * based so it cannot use bypass 1.
 */

	wire e_hopcall = e_hop==`CALL;
	wire call_use_ilock =
		  e_hopcall
		& ((d_rs1 == 5'd15) | (d_rs2 == 5'd15));

/*
 * Another new interlock case for SUNERGY.  Puma must interlock
 * on a branch followed by a jump. 
 * Note: RETT is preceeded by JMP so it does not have this ilock.
 */

//	wire d_jmp_ilock = d_hop3==JMP & valid_decode;
//	REGWIRE jmp_ilock;
//	REG(jmp_ilock_reg,1,jmp_ilock,d_jmp_ilock,ss_clock,hold)

/*
 * Another icky interlock case for SUNERGY.  If a read special
 * register instruction (eg: rd y, rd wim) destination register
 * is used as a source by the next instr, you cannot use
 * bypass 1.  You must use bypass 2, so interlock.
 */

	wire rd_spec_ilock =
		((e_rdpsr_op | e_rdwim_op
		| e_rdy_op_forilock | e_rdtbr_op)
		& (b1_eq_src1 | (b1_eq_src2 & ~d_imm)));


/*
 * The REAL new interlock case for IMUL/IDIV - this one causes
 * two interlocks to occur on EVERY imul and idiv.  This is
 * basically for the same reason as above: to "correct" the
 * src1 and src2 data.  Note that only 2 are required now, rather
 * than the above max of 3.  this is because bypass3 data comes
 * out on the same pins as the RF out.
 *
 */

	wire imul_idiv_ilock =
		  (dhop3_imulbasic_op | dhop3_idivbasic_op)
		& (~e_no_write | ~w_no_write | ~r_no_write)
		;

/*
 * new interlock case - added for the benefit of the MMU and cache.
 * if the MMU detects a i_acc_exc, we should disable fetching
 * and interlock until the bad instruction hits W.

	REGWIRE mm_iacc_exc_ilock1;
	REG(mm_iacc_exc_ilock_reg1,1,mm_iacc_exc_ilock1, 		iacc_exc_mmumiss_d, ss_clock,hold)

	wire nmm_iacc_exc_ilock2 = mm_iacc_exc_ilock1 & ~fold_annul;

	REGWIRE mm_iacc_exc_ilock2;
	REG(mm_iacc_exc_ilock_reg2,1,mm_iacc_exc_ilock2, 		nmm_iacc_exc_ilock2, ss_clock,hold)

	wire mm_iacc_exc_ilock = nmm_iacc_exc_ilock2 | mm_iacc_exc_ilock2;
 */

/*
 * ilock case for T+ - if an untaken branch is in E and the queue
 * is empty, interlock the pipe.  currently, the determination is
 * done in Mpc_cntl
	wire untaken_empty_ilock =
		Msystem.ssparc.iu.iuchip.pc_cntl.untaken_empty_ilock;
 */

/*
 * INTERLOCK!!!
 */
	wire d_help = d_hop3[8];
	// this term is to kill interlock if the targ of a folded
	// branch is not to be executed (ie: it was mispredicted).
	// kill interlock if inst is in D.
	wire kill_nohelp_d_il = ~d_help & mispredicted;

	wire lotsa_ilock =
		  fcc_ilock | fp_ldst_ilock
		| call_use_ilock
		| rd_spec_ilock | imul_idiv_ilock
		| sv_rest_fold_ilock
		;
// don't need this one anymore
//		| mm_iacc_exc_ilock

	assign interlock =
		~reset & ~d_trap & ~d_nop & ~iacc_exc_mmumiss_d &
		 (untaken_empty_ilock |
		   (~kill_nohelp_d_il &
			 (load_ilock | ldd_ilock |
			 	(~ANNUL & lotsa_ilock)
			 )
		   )
		 );
//			 | jmp_ilock

// this version of interlock is used only for valid_decode

	wire interlock_vald =
		~reset & (
			  untaken_empty_ilock
			| load_ilock | ldd_ilock
			| lotsa_ilock
			);


/*
 * not needed
	wire no_imid_ilock =
		  load_ilock | ldd_ilock
		| call_use_ilock
		| rd_spec_ilock
//		| jmp_ilock
		| mm_iacc_exc_ilock
		| fcc_ilock
		| fhold_ilock
		| untaken_empty_ilock
		;
 */

/*
 * To prevent a logic loop to the FPC via valid_decode, the FPC
 * needs a version of valid_decode that does not include
 * the fhold_ilock term.  Note that the fcc_ilock is OK.

	wire interlock_fpu =
		 untaken_empty_ilock |
		 (~kill_nohelp_d_il &
			(load_ilock | ldd_ilock |
			(~ANNUL &
				 ( fcc_ilock
				 | fp_ldst_ilock
				 | fhold_ilock
				 | rd_spec_ilock
				 | call_use_ilock
				 )
			))
		 );
//			 | jmp_ilock
 */


// D_NOP REGISTER

	// when necessary, the instruction buffers will dispatch
	// a nop by loading the following register

	wire next_d_nop;
	wire d_nop_reg_sdin;
	Mflipflop_1 d_nop_reg_1(d_nop, next_d_nop, ss_clock, hold) ;

// DETERMINE NEXT_D_NOP (issue nops due to instruction Starvation)

	assign next_d_nop = reset | ERROR_nop;


endmodule


[Up: Mdecode trap_control]
module Mtrap_control(
        FEXC,
	nERROR,
        ss_clock,
	fold_annul,
        hold,
        pint_req_lev,
        reset,
        result,
        trapd_cpd,
        trapd_fpd,
        trapd_iae,
        trapd_iaer,
	trapd_immum,
	trapd_iwp,
        trapd_ilgl,
        trape_algn,
        trape_ilgl,
        trape_priv,
        trape_ticc,
        trape_wo,
        trape_wu,
	mm_dacc_exc_w,
	mm_dacc_err_w,
	mm_dacc_mmu_miss_w,
	mm_dacc_wp_w,
//      trapw_dae,
//	trapw_daer,
//	trapw_dmmum,
        trapw_fpe,
        trapw_int,
        trapw_tag,
	trape_divz,
        FXACK,
        IU_in_trap,
	IU_in_trap4fpu,
	IU_in_trap4dc,
        TRAP,
        d_trap,
        fp_exc,
        trap_cyc1,
        trap_cyc2,
        trapcode,
        w_trap,
	wo_trap_w,
	wu_trap_w
	);

input FEXC;
input nERROR;
input ss_clock;
input fold_annul;
input hold;
input [3:0] pint_req_lev;
input reset;
input [6:0] result;
input trapd_cpd;
input trapd_fpd;
input trapd_iae;
input trapd_iaer;
input trapd_immum;
input trapd_iwp;
input trapd_ilgl;
input trape_algn;
input trape_ilgl;
input trape_priv;
input trape_ticc;
input trape_wo;
input trape_wu;
input mm_dacc_exc_w;
input mm_dacc_err_w;
input mm_dacc_mmu_miss_w;
input mm_dacc_wp_w;
//input trapw_dae;
//input trapw_daer;
//input trapw_dmmum;
input trapw_fpe;
input trapw_int;
input trapw_tag;
input trape_divz;
output FXACK;
output IU_in_trap;
output IU_in_trap4fpu;
output IU_in_trap4dc;
output TRAP;
output d_trap;
output fp_exc;
output trap_cyc1;
output trap_cyc2;
output [7:0] trapcode;
output w_trap;
// output iu_inst_trap_w;
output wo_trap_w;
output wu_trap_w;

//FORWAD DEC.
	wire trap_cyc1, trap_cyc2, d_trap;
	wire trapw_tag;


//---------------------------------------------------------------------------
// TRAP CONTROL (ALGORITHMS)

// FEXC state machine

	wire fp_exc = FEXC & ~reset;

// GENERATE TRAP

	// COMBINE DECODE TRAPS

	// remove trapd_iwp since MMU changed the way it wants
	// to do iwp traps
	wire dec_trap =
		  trapd_iae | trapd_iaer | trapd_ilgl | trapd_fpd | trapd_cpd
		| trapd_immum // | trapd_iwp
		;

	wire dex_trap;
	Mflipflop_1 d_traps_ff_1(dex_trap, dec_trap, 		ss_clock, hold) ;

	// COMBINE EXECUTE TRAPS

	wire ex_trap =
		  (dex_trap & ~fold_annul)
		| trape_ilgl | trape_priv | trape_wo
		| trape_wu | trape_algn | trape_ticc
		| trape_divz
		;

	wire exw_trap;
	Mflipflop_1 e_traps_ff_1(exw_trap, ex_trap, 		ss_clock, hold) ;

	// COMBINE WRITE TRAPS

	// also, force TRAP=0 on reset and in 2 cycles following a TRAP

	wire trapw_dae = mm_dacc_exc_w;
	wire trapw_daer = mm_dacc_err_w;
	wire trapw_dmmum = mm_dacc_mmu_miss_w;
	wire trapw_dwp = mm_dacc_wp_w;

	assign w_trap =
		  (exw_trap | trapw_dae | trapw_daer | trapw_fpe
		| trapw_tag | trapw_int | trapw_dmmum | trapw_dwp);
/*
 * Removed for SUNERGY Puma - no RF parity errors
		| trapw_rfe);
 *
 */

// TRAP STATE MACHINE

	wire TRAP = w_trap & ~reset & ~d_trap;
		/* & ~ss_scan_mode */

	wire ntrap_cyc1 = TRAP;

	// OLD wire ntrap_cyc1 = TRAP | latchedFEXC | latchedCEXC;

	Mflipflop_1 trap_1_ff_1(trap_cyc1, ntrap_cyc1, 		ss_clock, hold) ;

	Mflipflop_1 trap_2_ff_1(trap_cyc2, trap_cyc1, 		ss_clock, hold) ;

	wire nd_trap = ntrap_cyc1 | trap_cyc1;

	Mflipflop_1 d_trap_mas_1( d_trap, nd_trap, ss_clock, hold) ;

/*
 * not for warthog
// Detect R cycle traps.  need to handle PC's differently for
// these.  beware!!!

	wire r_trap =
		  TRAP
		& (trapr_dae | trapr_daer | trapr_dmmum)
		;

	wire rtrap_hldpc = r_trap | hold;

 */

// Let FPC know that we have detected TRAP, or in trap cyc1 or 2.

	wire IU_in_trap = TRAP | trap_cyc1 | trap_cyc2;
	wire IU_in_trap4fpu = IU_in_trap;
	wire IU_in_trap4dc = IU_in_trap;

//-------------------------------------------------------------------------
// ENCODE AND PRIORITIZE TRAPS

// PIPELINE TRAP SIGNALS TO W CYCLE

	// high bit of input to de_trap_reg tied off since
	// now all WP traps happen through the dwp trap signal.
	// mmu changed their minds on how to do this.  this
	// register is kept to be consistent with the 
	// gate level netlist.
	wire [6:0] de_traps_almost;
	wire [6:0] de_trap_reg_mux_out;
	assign de_trap_reg_mux_out =
		({1'b0, trapd_immum, trapd_iaer, trapd_cpd, 			trapd_fpd,trapd_ilgl, trapd_iae});
	Mflipflop_7 de_trap_reg_7( de_traps_almost, de_trap_reg_mux_out, ss_clock, hold) ;
	wire [6:0] de_traps = de_traps_almost & {7{~fold_annul}};

	wire [6:0] dw_traps;
	Mflipflop_7 dw_trap_reg_7( dw_traps, de_traps, ss_clock, hold) ;


	wire iae = dw_traps[0];
	wire ilgl = dw_traps[1];
	wire fpd = dw_traps[2];
	wire cpd = dw_traps[3];
	wire iaer = dw_traps[4];
	wire immum = dw_traps[5];
	wire iwp_det = dw_traps[6];

	wire [6:0] ew_traps;
	wire [6:0] ew_trap_mux_out;
	assign ew_trap_mux_out =
		({trape_divz, trape_ticc, trape_algn, trape_wu,
			trape_wo, trape_priv, trape_ilgl});
	Mflipflop_7 ew_trap_reg_7( ew_traps, ew_trap_mux_out, ss_clock, hold) ;

	
	wire ilgl2 = ew_traps[0];
	wire priv = ew_traps[1];
	wire wo = ew_traps[2];
	wire wu = ew_traps[3];
	wire algn = ew_traps[4];
	wire ticc = ew_traps[5];
	wire divz = ew_traps[6];

	// added to fix IOMMU bug
	wire wo_trap_w = ew_traps[2];
	wire wu_trap_w = ew_traps[3];

// RENAME W CYCLE TRAPS FOR CONVENIENCE

	wire dae = trapw_dae;
	wire daer = trapw_daer;
	wire dmmum = trapw_dmmum;
	wire dwp_det = trapw_dwp;
	wire wfpe = trapw_fpe;


/*
 * No R cycle FPexc detecs in Puma/Martini
	wire rfpe = trapr_fpe;
 *
 */

/*
 * No CP in SUNERGY Puma
	wire wcpe = trapw_cpe;
	wire rcpe = trapr_cpe;
 *
 */

	wire tag = trapw_tag;

	wire int = trapw_int;

/*
 * No RF parity errors in SUNERGY Puma
	wire rfe = trapw_rfe;
 *
 */

// PRIORITY ENCODE TT VALUE and indicate to MMU if trap is inst related

//	wire iu_inst_trap_w = immum | iaer | iae;

	wire [7:0] trapcode;

	Mtrapcode trapcode_mod (
	wfpe, dae, daer, dmmum, immum, iwp_det, dwp_det,
	iae, ilgl, divz, ilgl2, priv, fpd,
	iaer, cpd, wo, wu, algn, tag, ticc, int,
	hold, pint_req_lev, result, nERROR,
	trapcode, FXACK);

endmodule


[Up: Mdecode trap_detection]
module Mtrap_detection(
        ANNUL,
        TRAP,
        ccm_V,
        alu_out_lsb5,
        bicc_taken,
	alu_cc_zero,
        ss_clock,
        cwpm_,
        d_hop3,
        d_imm,
	ehop3_idivbasic,
	mm_iacc_exc_d,
//	mm_iacc_err_par,
	mm_iacc_err_tlb_d,
	mm_iacc_wp_exc_d,
	parity_error_d,
	mm_iacc_mmu_miss_d,
        d_nop,
        d_trap,
        e_hop3,
        ef,
        et,
	fold_annul,
        fp_exc,
        hold,
	mispredicted,
//      mm_dacc_exc_w,
//	mm_dacc_err_w,
//	mm_dacc_mmu_miss_w,
        int_req_lev,
        interlock,
        pil,
        reset,
        s,
	trapcode,
        trap_cyc1,
        valid_decode,
	w_wrpsr,
        wimm,
        ERROR_nop,
        ER_SDOUT,
	error_mode,
	iu_event,
        nERROR,
        trapd_cpd,
        trapd_fpd,
        trapd_iae,
        trapd_iaer,
	trapd_immum,
	trapd_iwp,
        trapd_ilgl,
        trape_algn,
        trape_ilgl,
        trape_priv,
        trape_ticc,
        trape_wo,
        trape_wu,
//      trapw_dae,
//	trapw_daer,
//	trapw_dmmum,
        trapw_fpe,
        trapw_int,
        trapw_tag,
	trape_divz
	);

input ANNUL;
input TRAP;
input ccm_V;
input [4:0] alu_out_lsb5;
input bicc_taken;
input alu_cc_zero;
input ss_clock;
input [2:0] cwpm_;
input [8:0] d_hop3;
input d_imm;
input ehop3_idivbasic;
input mm_iacc_exc_d;
//input mm_iacc_err_par;
input mm_iacc_err_tlb_d;
input mm_iacc_wp_exc_d;
input parity_error_d;
input mm_iacc_mmu_miss_d;
input d_nop;
input d_trap;
input [8:0] e_hop3;
input ef;
input et;
input fold_annul;
input fp_exc;
input hold;
input mispredicted;
//input mm_dacc_exc_w;
//input mm_dacc_err_w;
//input mm_dacc_mmu_miss_w;
input [3:0] int_req_lev;
input interlock;
input [3:0] pil;
input reset;
input s;
input [7:0] trapcode;
input trap_cyc1;
input valid_decode;
//input [2:0] w_hop;
input w_wrpsr;
input [7:0] wimm;
output ERROR_nop;
output ER_SDOUT;
output error_mode;
output iu_event;
output nERROR;
output trapd_cpd;
output trapd_fpd;
output trapd_iae;
output trapd_iaer;
output trapd_immum;
output trapd_iwp;
output trapd_ilgl;
output trape_algn;
output trape_ilgl;
output trape_priv;
output trape_ticc;
output trape_wo;
output trape_wu;
//output trapw_dae;
//output trapw_daer;
//output trapw_dmmum;
output trapw_fpe;
output trapw_int;
output trapw_tag;
output trape_divz;


//FORWARD DEC.
wire r_data_acc;

	wire d_help = d_hop3[8];
	wire [2:0] d_hop = d_hop3[8:6];
	wire [5:0] d_hop2 = d_hop3[8:3];

	wire [5:0] e_hop2 = e_hop3[8:3];
	wire [2:0] e_hop = e_hop3[8:6];
	wire e_help = e_hop3[8];


        // ERROR STATE
           
        // error state is entered when a trap occurs and ET=0.
        // It can only be cleared by an external reset.

        // This flip-flop also terminates the scan chain.

        wire ER_SDOUT;

        assign nERROR =
                ~reset & (ER_SDOUT | (TRAP & ~et));

	Mflipflop_1 ER_SDOUT_reg_1( ER_SDOUT, nERROR,                 ss_clock, 1'b0) ;		// used to be held by hold

	wire nnerror_mode;
	Mflipflop_1 nnerror_mode_reg_1(nnerror_mode,ER_SDOUT,ss_clock,hold) ;

	wire nerror_mode;
	Mflipflop_1 nerror_mode_reg_1(nerror_mode,nnerror_mode,ss_clock,hold) ;

	wire error_mode;
	Mflipflop_1 error_mode_reg_1(error_mode,nerror_mode,ss_clock,hold) ;


        // must delay forcing NOP into the pipe until trap sequence
        // is completed

        wire ERROR_nop = ER_SDOUT & ~trap_cyc1;
 


// TRAP DETECTION

// detect INSTRUCTION ACCESS EXCEPTION in decode

	// Note that mm_iacc_exc_d (d_mexc) MUST be qualified with ~d_nop.

	wire trapd_iae = mm_iacc_exc_d & ~d_nop
		& ~interlock & ~ANNUL & ~d_trap
		& ~mispredicted;

// detect INSTRUCTION ACCESS MMU MISS EXCEPTION in decode

	wire trapd_immum = mm_iacc_mmu_miss_d & ~d_nop
		& ~interlock & ~ANNUL & ~d_trap
		& ~mispredicted;

// detect INSTRUCTION ACCESS WATCHPOINT TRAP in decode

	// this doesn't drive anything anymore, but here for
	// consistency.  MMU changed the way they want to do
	// iwp traps
	wire trapd_iwp = mm_iacc_wp_exc_d & ~d_nop
		& ~interlock & ~ANNUL & ~d_trap
		& ~mispredicted;


// detect INSTRUCTION ACCESS ERROR in decode

	wire trapd_iaer = (parity_error_d | mm_iacc_err_tlb_d)  & ~d_nop
		& ~interlock & ~ANNUL & ~d_trap
		& ~mispredicted;



// detect ILLEGAL INSTRUCTION in decode
// (there is also Write stage detection logic for WRPSR and illegal CWP value)

	wire ilgl_opcode = ~(
		  d_help

		| d_hop==`CALL

		| d_hop2==`SETHI | d_hop2==`BICC | d_hop2==`BFCC | d_hop2==`BCCC

		| d_hop3==`LDSB | d_hop3==`LDSBA | d_hop3==`LDUB | d_hop3==`LDUBA
		| d_hop3==`LDSH | d_hop3==`LDSHA | d_hop3==`LDUH | d_hop3==`LDUHA
		| d_hop3==`LD | d_hop3==`LDA
		| d_hop3==`LDD | d_hop3==`LDDA

		| d_hop3==`SWAP | d_hop3==`SWAPA
		| d_hop3==`LDSTB | d_hop3==`LDSTBA

		| d_hop3==`STB | d_hop3==`STBA | d_hop3==`STH | d_hop3==`STHA
		| d_hop3==`ST | d_hop3==`STA
		| d_hop3==`STD | d_hop3==`STDA

		| d_hop3==`LDF
		| d_hop3==`LDDF
		| d_hop3==`LDFSR

		| d_hop3==`STF
		| d_hop3==`STDF
		| d_hop3==`STFSR
		| d_hop3==`STDFQ

		| d_hop3==`LDC
		| d_hop3==`LDDC
		| d_hop3==`LDCSR

		| d_hop3==`STC
		| d_hop3==`STDC
		| d_hop3==`STCSR
		| d_hop3==`STDCQ

		| d_hop3==`ADD | d_hop3==`ADDCC | d_hop3==`ADDX | d_hop3==`ADDXCC
		| d_hop3==`TADDCC | d_hop3==`TADDCCTV
		| d_hop3==`SUB | d_hop3==`SUBCC | d_hop3==`SUBX | d_hop3==`SUBXCC
		| d_hop3==`TSUBCC | d_hop3==`TSUBCCTV
		| d_hop3==`MULSCC

		| d_hop3==`UMUL | d_hop3==`UMULCC
		| d_hop3==`SMUL | d_hop3==`SMULCC

		| d_hop3==`UDIV | d_hop3==`UDIVCC
		| d_hop3==`SDIV | d_hop3==`SDIVCC

		| d_hop3==`AND | d_hop3==`ANDCC | d_hop3==`ANDN | d_hop3==`ANDNCC
		| d_hop3==`OR | d_hop3==`ORCC | d_hop3==`ORN | d_hop3==`ORNCC
		| d_hop3==`XOR | d_hop3==`XORCC | d_hop3==`XNOR | d_hop3==`XNORCC

		| d_hop3==`SLL | d_hop3==`SRL | d_hop3==`SRA

		| d_hop3==`SAVE | d_hop3==`RESTORE

		| d_hop3==`JMP

		| d_hop3==`TICC

		| d_hop3==`RDTBR | d_hop3==`RDWIM | d_hop3==`RDPSR | d_hop3==`RDY
		| d_hop3==`WRTBR | d_hop3==`WRWIM | d_hop3==`WRPSR | d_hop3==`WRY

		| d_hop3==`FPOP | d_hop3==`FPCMP
		| d_hop3==`CPOP | d_hop3==`CPCMP

		| d_hop3==`RETT
		| d_hop3==`IFLUSH

		)
		;

	wire trapd_ilgl_op =
		  (d_hop3==`RETT & et)		// RETT with traps enabled
		| (d_hop3[8:4]==`MEMA & d_imm)	// ASI load/store with i=1
		;

	wire trapd_ilgl = valid_decode & (ilgl_opcode | trapd_ilgl_op)
		& ~mispredicted;


// detect FLOATING-POINT DISABLED in decode

	wire trapd_fpd_op =
		  (d_hop2==`BFCC)
		| (d_hop3[8:4]==`MEMF)
		| (d_hop3==`FPOP | d_hop3==`FPCMP)
		;
	wire trapd_fpd = valid_decode & ~ef & trapd_fpd_op
		& ~mispredicted;


// detect COPROCESSOR DISABLED in decode
	wire trapd_cpd_op =
		  (d_hop2==`BCCC)
		| (d_hop3[8:4]==`MEMC)
		| (d_hop3==`CPOP | d_hop3==`CPCMP)
		;
	wire trapd_cpd = valid_decode & trapd_cpd_op
		& ~mispredicted;


/*
 * New stuff - this is used to detect IU 'events.'  event
 * information is passed to the clock controller and others
 * for weird control stuff.  i don't know what it all does
 * exactly, but i do know if i detect this particular
 * opcode (i picked it, so i guess it's my responsibity)
 * i need to tell everyone.  BTW, it's only supposed to
 * go on if a register accessible only by scan is outputing
 * a 1.
 *
 * In addition to detecting the plain iu_event, there is
 * also a need for detecting the iu_error condition.  again
 * we use a scan only accessible register to enable this
 * event.
 */

	wire det_iu_event_op = e_hop3==`EVENT;

	wire det_iu_event_e =
		  det_iu_event_op
		& ~TRAP & ~reset
		& ~fold_annul;

	wire iu_event_w;
	Mflipflop_1 iu_event_w_reg_1(iu_event_w,det_iu_event_e,ss_clock,hold) ;

//     this reg is accessible only by scan
	wire enable_event;
	wire nenable_event = enable_event & ~reset;
	Mflipflop_1 event_reg_1(enable_event,nenable_event,ss_clock,1'b0) ;

	wire iuer_enable;
	wire niuer_enable = iuer_enable & ~reset;
	Mflipflop_1 iuer_enable_reg_1(iuer_enable,niuer_enable,ss_clock,1'b0) ;

	wire pER_SDOUT;
	Mflipflop_1 piu_error_reg_1(pER_SDOUT,ER_SDOUT,ss_clock,1'b0) ;

// change the below to remove the iuer_enable,  This bit is no longer
// accessable via the jtag controller (only internal scan).  This
// function will be done by a single flop in rl_clk_stop which is connected
// to the jtag scan chain.
//	wire iuer_event = ER_SDOUT & iuer_enable & ~pER_SDOUT;
	wire iuer_event = ER_SDOUT & ~pER_SDOUT;

// change the below to remove the iuer_enable,  This bit is no longer
// accessable via the jtag controller (only internal scan).  This
// function will be done by a single flop in rl_clk_stop which is connected
// to the jtag scan chain.
//	wire niu_event = iu_event_w & enable_event
	wire niu_event = iu_event_w 
			 & TRAP & (trapcode == 8'h2) & ~hold
		| iuer_event;

	wire iu_event;
	Mflipflop_1 iu_event_reg_1(iu_event,niu_event,ss_clock,1'b0) ;


// detect ILLEGAL INSTRUCTION in execute
// (the only case here is WRPSR with illegal CWP value)

/*
ifndef EXPAND
	wire ilgl_cwp = alu_out_lsb5 > 6;

else
*/

/*
 * for tsunami's 7 register windows
	wire ilgl_cwp = alu_out_lsb5[4] |
			alu_out_lsb5[3] |
			alu_out_lsb5[2] &alu_out_lsb5[1] & alu_out_lsb5[0];
 */

	wire ilgl_cwp = alu_out_lsb5[4] | alu_out_lsb5[3];

//endif



	wire e_wrpsr = e_hop3==`WRPSR;

	wire trape_ilgl = e_wrpsr & ilgl_cwp
		& ~fold_annul;



// detect PRIVILEGED INSTRUCTION in execute

	wire trape_priv_op =
		  e_hop3[8:4]==`MEMA
		| e_hop3==`RDTBR | e_hop3==`RDWIM | e_hop3==`RDPSR
		| e_hop3==`WRTBR | e_hop3==`WRWIM | e_hop3==`WRPSR
		| e_hop3==`STDFQ | e_hop3==`STDCQ
		| e_hop3==`RETT
		;

	wire trape_priv =  ~s & trape_priv_op
		& ~fold_annul;



// detect WINDOW OVERFLOW and WINDOW UNDERFLOW in Execute

	wire [2:0] real_cwp = ~cwpm_;
	wire wim_cwp0;
    // Expanded macro begin.
    // cmux4(wim_cwp_mux0,  1,  wim_cwp0, 		wimm[0], 		wimm[1], 		wimm[2], 		wimm[3],  real_cwp[1:0])
    function [ 1:1] wim_cwp_mux0 ;
        input [ 1:1] in0_fn ;
        input [ 1:1] in1_fn ;
        input [ 1:1] in2_fn ;
        input [ 1:1] in3_fn ;
Next12345678
HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Thu Aug 19 11:57:29 1999
From: ../../../sparc_v8/ssparc/iu/Mdecode/rtl/decode.v

Verilog converted to html by v2html 5.0 (written by Costas Calamvokis).Help