OpenCores
URL https://opencores.org/ocsvn/sparc64soc/sparc64soc/trunk

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [T1-CPU/] [exu/] [sparc_exu_aluaddsub.v] - Blame information for rev 7

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
// ========== Copyright Header Begin ==========================================
2
// 
3
// OpenSPARC T1 Processor File: sparc_exu_aluaddsub.v
4
// Copyright (c) 2006 Sun Microsystems, Inc.  All Rights Reserved.
5
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6
// 
7
// The above named program is free software; you can redistribute it and/or
8
// modify it under the terms of the GNU General Public
9
// License version 2 as published by the Free Software Foundation.
10
// 
11
// The above named program is distributed in the hope that it will be 
12
// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
// General Public License for more details.
15
// 
16
// You should have received a copy of the GNU General Public
17
// License along with this work; if not, write to the Free Software
18
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19
// 
20
// ========== Copyright Header End ============================================
21
////////////////////////////////////////////////////////////////////////
22
/*
23
//  Module Name: sparc_exu_aluaddsub
24
//      Description:            This block implements addition and subtraction.
25
//            It takes two operands, a carry_in, plus two control signals
26
//            (subtract and use_cin).  If subtract is high, then rs2_data
27
//            is subtracted from rs1_data.  If use_cin is high, then
28
//            carry_in is added to the sum (addition) or subtracted from
29
//            the result (subtraction).  It outputs the result of the
30
//            specified operation.  To keep the cin calculation from
31
//            being in the critical path, it is moved into the d-stage.
32
//            All other calculations are in the e-stage.
33
*/
34
 
35
module sparc_exu_aluaddsub
36
  (/*AUTOARG*/
37
   // Outputs
38
   adder_out, spr_out, alu_ecl_cout64_e_l, alu_ecl_cout32_e,
39
   alu_ecl_adderin2_63_e, alu_ecl_adderin2_31_e,
40
   // Inputs
41
   clk, se, byp_alu_rs1_data_e, byp_alu_rs2_data_e, ecl_alu_cin_e,
42
   ifu_exu_invert_d
43
   );
44
   input clk;
45
   input se;
46
   input [63:0] byp_alu_rs1_data_e;   // 1st input operand
47
   input [63:0]  byp_alu_rs2_data_e;   // 2nd input operand
48
   input         ecl_alu_cin_e;           // carry in
49
   input         ifu_exu_invert_d;     // subtract used by adder
50
 
51
   output [63:0] adder_out; // result of adder
52
   output [63:0] spr_out;   // result of sum predict
53
   output         alu_ecl_cout64_e_l;
54
   output         alu_ecl_cout32_e;
55
   output       alu_ecl_adderin2_63_e;
56
   output       alu_ecl_adderin2_31_e;
57
 
58
   wire [63:0]  rs2_data;       // 2nd input to adder
59
   wire [63:0]  rs1_data;       // 1st input to adder
60
   wire [63:0]  subtract_d;
61
   wire [63:0]  subtract_e;
62
   wire         cout64_e;
63
 
64
////////////////////////////////////////////
65
//  Module implementation
66
////////////////////////////////////////////
67
   assign       subtract_d[63:0] = {64{ifu_exu_invert_d}};
68
   dff_s #(64) sub_dff(.din(subtract_d[63:0]), .clk(clk), .q(subtract_e[63:0]), .se(se),
69
                     .si(), .so());
70
 
71
   assign       rs1_data[63:0] = byp_alu_rs1_data_e[63:0];
72
 
73
   assign       rs2_data[63:0] = byp_alu_rs2_data_e[63:0] ^ subtract_e[63:0];
74
 
75
   assign      alu_ecl_adderin2_63_e = rs2_data[63];
76
   assign      alu_ecl_adderin2_31_e = rs2_data[31];
77
   sparc_exu_aluadder64 adder(.rs1_data(rs1_data[63:0]), .rs2_data(rs2_data[63:0]),
78
                              .cin(ecl_alu_cin_e), .adder_out(adder_out[63:0]),
79
                              .cout32(alu_ecl_cout32_e), .cout64(cout64_e));
80
   assign      alu_ecl_cout64_e_l = ~cout64_e;
81
 
82
 
83
   // sum predict
84
   sparc_exu_aluspr spr(.rs1_data(rs1_data[63:0]), .rs2_data(rs2_data[63:0]), .cin(ecl_alu_cin_e),
85
                        .spr_out(spr_out[63:0]));
86
 
87
endmodule // sparc_exu_aluaddsub
88
 
89
 
90
 
91
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.