HierarchyFilesModulesSignalsTasksFunctionsHelp
1234

/******************************************************************************/ 
/*                                                                            */ 
/* Copyright (c) 1999 Sun Microsystems, Inc. All rights reserved.             */ 
/*                                                                            */ 
/* The contents of this file are subject to the current version of the Sun    */ 
/* Community Source License, microSPARCII ("the License"). You may not use    */ 
/* this file except in compliance with the License.  You may obtain a copy    */ 
/* of the License by searching for "Sun Community Source License" on the      */ 
/* World Wide Web at http://www.sun.com. See the License for the rights,      */ 
/* obligations, and limitations governing use of the contents of this file.   */ 
/*                                                                            */ 
/* Sun Microsystems, Inc. has intellectual property rights relating to the    */ 
/* technology embodied in these files. In particular, and without limitation, */ 
/* these intellectual property rights may include one or more U.S. patents,   */ 
/* foreign patents, or pending applications.                                  */ 
/*                                                                            */ 
/* Sun, Sun Microsystems, the Sun logo, all Sun-based trademarks and logos,   */ 
/* Solaris, Java and all Java-based trademarks and logos are trademarks or    */ 
/* registered trademarks of Sun Microsystems, Inc. in the United States and   */ 
/* other countries. microSPARC is a trademark or registered trademark of      */ 
/* SPARC International, Inc. All SPARC trademarks are used under license and  */ 
/* are trademarks or registered trademarks of SPARC International, Inc. in    */ 
/* the United States and other countries. Products bearing SPARC trademarks   */ 
/* are based upon an architecture developed by Sun Microsystems, Inc.         */ 
/*                                                                            */ 
/******************************************************************************/ 
/***************************************************************************
****************************************************************************
***
***  Program File:  @(#)dp_mmu.v
***
****************************************************************************
****************************************************************************/
// @(#)dp_mmu.v	1.96 8/26/94
//
//                 MMU datapath module
// Description :
//     This module describes the virtual address muxing model,
//     of the input address to PA mux. This rtl model describe the 
//     muxing requirment in MMU datapath to form tlb_tag, tlb_data, 
//     table walk ( IU/IO ) address, and also support relatived ASI
//     access to TLB/MFAR/SFAR/IBAR/CTPR..etc.
//   
// Updated :
//          3/18/92   update to adjust new tlb
//          4/8/92    update for tlb megacell update.
//          6/11/92   update for asi cma/sram access mux ,
//                    move them above va_mux
// Dependencies :
//    Instantiated by mmu.v module
//
//*************************************************************************
[Up: mmu MMU_dp]
module dp_mmu(va_tag_out, cxr, pcntr_a_co, pcntr_b_co,
	      page_hit, mm_fb_page, page_miss0, page_miss1,
              r_d_vaddr_out, bm_sel, falcon_exists, io_s_bit,
              pa_out, mm_sb_pa, mm_caddr,
              pa_mux_rd, precharge_early_0, precharge_early_1, mc_mbsy,
              io_space, cntl_space, fb_space, mem_space, pci_space,
              wb_3_size, wb_3_asi, brk_pt_hit, odd_wd,
              dp_mmu_scan_out,
              mc_refresh,io_addr, i_vaddr, d_vaddr, tlb_data_in,
              misc_bus_in, 
              mmu_ptp_in, iva_s_in, dva_s_in, msm_mbit_in, 
              sfar_write, sfar_read, asi_dcd6, 
	      tlb_acc_cmp, tlb_mbit_cmp, mbit_sel,
              va_mux0_sel, va_mux1_sel, va_mux_sel, 
	      mm_page_hit_en, mm_issue_req, mm_fb_req, 
              hld_cxr, hld_sfar, tlb_ram_lvl, tlb_cam_lvl,
              sel_mdat_mux, mm_fbpage_en,
              tb_out, tw_io_bit,
              hld_ctpr, hld_ibar, hold_par, hld_afar, hld_mfar,
              afar_write, mfar_write,  
              bp_sel_30, bp_sel_28, bp_sel_21, bp_sel_20,
              bp_sel_19, bp_sel_18, bp_sel_17, bp_sel_16,
              bp_sel_15, bp_sel_14, bp_mux_sel0, cpu_walk, io_walk,
              dpa_sel_b, dpa_sel_8d,
              ctpr_sel, dpa_sel_0, 
              va_ptp8_sel, va_ptp4_sel, 
              dp_mux1_sel, pamux_rd_sel, 
              tlb_rd_tag, boot_out_30,  io_tlb_nxt,
              tw_rewrite_cam, tw_tlb_vbit,
              tlb_s_bit, tlb_wrt_tag,
              par_sel, hld_dpar, hld_ipar,
              cam_reg_hld, ram_reg_hld, 
              iu_asi_e, iu_size_e, lvl_probe_hld, 
	      mc_caddr_hld,
	      pipe_hold4mmu_dp,
	      wb0_hold_lo, wb1_hold_lo, wb2_hold_lo, wb3_hold_lo,
	      wb_1_sel, wb_2_sel, wb_3_sel,
	      ic_miss,  mem_idle, afx_rst_page_vld,
              ld_pcntr_a, ld_pcntr_b, trig_a, trig_b, sel_brkpt_mux, iva_wp_sel,
              vaf_en_hld, va_bp_hld, va_src_sel,
              ss_clock, ss_reset, ss_scan_mode, dp_mmu_scan_in);



    output [41:0] va_tag_out;        /* output of va_mux for TLB tag.        */
    output [7:0] cxr;                /* Context register output.             */

    output pcntr_a_co;               /* perf cntr A carry out                */
    output pcntr_b_co;               /* perf cntr B carry out                */
    output page_hit;                  /* indicate page hit case for memif     */
    output mm_fb_page;               /* indicate fb page hit case for memif  */
    output page_miss0;               /* page miss (but valid) for page 0     */
    output page_miss1;               /* page miss (but valid) for page 1     */
    output [12:2] r_d_vaddr_out;     /* registered data virtual addr.        */
    output [27:0] tlb_data_in;

/* Output busses */
    output [30:0] pa_out;            /* Physical address output (NO buffer)  */
    output [30:0] mm_sb_pa;          /* Physical address output to sbc  */
    output [11:3] mm_caddr;          /* cas address output                   */


    output [31:0] pa_mux_rd;         /* read data from pa_mux datapath       */

    output io_space;                 /* mm_dpa[30:28] is non-zero.           */
    output cntl_space;               /* mm_dpa[30:28] is "001".              */
    output fb_space;                 /* mm_dpa[30:28] is "010".              */
    output mem_space;                /* mm_dpa[30:28] is "000".              */
// ARAY
      output pci_space;
    output [1:0] wb_3_size;          /* write buffer 3 size field            */
    output [1:0] wb_3_asi;           /* write buffer 3 asi field             */
    output brk_pt_hit;               /* Breakpoint logic addr match detected */
    output odd_wd;		     /* Last memory op for an odd word */


    output dp_mmu_scan_out;

/* Inputs */

      input [1:0] bm_sel;  // two bits, if 2,3 boot from PCI
      input falcon_exists;
    input io_s_bit;
    input tw_io_bit;
    input precharge_early_0;
    input precharge_early_1;
    input mc_mbsy;
    input mc_refresh;                /* dram is in refresh cycle              */
    input mm_fbpage_en;              /* page hit en for afx                   */
    input lvl_probe_hld;             /* hold data from level probe miss memop */
    input tw_rewrite_cam;            /* TW re-writes CAM for L1,L2 PTE        */
    input [31:0] io_addr;            /* IO address input.                     */
    input [31:2] i_vaddr;            /* instruction virtual address input.    */
    input [31:0] d_vaddr;            /* data virtual address input.           */


    input [31:0] misc_bus_in;        /* memory data input.                    */

    input mmu_ptp_in;                /* Data/control from MMU State Machine.  */
    input iva_s_in;                  /* Mem control supervisor bit input.     */
    input dva_s_in;                  /* Mem control supervisor bit input.     */
    input msm_mbit_in;               /* Mem control modified bit input.       */

    input sfar_write;                /* SFAR input mux select                 */
    input sfar_read;                 /* SFAR input reset term                 */
    input asi_dcd6;                  /* input for CXR mux select decode       */
    input [5:0] tlb_acc_cmp;         /* TLB ACC bits for compares             */
    input tlb_mbit_cmp;              /* TLB Mbit for compares                 */
    input [2:0] mbit_sel;            /* mux select fo mbit muxes.             */
    input [3:0] va_mux0_sel;         /* mux select fo VA muxes.               */
    input [4:0] va_mux1_sel;         /* mux select fo VA muxes.               */
    input [3:0] va_mux_sel;          /* mux select fo VA muxes.               */
    input [1:0] mm_page_hit_en;      /* enables for page hit registers        */
    input mm_issue_req;              /* issue_req to memif                    */
    input mm_fb_req;                 /* issue_req to FB memif                 */
    input hld_cxr;                   /* Hold enable for CXR                   */
    input hld_sfar;                  /* Hold enable for SFAR                  */
    input [2:0] tlb_ram_lvl;         /* TLB tag level input bits from tw sm.  */
    input [2:0] tlb_cam_lvl;         /* TLB tag level input bits from tw sm.  */
    input sel_mdat_mux;              /* regd mdat mux sel. w/ asi_dcd        */

/* Input busses */
    input [27:0] tb_out;             /* tlb data output                       */

/* Input control from ASI decode */
    input hld_ctpr;                  /* load enable for CTPR                  */
    input hld_ibar;                  /* load enable for IBAR                  */
    input hold_par;                  /* load enable for PAR                   */
    input hld_afar;                  /* load enable for AFAR                  */
    input hld_mfar;                  /* load enable for MFAR                  */
    input afar_write;                /* input mux select for AFAR.            */
    input mfar_write;                /* input mux select for MFAR.            */

/***  Mux select inputs */
    input [1:0] bp_sel_30;           /* Bypass mux selects for bits [30:29].  */
    input [1:0] bp_sel_28;           /* Bypass mux selects for bit [28].      */
    input bp_sel_21;                 /* Bypass mux selects for bits [27:21].  */
    input [1:0] bp_sel_20;           /* Bypass mux selects for bit [20].      */
    input [1:0] bp_sel_19;           /* Bypass mux selects for bit [19].      */
    input [1:0] bp_sel_18;           /* Bypass mux selects for bit [18].      */
    input [1:0] bp_sel_17;           /* Bypass mux selects for bit [17].      */
    input [1:0] bp_sel_16;           /* Bypass mux selects for bit [16].      */
    input [1:0] bp_sel_15;           /* Bypass mux selects for bit [15].      */
    input [1:0] bp_sel_14;           /* Bypass mux selects for bit [14].      */
    input bp_mux_sel0;               /* Bypass mux select for D0 input        */
    input cpu_walk;                  /* Bypass mux select for cpu_walk        */
    input io_walk;                   /* Bypass mux select for io_walk         */

    input dpa_sel_b;              /* DPA mux select for ROOT/level-1 PTE*/
    input dpa_sel_8d;             /* DPA mux select for bits [09:08] */
    input ctpr_sel;               /* DPA mux selects for bits [07:04].*/
    input dpa_sel_0;              /* DPA mux selects for bits [01:00].*/

    input va_ptp8_sel;  
    input [3:0] va_ptp4_sel;    

    input [4:0] dp_mux1_sel;      /* mux select for dp_mux1 read mux*/
    input [4:0] pamux_rd_sel;     /* mux select for PA regs read mux*/
    input [41:0] tlb_rd_tag;      /* TLB tag for ASI read operation*/
    input boot_out_30;            /* PA[30] for IO bypass path */
    input io_tlb_nxt;

    input tw_tlb_vbit;          /* TLB write signal for v_in */
    input tlb_s_bit;          /* TLB write signal for s_in */
    input tlb_wrt_tag;          /* TLB write signal for s_in */
// added for swift 
    input [1:0] par_sel;        /* select different par input */
// hold signal for the backup par register
    input hld_ipar;               /* hold signal for ipar reg */
    input hld_dpar;		  /* hold signal for dpar reg */
    input cam_reg_hld;            /* hold signal for cam shadow reg */
    input ram_reg_hld;            /* hold signal for ram shadow reg */
    input [1:0] iu_asi_e;         /* asi fields from iu in e stage */
    input [1:0] iu_size_e;        /* iu access size */
    input mc_caddr_hld;
    input pipe_hold4mmu_dp;
    input wb0_hold_lo;
    input wb1_hold_lo;
    input wb2_hold_lo;
    input wb3_hold_lo;
    input wb_1_sel;
    input wb_2_sel;
    input wb_3_sel;
    input ic_miss;                // i$ miss signal
    input mem_idle;                // mem idle just before standby mode
    input afx_rst_page_vld;        // reset the page valids after all
				   // pci afx transactions

    input ld_pcntr_a;
    input ld_pcntr_b;
    input trig_a;
    input trig_b;
    input iva_wp_sel;
    input sel_brkpt_mux;
    input vaf_en_hld;
    input va_bp_hld;
    input [1:0] va_src_sel;	/* VA breakpoint mux source select **/

    input ss_clock;
    input ss_reset;
    input ss_scan_mode;
    input dp_mmu_scan_in;



/**+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**/
/***************************************************************************/
/***** DP_VA_MUX.V logic in first part                                    **/
/***************************************************************************/
/**+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**/

    wire tlb_ptp_out;
    wire tlb_sbit_out;
    wire tw_mbit;
    wire tlb_rbit_out;
    wire tlb_vbit_out;
    wire tlb_io_bit_out;
/***** wire definition for vx_mux (cam)*******/
    wire asi_s_bit;
    wire asi_v_in;
    wire [5:0] asi_prot_in;
    wire asi_mod_in;
    wire asi_io_in;
    wire asi_ptp_in;
    wire [2:0] asi_lvl_in;
    wire [7:0] asi_cntx_in;
    wire [31:12] asi_va_in;
/****** start for data mux portion(sram) *******/
    wire asi_data_r_in;
    wire [19:0] misc1_in;
    wire [2:0] misc2_in;
    wire [2:0] asi_data_lvl_in;
/****** end of va mux asi ********/
    wire [30:0] bp_paddr1;
    wire [2:0] tlb_lvl_sram_out;
    wire [5:0] tlb_pro_bits;
    wire [5:0] prot_mux0_out;
    wire [5:0] acc_prot;
    wire [7:0] tlb_cntxt_out;
    wire [19:0] tlb_pamux_out;
    wire [19:0] va_tag_mux_out;
    wire [31:0] va_mux;
    wire [31:0] brkpt_mux;
    wire [31:0] tlb_rd_data_byp;
    wire [31:0] lvl_prb_data;
    wire [2:0] tlb_lvl_out;      /* in swift we, have lv1 */
    wire [30:0] hack_par;        /* output wire of 5 special mux */
    wire [41:0] va_tag_out;      /* size of va_tag_out */
    wire tlb_cam_mbit;           /* tlb cam mbit input wire */
    wire mod_mux0_out;           /* tlb cam mbit input wire */
    // changed bit range from [39:0] to [35:0] to match other uses
    wire [35:0] mux_2_out, mux_1_out, mux_3_out;
				 /* wire of mux out of store buffer */
    
/*************************************************************************/

    wire [31:0] r_misc_in;
    MflipflopR_32 misc_in_reg_32(r_misc_in,misc_bus_in,ss_clock,lvl_probe_hld,ss_reset) ;

    wire [31:0] misc_in;
    
    // Expanded macro begin.
    // cmux2(misc_mux, 32, misc_in, misc_bus_in, r_misc_in,  		(tw_rewrite_cam | lvl_probe_hld))
    function [32:1] misc_mux ;
        input [32:1] in0_fn ;
        input [32:1] in1_fn ;
        input select_fn ;
        reg [32:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            misc_mux = out_fn ;
        end
    endfunction
    assign misc_in = misc_mux(misc_bus_in, r_misc_in,  		(tw_rewrite_cam | lvl_probe_hld)) ;
    // Expanded macro end.


/*************************************************************************/
/* PA muxing defintions, defined by each bit. */

    wire [30:0]  data_pa;          /* DATA physical address(for D$ and MCB)*/
    wire [30:8]  bp_paddr;         /* bypass physical addr [30:12]*/
    wire [7:0]   va_ptp_out;       /* output of VA Shift mux for tablewalks*/


    wire [30:00] pa_out;    /* Physical address is output from PAR*/
    wire [30:0] mm_sb_pa = pa_out;


    wire [30:0] par;          /* def. moved from PAR reg. */
    wire [30:0] ipar;
    wire [30:0] dpar;

   

/** TLB CAM output register  *********************************************/
/**     Used for tablewalks and ASI write (R/M/W).                      **/
/**     Uses software arrangement of fields.                            **/
/**                                                                     **/
/*************************************************************************/
/**                  TLB TAG software representation                    **/
/** PTE                                                                 **/
/**     +---------+-------+-------+-----------+---+-----+-----+-+-+-+-+ **/
/**     |  INDX1  | INDX2 | INDX3 |  Context  | V | LVL | PTCT|S|I|P|M| **/
/**     +---------+-------+-------+-----------+---+-----+-----+-+-+-+-+ **/
/**      41     34 33   28 27   22 21       14  13 12 10 9   4 3 2 1 0  **/
/**                                                                     **/
/*************************************************************************/

    wire [41:0] tlb_cam_reg ;
    MflipflopR_42 tlb_cam_reg_42(tlb_cam_reg,tlb_rd_tag,ss_clock,cam_reg_hld,ss_reset) ;


/****************** Start the tlb_data_in register **********************/
/***** this is a registers to latch data for asi data write later on *****/

   wire [27:0] tlb_data_reg;
   MflipflopR_28 tlb_data_28(tlb_data_reg,tb_out,ss_clock,ram_reg_hld,ss_reset) ;



// Start store buffer address data path , asi also as a input.
// dva = 32 plus 2 bits asi --> iu_asi_e[1:0] signals
// remember 4 hold pin 3 mux pin from cache data store buffer 
// sb_mux_sel 1 seleted sb_addr_input , 0 from upper register Shift 

   wire [35:0] wr_buf_0_out,wr_buf_1_out,wr_buf_2_out,wr_buf_3_out;

   wire [35:0] sb_addr_in = { iu_size_e, iu_asi_e[1:0], d_vaddr };

  


    // Expanded macro begin.
    // cmux2(mux_1_out, 36, mux_1_out, sb_addr_in, wr_buf_0_out, wb_1_sel)
    function [36:1] fn_mux_1_out ;
        input [36:1] in0_fn ;
        input [36:1] in1_fn ;
        input select_fn ;
        reg [36:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            fn_mux_1_out = out_fn ;
        end
    endfunction
    assign mux_1_out = fn_mux_1_out(sb_addr_in, wr_buf_0_out, wb_1_sel) ;
    // Expanded macro end.

    // Expanded macro begin.
    // cmux2(mux_2_out, 36, mux_2_out, sb_addr_in, wr_buf_1_out, wb_2_sel)
    function [36:1] fn_mux_2_out ;
        input [36:1] in0_fn ;
        input [36:1] in1_fn ;
        input select_fn ;
        reg [36:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            fn_mux_2_out = out_fn ;
        end
    endfunction
    assign mux_2_out = fn_mux_2_out(sb_addr_in, wr_buf_1_out, wb_2_sel) ;
    // Expanded macro end.

    // Expanded macro begin.
    // cmux2(mux_3_out, 36, mux_3_out, sb_addr_in, wr_buf_2_out, wb_3_sel)
    function [36:1] fn_mux_3_out ;
        input [36:1] in0_fn ;
        input [36:1] in1_fn ;
        input select_fn ;
        reg [36:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            fn_mux_3_out = out_fn ;
        end
    endfunction
    assign mux_3_out = fn_mux_3_out(sb_addr_in, wr_buf_2_out, wb_3_sel) ;
    // Expanded macro end.


 MflipflopR_36 wr_buf_reg_0_36(wr_buf_0_out,sb_addr_in,ss_clock,~wb0_hold_lo,ss_reset) ;
 MflipflopR_36 wr_buf_reg_1_36(wr_buf_1_out,mux_1_out,ss_clock,~wb1_hold_lo,ss_reset) ;
 MflipflopR_36 wr_buf_reg_2_36(wr_buf_2_out,mux_2_out,ss_clock,~wb2_hold_lo,ss_reset) ;
 MflipflopR_36 wr_buf_reg_3_36(wr_buf_3_out,mux_3_out,ss_clock,~wb3_hold_lo,ss_reset) ;

    assign wb_3_size = wr_buf_3_out[35:34] ;
    assign wb_3_asi = wr_buf_3_out[33:32] ;
// 
//  The following is the major mux control signals in this modules
// 

// decode operation for asi tlb cam h/l write and sram direct write

wire asi_cam_write_h = asi_dcd6 & wr_buf_3_out[8] & wr_buf_3_out[9];
wire asi_cam_write_l =  asi_dcd6 & wr_buf_3_out[8] & ~wr_buf_3_out[9];
wire asi_ram_write = asi_dcd6 & ~wr_buf_3_out[8] & ~wr_buf_3_out[9];

wire not_hld_cam_h = cam_reg_hld & ~asi_cam_write_h; // hold pin for cam high
wire not_hld_cam_l = (cam_reg_hld & ~asi_cam_write_l) | // hold pin for cam low
                     (cam_reg_hld & ~tw_tlb_vbit);
wire not_hld_ram = ram_reg_hld & ~asi_ram_write;     // hold pin for ram write

// mux selection for context portion of va mux

    wire [2:0] cxr_mux_sel = {(~asi_dcd6 & ~(cpu_walk & mmu_ptp_in & ~tw_io_bit)),
                        (~asi_dcd6 & (cpu_walk & mmu_ptp_in & ~cam_reg_hld) & ~tw_io_bit),
                        (asi_dcd6 | (cpu_walk & mmu_ptp_in & cam_reg_hld))};

// mux selection wire for level bit but for asi write mode

// REGWIRE mdat_sel_reg;
// REGR(mdat_sel_reg_ff,1,mdat_sel_reg,sel_mdat_mux,ss_clock,1'b0,ss_reset)

// Inverted copy (to match physical datapath)

// REGWIRE mdat_sel_reg2;
// REGR(mdat_sel_reg2_ff,1,mdat_sel_reg2,~sel_mdat_mux,ss_clock,1'b0,ss_reset)


/***************************************************************************/
/*** NOTE: change DPA muxes, such that tb_out doesn't need inversion ******/
/***************************************************************************/

/*** Decode for DPA level 1 address [23:18] selects                       */
/** TIMING NOTE: dpa_sel_l1 IS timing critical, the inputs "tb_out"       */
/**              are read from the TLB RAM in the current cycle.          */

    wire dpa_sel_l1 = (dpa_sel_b | (~cpu_walk & ~tb_out[26]));

/*** Decode for DPA level 2 address [17:12] selects                       */
/** TIMING NOTE: dpa_sel_l2 IS timing critical, the inputs "tb_out"       */
/**              are read from the TLB RAM in the current cycle.          */

    wire dpa_sel_l2 = (dpa_sel_b | (~cpu_walk & ~tb_out[25]));

    wire dpa_sel_10d = ~(cpu_walk & ~ctpr_sel) ;

/***************************************************************************/

/** Registers added for iu_iva and iu_dva **                                  */ 
    wire [31:02] i_vaddr_reg;
    MflipflopR_30 iu_iva_reg_30(i_vaddr_reg,i_vaddr,ss_clock,ic_miss,ss_reset) ;

    wire [31:0] r_i_vaddr = {i_vaddr_reg, 2'b0};


    wire [31:0] r_d_vaddr;
    MflipflopR_32 iu_dva_reg_32(r_d_vaddr,d_vaddr,ss_clock,pipe_hold4mmu_dp,ss_reset) ;

    assign r_d_vaddr_out = r_d_vaddr[12:2];


/***************************************************************************/

/***** Add register for vbit to TLB.  This pipeline reg. is for dp */


/********************************************************************/
/* Valid mux (2:1) selecting either vbit (always 1) or misc_in.    */
/***** Bit [41] of the TLB TAG input ********************************/
    
/*** cam_reg_hld = 1 select from shdow reg ****/
/** this mux is to move the asi_w mux to top of va_mux for timing reason **/

    
    // Expanded macro begin.
    // cmux2(asi_v_mux, 1, asi_v_in,  	  misc_in[3],            tlb_cam_reg[13],            not_hld_cam_h)
    function [1:1] asi_v_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_v_mux = out_fn ;
        end
    endfunction
    assign asi_v_in = asi_v_mux( 	  misc_in[3],            tlb_cam_reg[13],            not_hld_cam_h) ;
    // Expanded macro end.

       
    
    // Expanded macro begin.
    // cmux2(tlb_vbit_mux, 1, tlb_vbit_out,              tw_tlb_vbit,              asi_v_in,              sel_mdat_mux)
    function [1:1] tlb_vbit_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            tlb_vbit_mux = out_fn ;
        end
    endfunction
    assign tlb_vbit_out = tlb_vbit_mux(             tw_tlb_vbit,              asi_v_in,              sel_mdat_mux) ;
    // Expanded macro end.



/***** Bit [03] of the TLB TAG input ********************************/

    
    // Expanded macro begin.
    // cmux2(asi_s_mux, 1, asi_s_bit,            misc_in[3],            tlb_cam_reg[3],            not_hld_cam_l)
    function [1:1] asi_s_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_s_mux = out_fn ;
        end
    endfunction
    assign asi_s_bit = asi_s_mux(           misc_in[3],            tlb_cam_reg[3],            not_hld_cam_l) ;
    // Expanded macro end.


    wire asi_s_in = asi_s_bit | io_s_bit;

    wire tlb_sbit_in = tlb_wrt_tag | tlb_s_bit ;

    
    // Expanded macro begin.
    // cmux4d(va_tag_mux_2,  1,  tlb_sbit_out,                iva_s_in,  va_mux0_sel[0],              dva_s_in,  va_mux0_sel[1],              asi_s_in,   va_mux0_sel[2],              tlb_sbit_in,   va_mux0_sel[3])
    function [ 1:1] va_tag_mux_2 ;
        input [ 1:1] in0_fn ;
        input s0_fn ;
        input [ 1:1] in1_fn ;
        input s1_fn ;
        input [ 1:1] in2_fn ;
        input s2_fn ;
        input [ 1:1] in3_fn ;
        input s3_fn ;
        reg [ 1:1] out_fn ;
        begin
            case ({  va_mux0_sel[3],   va_mux0_sel[2],  va_mux0_sel[1],  va_mux0_sel[0]}) /* synopsys parallel_case */
                4'b0001:        out_fn = in0_fn;
                4'b0010: out_fn = in1_fn;
                4'b0100:        out_fn = in2_fn;
                4'b1000: out_fn = in3_fn;
                default: out_fn = 65'hx;
            endcase
            va_tag_mux_2 = out_fn ;
        end
    endfunction
    assign  tlb_sbit_out = va_tag_mux_2(               iva_s_in,  va_mux0_sel[0],              dva_s_in,  va_mux0_sel[1],              asi_s_in,   va_mux0_sel[2],              tlb_sbit_in,   va_mux0_sel[3]) ;
    // synopsys translate_off
    always @ (posedge(~Mclocks.clock))
    #1 if ((  va_mux0_sel[3]+  va_mux0_sel[2]+ va_mux0_sel[1]+ va_mux0_sel[0] !== 1) & `SS_SCOPE.input_reset_l &
    ~Mtask.trace.ppr & ~(  va_mux0_sel[3]+  va_mux0_sel[2]+ va_mux0_sel[1]^ va_mux0_sel[0]===1'bx)) begin
    $display("### %m.va_tag_mux_2: CMUX4D select error!\n");
    $display("  va_mux0_sel[3],  va_mux0_sel[2], va_mux0_sel[1], va_mux0_sel[0]=%0d%0d%0d%0d\n",   va_mux0_sel[3],  va_mux0_sel[2], va_mux0_sel[1], va_mux0_sel[0]);
    Mclocks.warning_count = Mclocks.warning_count + 1;
end
 // synopsys translate_on
 // Expanded macro end.


/***** Bit [9:4] of the TLB TAG input ******************************/
// add tlb_pro from mmu-cntl --> decoded protection bits

// Decode prot bits from acc for tag - misc_in[4:2]
// Force all protection bits on for IO PTEs. (allows any compare).

// UE = prot[5]
   assign acc_prot[5] = (misc_in[4:2] == 3'h2) | (misc_in[4:2] == 3'h3) |
			(misc_in[4:2] == 3'h4) | io_walk;
// UR = prot[4]
   assign acc_prot[4] = (misc_in[4:2] == 3'h0) | (misc_in[4:2] == 3'h1) |
			(misc_in[4:2] == 3'h2) | (misc_in[4:2] == 3'h3) |
			(misc_in[4:2] == 3'h5) | io_walk;
// UW = prot[3]
   assign acc_prot[3] = (misc_in[4:2] == 3'h1) | (misc_in[4:2] == 3'h3) |
			io_walk;
// SE = prot[2]
   assign acc_prot[2] = (misc_in[4:2] == 3'h2) | (misc_in[4:2] == 3'h3) |
                        (misc_in[4:2] == 3'h4) | (misc_in[4:2] == 3'h6) |
                        (misc_in[4:2] == 3'h7) | io_walk;
// SR = prot[1]
   assign acc_prot[1] = (misc_in[4:2] != 3'h4) | io_walk;
// SW = prot[0]
   assign acc_prot[0] = (misc_in[4:2] == 3'h1) | (misc_in[4:2] == 3'h3) |
			(misc_in[4:2] == 3'h5) | (misc_in[4:2] == 3'h7) |
			 io_walk;

// MUX of all possible prot sources
wire[5:0] iu_f_prot = 6'b000100 ;

/********* TLB TAG bit [9:4] ************/

    
    // Expanded macro begin.
    // cmux2(asi_prot_mux, 6, asi_prot_in,            misc_in[9:4],            tlb_cam_reg[9:4],            not_hld_cam_l)
    function [6:1] asi_prot_mux ;
        input [6:1] in0_fn ;
        input [6:1] in1_fn ;
        input select_fn ;
        reg [6:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_prot_mux = out_fn ;
        end
    endfunction
    assign asi_prot_in = asi_prot_mux(           misc_in[9:4],            tlb_cam_reg[9:4],            not_hld_cam_l) ;
    // Expanded macro end.



    
    // Expanded macro begin.
    // cmux3d(prot_mux, 6, tlb_pro_bits,  	    tlb_acc_cmp,  mbit_sel[0], 		/* For TLB lookups  */ 	    acc_prot,  mbit_sel[1], 		/* For TW writes  */ 	    asi_prot_in,  mbit_sel[2])
    function [6:1] prot_mux ;
        input [6:1] in0_fn ;
        input s0_fn ;
        input [6:1] in1_fn ;
        input s1_fn ;
        input [6:1] in2_fn ;
        input s2_fn ;
        reg [6:1] out_fn ;
        begin
            case ({ mbit_sel[2],  mbit_sel[1],  mbit_sel[0]}) /* synopsys parallel_case */
                3'b001:         out_fn = in0_fn;
                3'b010: out_fn = in1_fn;
                3'b100:         out_fn = in2_fn;
                default:        out_fn = 65'hx;
            endcase
            prot_mux = out_fn ;
        end
    endfunction
    assign tlb_pro_bits = prot_mux( 	    tlb_acc_cmp,  mbit_sel[0], 		/* For TLB lookups  */ 	    acc_prot,  mbit_sel[1], 		/* For TW writes  */ 	    asi_prot_in,  mbit_sel[2]) ;
    // synopsys translate_off
    always @ (posedge(~Mclocks.clock))
    #1 if (( mbit_sel[2]+ mbit_sel[1]+ mbit_sel[0] !== 1) & `SS_SCOPE.input_reset_l &
    ~Mtask.trace.ppr & ~( mbit_sel[2]+ mbit_sel[1]^ mbit_sel[0]===1'bx)) begin
    $display("### %m.prot_mux: CMUX3D select error!\n");
    $display(" mbit_sel[2], mbit_sel[1], mbit_sel[0]=%0d%0d%0d\n",  mbit_sel[2], mbit_sel[1], mbit_sel[0]);
    Mclocks.warning_count = Mclocks.warning_count + 1;
end
        // synopsys translate_on
        // Expanded macro end.
		/* For ASI writes  */
	    
// Now the same for the mod bit
//
/**** modify bit TLB TAG [0] *****/
/***** Bit [4] of the TLB DATA input (m bit)********************************/

/***** Set Mbit in if entry is a PTE and entry is written ***********/
// Always set Mbit for IO PTE.

    wire tlb_mbit_in = (msm_mbit_in & misc_in[1]) | io_walk;

    
    // Expanded macro begin.
    // cmux2(asi_mod_mux, 1, asi_mod_in,             misc_in[0],            tlb_cam_reg[0],  			/* Software map  */           not_hld_cam_l)
    function [1:1] asi_mod_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_mod_mux = out_fn ;
        end
    endfunction
    assign asi_mod_in = asi_mod_mux(            misc_in[0],            tlb_cam_reg[0],  			/* Software map  */           not_hld_cam_l) ;
    // Expanded macro end.


     wire asi_data_m_in;
     
    // Expanded macro begin.
    // cmux2(asi_data_m_mux, 1, asi_data_m_in,             misc_in[6],             tlb_data_reg[4],             not_hld_ram)
    function [1:1] asi_data_m_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_data_m_mux = out_fn ;
        end
    endfunction
    assign asi_data_m_in = asi_data_m_mux(            misc_in[6],             tlb_data_reg[4],             not_hld_ram) ;
    // Expanded macro end.


    
    // Expanded macro begin.
    // cmux2(tw_mbit_mux,  1,  tw_mbit,               asi_data_m_in,               tlb_mbit_in,              tlb_mbit_in)
    function [ 1:1] tw_mbit_mux ;
        input [ 1:1] in0_fn ;
        input [ 1:1] in1_fn ;
        input select_fn ;
        reg [ 1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            tw_mbit_mux = out_fn ;
        end
    endfunction
    assign  tw_mbit = tw_mbit_mux(              asi_data_m_in,               tlb_mbit_in,              tlb_mbit_in) ;
    // Expanded macro end.
    /* If mbit set, select it (LOAD a 1).*/


    
    // Expanded macro begin.
    // cmux3d(mbit_mux,  1,  tlb_cam_mbit,              tlb_mbit_cmp,  mbit_sel[0], 		/* For TLB lookups */             tw_mbit,  mbit_sel[1], 		/* For TW writes */             asi_mod_in,  mbit_sel[2])
    function [ 1:1] mbit_mux ;
        input [ 1:1] in0_fn ;
        input s0_fn ;
        input [ 1:1] in1_fn ;
        input s1_fn ;
        input [ 1:1] in2_fn ;
        input s2_fn ;
        reg [ 1:1] out_fn ;
        begin
            case ({ mbit_sel[2],  mbit_sel[1],  mbit_sel[0]}) /* synopsys parallel_case */
                3'b001:         out_fn = in0_fn;
                3'b010: out_fn = in1_fn;
                3'b100:         out_fn = in2_fn;
                default:        out_fn = 65'hx;
            endcase
            mbit_mux = out_fn ;
        end
    endfunction
    assign  tlb_cam_mbit = mbit_mux(             tlb_mbit_cmp,  mbit_sel[0], 		/* For TLB lookups */             tw_mbit,  mbit_sel[1], 		/* For TW writes */             asi_mod_in,  mbit_sel[2]) ;
    // synopsys translate_off
    always @ (posedge(~Mclocks.clock))
    #1 if (( mbit_sel[2]+ mbit_sel[1]+ mbit_sel[0] !== 1) & `SS_SCOPE.input_reset_l &
    ~Mtask.trace.ppr & ~( mbit_sel[2]+ mbit_sel[1]^ mbit_sel[0]===1'bx)) begin
    $display("### %m.mbit_mux: CMUX3D select error!\n");
    $display(" mbit_sel[2], mbit_sel[1], mbit_sel[0]=%0d%0d%0d\n",  mbit_sel[2], mbit_sel[1], mbit_sel[0]);
    Mclocks.warning_count = Mclocks.warning_count + 1;
end
        // synopsys translate_on
        // Expanded macro end.
		/* For ASI writes */


/* IO bit register and mux providing mdata visibility      */
/***** Bit [02] of the TLB TAG input ********************************/

    
    // Expanded macro begin.
    // cmux2(asi_io_mux, 1, asi_io_in,              misc_in[2],            tlb_cam_reg[2],   			/* Software map */           not_hld_cam_l)
    function [1:1] asi_io_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_io_mux = out_fn ;
        end
    endfunction
    assign asi_io_in = asi_io_mux(             misc_in[2],            tlb_cam_reg[2],   			/* Software map */           not_hld_cam_l) ;
    // Expanded macro end.


    
    // Expanded macro begin.
    // cmux2(tlb_iobit_mux,  1,  tlb_io_bit_out,               io_tlb_nxt,             asi_io_in,             sel_mdat_mux)
    function [ 1:1] tlb_iobit_mux ;
        input [ 1:1] in0_fn ;
        input [ 1:1] in1_fn ;
        input select_fn ;
        reg [ 1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            tlb_iobit_mux = out_fn ;
        end
    endfunction
    assign  tlb_io_bit_out = tlb_iobit_mux(              io_tlb_nxt,             asi_io_in,             sel_mdat_mux) ;
    // Expanded macro end.


/* PTP bit mux providing mdata visibility                           */


/***** Bit [3] of the TLB DATA input ********************************/

    
    // Expanded macro begin.
    // cmux2(asi_data_r_mux, 1, asi_data_r_in,             misc_in[5],             tlb_data_reg[3],             not_hld_ram)
    function [1:1] asi_data_r_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_data_r_mux = out_fn ;
        end
    endfunction
    assign asi_data_r_in = asi_data_r_mux(            misc_in[5],             tlb_data_reg[3],             not_hld_ram) ;
    // Expanded macro end.

// here is , if not_hld_ram means not in asi tlb ram read access process
// so, r bit will be decide bit bit [1] & bit [5]

    wire misc_or_asi_in = misc_in[1] & ~not_hld_ram;

    wire pte_r_bit = (misc_in[1] & tw_tlb_vbit) | 
			(~tw_tlb_vbit & misc_in[5]) ;

    
    // Expanded macro begin.
    // cmux2(tlb_rbit_mux,  1,  tlb_rbit_out,               asi_data_r_in,               pte_r_bit,               misc_or_asi_in)
    function [ 1:1] tlb_rbit_mux ;
        input [ 1:1] in0_fn ;
        input [ 1:1] in1_fn ;
        input select_fn ;
        reg [ 1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            tlb_rbit_mux = out_fn ;
        end
    endfunction
    assign  tlb_rbit_out = tlb_rbit_mux(              asi_data_r_in,               pte_r_bit,               misc_or_asi_in) ;
    // Expanded macro end.
    /* If input PTE select mdata[01] */

/***** TLB data input mux (3-bits).  Selects between misc_in  ******/
/****  and state machine input for bits [5:4].                 ******/

    wire [27:0] tlb_data_in_mem = { tlb_lvl_sram_out, /* sram level bits */
                          misc1_in,
                          tw_mbit,          /* modified bit input*/
                          tlb_rbit_out,     /* reference bit input*/
                          misc2_in};
 
    
    // Expanded macro begin.
    // cmux2(tlb_dtat_in_mux, 28, tlb_data_in,             tlb_data_in_mem,               /* PTP/PTE from mem  */           tb_out,                        /* TLB output      */           tw_rewrite_cam)
    function [28:1] tlb_dtat_in_mux ;
        input [28:1] in0_fn ;
        input [28:1] in1_fn ;
        input select_fn ;
        reg [28:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            tlb_dtat_in_mux = out_fn ;
        end
    endfunction
    assign tlb_data_in = tlb_dtat_in_mux(            tlb_data_in_mem,               /* PTP/PTE from mem  */           tb_out,                        /* TLB output      */           tw_rewrite_cam) ;
    // Expanded macro end.


/* PTP bit mux providing mdata visibility                           */
/***** Bit [1] of the TLB TAG input ********************************/

    
    // Expanded macro begin.
    // cmux2(asi_ptp_mux, 1, asi_ptp_in,              misc_in[1],            tlb_cam_reg[1],   			/* Software map */           not_hld_cam_l)
    function [1:1] asi_ptp_mux ;
        input [1:1] in0_fn ;
        input [1:1] in1_fn ;
        input select_fn ;
        reg [1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
                1'b0: out_fn = in0_fn ;
                1'b1: out_fn = in1_fn ;
                default: out_fn = 65'hx;
            endcase
            asi_ptp_mux = out_fn ;
        end
    endfunction
    assign asi_ptp_in = asi_ptp_mux(             misc_in[1],            tlb_cam_reg[1],   			/* Software map */           not_hld_cam_l) ;
    // Expanded macro end.


    
    // Expanded macro begin.
    // cmux2(tlb_bits_mux,  1,  tlb_ptp_out,               mmu_ptp_in,              asi_ptp_in,               sel_mdat_mux)
    function [ 1:1] tlb_bits_mux ;
        input [ 1:1] in0_fn ;
        input [ 1:1] in1_fn ;
        input select_fn ;
        reg [ 1:1] out_fn ;
        begin
            case (select_fn) /* synopsys parallel_case */
Next1234
HierarchyFilesModulesSignalsTasksFunctionsHelp

This page: Created:Thu Aug 19 11:59:27 1999
From: ../../../sparc_v8/ssparc/mmu/dp_mmu/rtl/dp_mmu.v

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