blob: 05dfd98d9a199c7d25889f8d8a07fb01d47e7a2b [file] [log] [blame]
// ========== Copyright Header Begin ==========================================
//
// OpenSPARC T1 Processor File: ctu_clsp_clkgn_clksel.v
// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
//
// The above named program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License version 2 as published by the Free Software Foundation.
//
// The above named program is distributed in the hope that it will be
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this work; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
// ========== Copyright Header End ============================================
//
// Cluster Name: CTU
// Unit Name: ctu_clsp_clkgn_clksel
//
//-----------------------------------------------------------------------------
`include "sys.h"
module ctu_clsp_clkgn_clksel(/*AUTOARG*/
// Outputs
clkout, sysclk_sel,
// Inputs
io_pwron_rst_l, sel, testmode_l, sysclk, divbypclk, byp_mult_sel_l,
nstepsel, jtag_clock_dr, capture_l, bypmode
);
input io_pwron_rst_l;
input [2:0] sel;
input testmode_l;
input sysclk;
input divbypclk;
input byp_mult_sel_l;
input nstepsel;
input jtag_clock_dr;
input capture_l;
input bypmode;
output clkout;
output sysclk_sel;
wire force_altclk_l;
wire altclk_sync_l;
wire tck_sync;
wire bypclk_sync_pre;
wire bypclk_sync;
wire tck_sync_pre;
wire force_alt_clk_sync;
wire mult_sel;
wire nstep_clock_dr;
wire clock_dr;
wire altclk_sync_l_bar;
wire sysclk_sel_bar;
// -----------------------------------------------
//
// N-step and jtag_clock_dr mode
// When dft_clsp_capture_l is asserted, nstep goes through,
// otherwise jtag_clock_dr goes through.
// jtag_clock_dr can be dft_jtag_clock_dr (from dft) or j_clk/io_tck2
// if dft_clsp_parallel_scan is asserted
//
// -----------------------------------------------
// Clock gating
// capture cycle:
// capture_l is low, let nstep clock through
// assign nstep_clock_dr = jtag_clock_dr & capture_l;
// capture_l changes value on neg edge of tck
ctu_and2 u_capture_l_gated (.a (jtag_clock_dr), .b(capture_l), .z(nstep_clock_dr));
// nstep_clock_dr is undefined in ctu pin base parallel scan mode
ctu_mux21 u_jtag_clock_mux_gated( .z(clock_dr), .s(testmode_l), .d0(jtag_clock_dr),
.d1(nstep_clock_dr));
// Work around Reading macro
ctu_clksel_async_synchronizer u_mult_sel_clk(
.presyncdata(mult_sel),
.syncdata (force_alt_clk_sync),
.arst_l(io_pwron_rst_l),
.aset_l(1'b1),
.clk (sysclk)
);
ctu_clksel_async_synchronizer u_byp_mult_sel_sync(
.presyncdata(altclk_sync_pre),
.syncdata (altclk_sync_l),
.arst_l(io_pwron_rst_l),
.aset_l(1'b1),
.clk (divbypclk)
);
ctu_clksel_async_synchronizer u_bypclk_sync(
.presyncdata(bypclk_sync_pre),
.syncdata (bypclk_sync),
.aset_l(io_pwron_rst_l),
.arst_l(1'b1),
.clk(divbypclk)
);
ctu_clksel_async_synchronizer u_tck_sync(
.presyncdata(tck_sync_pre),
.syncdata (tck_sync),
.arst_l(io_pwron_rst_l),
.aset_l(1'b1),
.clk(jtag_clock_dr)
);
assign mult_sel = bypmode | nstepsel;
assign force_altclk_l = sel[0];
assign altclk_sync_pre = byp_mult_sel_l;
assign bypclk_sync_pre = sel[2] ;
assign tck_sync_pre = sel[1];
bw_u1_aoi22_4x u_clkout_gated ( .a1(bypclk_sync), .a2(divbypclk),
.b1(tck_sync),.b2(clock_dr), .z(clkout));
ctu_inv u_altclk_sync_l_gated (.z(altclk_sync_l_bar), .a(altclk_sync_l));
bw_u1_oai21_4x u_sysclk_sel_bar_gated (.a (altclk_sync_l_bar),
.b1 (force_altclk_l),
.b2 (force_alt_clk_sync),
.z (sysclk_sel_bar));
ctu_inv u_sysclk_sel_gated (.z(sysclk_sel), .a(sysclk_sel_bar));
endmodule
// Local Variables:
// verilog-library-directories:("." "../../common/rtl")
// verilog-library-files: ("../../common/rtl/swrvr_clib.v")
// verilog-auto-sense-defines-constant:t
// End: