HierarchyFilesModulesSignalsTasksFunctionsHelp
/***************************************************************************
****************************************************************************
***
***  Program File:  @(#)dcc_bp.vpp
***
***
****************************************************************************
****************************************************************************/

/*
    This contains IU-specific code to support dcc and the PC breakpoints.
*/



module Mdcc_bp () ;

   // These define the sampling used by dcc_instr.
   wire [7:0] instr_byte0, instr_byte1, instr_byte2, instr_byte3, instr_byte4,
              instr_byte5, instr_byte6, instr_byte7, instr_byte8, instr_byte9,
              instr_byte10, instr_byte11, instr_byte12, instr_byte13,
              instr_byte14, instr_byte15, instr_byte16,
              instr_byte17, instr_byte18, instr_byte19,
              instr_byte20, instr_byte21, instr_byte22,
              instr_byte23, instr_byte24, instr_byte25, instr_byte26,
	      instr_byte27, instr_byte28 ;

   // Signal which tells us when iu.iuchip.pc.dpc belongs to a valid first flow.
   // Used for PC breakpoints.
   wire fpc_valid = `IU.iuchip.decode.iu_fetch_f ;

   wire dpc_valid = (
	 // Not valid if IU is held
	 !`IU.iuchip.hold

	 // Not valid if it will send a nop or trap into E-cycle
	 && !`IU.iuchip.decode.ir_control.hnoptrap_into_ex

	 // Not valid if a Help flow
	 && !`IU.iuchip.decode.ir_control.d_hhn[2]
      )  ; 
   wire epc_valid = (
	 // Not valid if IU is held
	 !`IU.iuchip.hold

	 // Not valid if a Help flow
	 && !`IU.iuchip.decode.ir_control.e_hhn[2]
      )  ; 
   wire wpc_valid = (
	 // Not valid if IU is held
	 !`IU.iuchip.hold

	 // Not valid if a Help flow
	 && !`IU.iuchip.decode.ir_control.w_hhn[2]
      )  ; 
   wire rpc_valid = (
	 // Not valid if IU is held
	 !`IU.iuchip.hold

	 // Not valid if a Help flow
	 && !`IU.iuchip.decode.ir_control.r_hhn[2]
      )  ; 

   function fpc_break ;
      input [31:0] adr ;
      fpc_break =
	 (adr[31:2] == `IU.iuchip.pc.car[31:2]) && fpc_valid ;
   endfunction

   function dpc_break ;
      input [31:0] adr ;
      dpc_break = (adr[31:2] == `IU.iuchip.pc.dpc[31:2]) && dpc_valid ;
   endfunction

   function epc_break ;
      input [31:0] adr ;
      epc_break = (adr[31:2] == `IU.iuchip.pc.epc[31:2]) && epc_valid ;
   endfunction

   function wpc_break ;
      input [31:0] adr ;
      wpc_break = (adr[31:2] == `IU.iuchip.pc.wpc[31:2]) && wpc_valid ;
   endfunction

   function rpc_break ;
      input [31:0] adr ;
      rpc_break = (adr[31:2] == `IU.iuchip.pc.tpc[31:2]) && rpc_valid ;
   endfunction


   //---------------------------------------------------------------------

   wire [31:0] f_is, a_iseq, d_iseq, d_iseq_a1, df_iseq_a1,
        fe_iseq, fo_iseq, be_iseq, bo_iseq, ice_iseq, ico_iseq,
	q1_iseq, q2_iseq, q3_iseq, q4_iseq, df_iseq, ef_iseq, o_iseq, of_iseq ;
   wire [31:0] d_seq, e_seq, w_seq, r_seq ;

   wire target_g =
       `IU.iuchip.decode.pc_cntl.sadr_aa
	   | `IU.iuchip.decode.sadr_jmprett
	;
   Mflipflop tf_reg (
      target_f, target_g,
      Msystem.clock, `IU.iuchip.hold
   ) ;

    // This signal means that the IU is accepting a doubleword of ICache
    //     data.  The next access gets a new sequence number.
    wire use_ic_data =
	`SSPARC_CORE.cc.ic_cntl.fetch_f & ~`IU.iuchip.hold_control.hold_ic & (
	    `IU.iuchip.hold 
		// If pipe is held, instr can go into Backup reg (unless
		//     queue is full).
		? (~`IU.iuchip.decode.pc_cntl.hld_backup
			& `IU.iuchip.decode.pc_cntl.load_q)
		// If pipe is not held, instr goes into pipe or into queue.
		//     'take_icdata' is the mux select for ic_ibus/backup.
		: (`IU.iuchip.decode.pc_cntl.take_icdata
		     & (`IU.iuchip.decode.pc_cntl.fetch_ic
		  	    | `IU.iuchip.decode.pc_cntl.load_q)
		  )
	) ;

   wire fetch_odd = `SSPARC_CORE.cc.ic_cntl.fetch_f ;

   // Whoops - can't really tell when we're fetching an odd address.
   wire fetch_even = fetch_odd ;

   Mflipflop_rh_32 fis_reg (f_is, (f_is + fetch_odd + fetch_even),
      ~use_ic_data, ~`IU.iuchip.reset, Msystem.clock
   ) ;
   assign fe_iseq = fetch_even ? f_is : 'bx ;
   assign fo_iseq = fetch_odd ? (f_is+fetch_even) : 'bx ;

   Mflipflop_h_32 beis_reg ( be_iseq, fe_iseq,
       `IU.iuchip.decode.pc_cntl.hld_backup, Msystem.clock) ;

   Mflipflop_h_32 bois_reg ( bo_iseq, fo_iseq,
       `IU.iuchip.decode.pc_cntl.hld_backup, Msystem.clock) ;

   Mflipflop_h_32 ais_reg ( a_iseq,
       (`IU.iuchip.decode.pc_cntl.toq_2_alt ? q1_iseq : 'bx),
       `IU.iuchip.queue.hold_alt, Msystem.clock) ;

   Mflipflop_h_32 q4is_reg ( q4_iseq,
       (`IU.iuchip.decode.pc_cntl.nq_state<16) ? 'bx : ico_iseq,
       `IU.iuchip.queue.hold_q4_real, Msystem.clock) ;

   Mflipflop_h_32 q3is_reg ( q3_iseq,
       (`IU.iuchip.decode.pc_cntl.nq_state<8) ? 'bx : (
	   `IU.iuchip.decode.pc_cntl.sel_even3 ? ice_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_odd3 ? ico_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_shift3 ? q4_iseq : (
	   'bx)))),
       `IU.iuchip.queue.hold_q3_real, Msystem.clock) ;

   Mflipflop_h_32 q2is_reg ( q2_iseq,
       (`IU.iuchip.decode.pc_cntl.nq_state<4) ? 'bx : (
	   `IU.iuchip.decode.pc_cntl.sel_even2 ? ice_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_odd2 ? ico_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_fold2 ? q4_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_shift2 ? q3_iseq : (
	   'bx))))),
       `IU.iuchip.queue.hold_q2_real, Msystem.clock) ;

    assign ice_iseq =
	`IU.iuchip.decode.pc_cntl.take_icdata ? fe_iseq : be_iseq ;
    assign ico_iseq =
	`IU.iuchip.decode.pc_cntl.take_icdata ? fo_iseq : bo_iseq ;

   Mflipflop_h_32 q1is_reg ( q1_iseq,
       (`IU.iuchip.decode.pc_cntl.nq_state<2) ? 'bx : (
	   `IU.iuchip.decode.pc_cntl.sel_even1 ? ice_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_odd1 ? ico_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_fold1 ? q3_iseq : (
	   `IU.iuchip.decode.pc_cntl.sel_shift1 ? q2_iseq : (
	   'bx))))),
       `IU.iuchip.queue.hold_q1_real, Msystem.clock) ;

   // Selection of D-stage input
    assign d_iseq_a1 =
	`IU.iuchip.decode.pc_cntl.fetch_ic_even ? ice_iseq : (
	`IU.iuchip.decode.pc_cntl.fetch_ic_odd ? ico_iseq : (
	`IU.iuchip.decode.pc_cntl.fetch_TOQ ? q1_iseq : (
	`IU.iuchip.decode.pc_cntl.fetch_SIQ ? q2_iseq : (
	`IU.iuchip.decode.pc_cntl.fetch_alt ? a_iseq : (
	`IU.iuchip.decode.pc_cntl.cant_unload ? o_iseq : (
	'bx )))))) ;
    
   assign df_iseq_a1 =
        `IU.iuchip.decode.pc_cntl.can_fold
	    ? (`IU.iuchip.decode.pc_cntl.cant_unload ? of_iseq : q1_iseq)
	    : 'bx ;

   Mflipflop_h_32 dis_reg ( d_iseq, d_iseq_a1,
      `IU.iuchip.queue.hld_dirreg_real, Msystem.clock) ;

   Mflipflop_h_32 dfis_reg ( df_iseq, df_iseq_a1,
      `IU.iuchip.decode.pc_cntl.hold_br1, Msystem.clock) ;

   Mflipflop_h_32 oops_reg ( o_iseq,
       (`IU.iuchip.decode.hld_dirreg ? d_iseq_a1 : 'bx),
      `IU.iuchip.queue.hld_dir2_real, Msystem.clock) ;

   Mflipflop_h_32 oops_f_reg ( of_iseq,
       (`IU.iuchip.decode.hld_dirreg ? df_iseq_a1 : 'bx),
      `IU.iuchip.queue.hld_dir2_real, Msystem.clock) ;

   Mflipflop_h_32 efis_reg ( ef_iseq,
       (`IU.iuchip.decode.pc_cntl.nfold_in_e ? df_iseq : 'bx),
      `IU.iuchip.decode.pc_cntl.hold, Msystem.clock) ;

   // Initialize to X on reset, then initialize to 0 on the first fetched
   //    instruction.
   Mflipflop_h_32 ds_reg (
      d_seq,
      `IU.iuchip.reset ? 'bx : (
      (d_seq==='bx) ? (`IU.iuchip.decode.pc_cntl.fetch_ic ? 0 :'bx ) : (
      (`IU.iuchip.decode.d_nop | `IU.iuchip.decode.interlock) ? d_seq : (
      d_seq+1))),
       `IU.iuchip.hold, Msystem.clock
   ) ;
   Mflipflop_h_32 es_reg (e_seq, d_seq, `IU.iuchip.hold, Msystem.clock) ;
   Mflipflop_h_32 ws_reg (w_seq, e_seq, `IU.iuchip.hold, Msystem.clock) ;
   Mflipflop_h_32 rs_reg (r_seq, w_seq, `IU.iuchip.hold, Msystem.clock) ;

   wire [10:0] d_opcode =
      `IU.iuchip.decode.htrap_into_ex ? ({9'o010 | 9'o400, 2'b00}) :
      {
	 `IU.iuchip.decode.ir_control.d_hhn[2],
	 `IU.iuchip.decode.ir.in_dec[31:30],
	 `IU.iuchip.decode.ir.in_dec[24:19],
	 `IU.iuchip.decode.ir_control.d_hhn[1:0]
      } ;
   wire [10:0] e_opcode = {
      `IU.iuchip.decode.ir_control.e_hhn[2],
      `IU.iuchip.decode.ir.e_op,
      `IU.iuchip.decode.ir.e_op3,
      `IU.iuchip.decode.ir_control.e_hhn[1:0]
   } ;
   wire [10:0] w_opcode = {
      `IU.iuchip.decode.ir_control.w_hhn[2],
      `IU.iuchip.decode.ir.w_op,
      `IU.iuchip.decode.ir.w_op3,
      `IU.iuchip.decode.ir_control.w_hhn[1:0]
   } ;
   wire [10:0] r_opcode = {
      `IU.iuchip.decode.ir_control.r_hhn[2],
      `IU.iuchip.decode.ir.r_op,
      `IU.iuchip.decode.ir.r_op3,
      `IU.iuchip.decode.ir_control.r_hhn[1:0]
   } ;
   wire d_nop = (d_opcode==({9'o000 | 9'o400, 2'b00})) ;
   wire e_nop = (e_opcode==({9'o000 | 9'o400, 2'b00})) ;
   wire w_nop = (w_opcode==({9'o000 | 9'o400, 2'b00})) ;
   wire r_nop = (r_opcode==({9'o000 | 9'o400, 2'b00})) ;

   Mflipflop_rh trap_ff(trap_r, `IU.TRAP,
      `IU.iuchip.hold, ~`IU.iuchip.reset, Msystem.clock) ;
   wire start_trap = `IU.TRAP & ~trap_r ;

   // These define the sampling used by dcc_instr
   assign instr_byte0 = d_seq ;
   assign instr_byte1 = e_seq ;
   assign instr_byte2 = w_seq ;
   assign instr_byte3 = r_seq ;
   assign instr_byte4 = {

      `IU.iuchip.decode.interlock,
      `IU.iuchip.decode.ANNUL,
      start_trap,
      `IU.iuchip.hold,
      d_nop, e_nop, w_nop, r_nop
   } ;
   reg [10:0] htrap ; initial htrap = ({9'o010 | 9'o400, 2'b00}) ;
   assign instr_byte5 = {
      `IU.iuchip.hold_control.hold_ic,
      target_f,
      `IU.iuchip.hold_control.dmiss_line |`SSPARC_CORE.dwait_w,
      `IU.iuchip.decode.pc_cntl.fetch_alt,
      `IU.iuchip.decode.mm_iacc_exc_d,
      `IU.iuchip.decode.htrap_into_ex
	 ? {htrap[10], htrap[1:0]}
         : `IU.iuchip.decode.ir_control.d_hhn[2:0]
   } ;
   assign instr_byte6 
      = `IU.iuchip.decode.htrap_into_ex
	 ? {htrap[9:8], 5'b0, htrap[7]}
         : `IU.iuchip.decode.ir.in_dec[31:24] ;
   assign instr_byte7 
      = `IU.iuchip.decode.htrap_into_ex
	 ? {htrap[6:2], 3'b0}
         : `IU.iuchip.decode.ir.in_dec[23:16] ;
   assign instr_byte8 
      = `IU.iuchip.decode.htrap_into_ex
	 ? 0
         : `IU.iuchip.decode.ir.in_dec[15:8] ;
   assign instr_byte9 
      = `IU.iuchip.decode.htrap_into_ex
	 ? 0
         : `IU.iuchip.decode.ir.in_dec[7:0] ;
   wire [31:3] iva_f ;
   Mflipflop_noop_29 iva_reg(iva_f[31:3], `SSPARC_CORE.iu_iva_g[31:3],
       Msystem.clock) ;
   assign instr_byte10 = iva_f[31:24] ;
   assign instr_byte11 = iva_f[23:16] ;
   assign instr_byte12 = iva_f[15:8] ;
   assign instr_byte13 = {iva_f[7:3],3'b0} ;
   assign instr_byte14 = fe_iseq ;
   assign instr_byte15 = fo_iseq ;
   wire istream =
       ~`SSPARC_CORE.cc.ic_cntl.ic_idle & ~`IU.iuchip.hold_control.hold_ic ;
   wire dstream = ~`SSPARC_CORE.cc.dc_cntl.dcc_idle & ~`SSPARC_CORE.cc.dwait_w
       & (~`SSPARC_CORE.cc.enbl_dtag_match_w | `SSPARC_CORE.cc.dt_hit) ;
   assign instr_byte16 = {
	1'b0, `SSPARC_CORE.dc_shold, dstream, 1'b1, 1'b0, 1'b0, istream, 1'b0
   } ;
   assign instr_byte17 = d_iseq ;
   assign instr_byte18 = a_iseq ;
   assign instr_byte19 = q1_iseq ;
   assign instr_byte20 = q2_iseq ;
   assign instr_byte21 = q3_iseq ;
   assign instr_byte22 = q4_iseq ;
   assign instr_byte23 = be_iseq ;
   assign instr_byte24 = bo_iseq ;
   assign instr_byte25 = df_iseq ;
   assign instr_byte26 = ef_iseq ;
   assign instr_byte27 = o_iseq ;
   assign instr_byte28 = of_iseq ;

endmodule
HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Thu Aug 19 12:02:16 1999
From: ../../../sparc_v8/env/rtl/dcc_bp.vpp

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