// ========== Copyright Header Begin ========================================== // // OpenSPARC T1 Processor File: ucb_bus_out.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 ============================================ //////////////////////////////////////////////////////////////////////// /* // Module Name: ucb_bus_out (ucb bus outbound interface block) // Description: This interface block is instantiated by the // UCB modules and IO Bridge to transmit packets // on the UCB bus. */ //////////////////////////////////////////////////////////////////////// // Global header file includes //////////////////////////////////////////////////////////////////////// `include "sys.h" // system level definition file which // contains the time scale definition //////////////////////////////////////////////////////////////////////// // Local header file includes / local defines //////////////////////////////////////////////////////////////////////// module ucb_bus_out (/*AUTOARG*/ // Outputs vld, data, outdata_buf_busy, // Inputs clk, rst_l, stall, outdata_buf_in, outdata_vec_in, outdata_buf_wr ); // synopsys template parameter UCB_BUS_WIDTH = 32; parameter REG_WIDTH = 64; // maximum data bits that needs to // be sent. Set to 64 or 128 // Globals input clk; input rst_l; // UCB bus interface output vld; output [UCB_BUS_WIDTH-1:0] data; input stall; // Local interface output outdata_buf_busy; input [REG_WIDTH+63:0] outdata_buf_in; input [(REG_WIDTH+64)/UCB_BUS_WIDTH-1:0] outdata_vec_in; input outdata_buf_wr; // Local signals wire stall_d1; wire [(REG_WIDTH+64)/UCB_BUS_WIDTH-1:0] outdata_vec; wire [(REG_WIDTH+64)/UCB_BUS_WIDTH-1:0] outdata_vec_next; wire [REG_WIDTH+63:0] outdata_buf; wire [REG_WIDTH+63:0] outdata_buf_next; wire load_outdata; wire shift_outdata; //////////////////////////////////////////////////////////////////////// // Code starts here //////////////////////////////////////////////////////////////////////// /************************************************************ * UCB bus interface flops ************************************************************/ assign vld = outdata_vec[0]; assign data = outdata_buf[UCB_BUS_WIDTH-1:0]; dffrl_ns #(1) stall_d1_ff (.din(stall), .clk(clk), .rst_l(rst_l), .q(stall_d1)); /************************************************************ * Outbound Data ************************************************************/ // accept new data only if there is none being processed assign load_outdata = outdata_buf_wr & ~outdata_buf_busy; assign outdata_buf_busy = outdata_vec[0] | stall_d1; assign shift_outdata = outdata_vec[0] & ~stall_d1; assign outdata_vec_next = load_outdata ? outdata_vec_in: shift_outdata ? outdata_vec >> 1: outdata_vec; dffrl_ns #((REG_WIDTH+64)/UCB_BUS_WIDTH) outdata_vec_ff (.din(outdata_vec_next), .clk(clk), .rst_l(rst_l), .q(outdata_vec)); assign outdata_buf_next = load_outdata ? outdata_buf_in: shift_outdata ? (outdata_buf >> UCB_BUS_WIDTH): outdata_buf; dff_ns #(REG_WIDTH+64) outdata_buf_ff (.din(outdata_buf_next), .clk(clk), .q(outdata_buf)); endmodule // ucb_bus_out