source: XOpenSparcT1/trunk/T1-CPU/ifu/sparc_ifu_thrfsm.v @ 6

Revision 6, 7.0 KB checked in by pntsvt00, 13 years ago (diff)

versione iniziale opensparc

Line 
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T1 Processor File: sparc_ifu_thrfsm.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_ifu_swlthrfsm
24//  Description:       
25//  The switch logithrfsm contains the thread state machine. 
26*/
27
28`include "ifu.h"
29
30module sparc_ifu_thrfsm(/*AUTOARG*/
31   // Outputs
32   so, thr_state, 
33   // Inputs
34   completion, schedule, spec_ld, ldhit, stall, int_activate, 
35   start_thread, thaw_thread, nuke_thread, rst_thread, switch_out, 
36   halt_thread, sw_cond, clk, se, si, reset
37   );
38
39   // thread specific input
40   input  completion,   // the op this thread was waiting for is complete
41                schedule,     // this thread was just switched in
42                spec_ld,      // speculative switch in
43                ldhit,        // speculation was correct
44                stall,        // stall thread for ldmiss, imiss or trap
45                int_activate, // activate this thread
46          halt_thread,
47                start_thread,    // wake up this thread from dead state
48                nuke_thread,
49          thaw_thread,
50                rst_thread;      // reset this thread
51
52   // common inputs
53   input  switch_out,   // this thread was just switched out
54                sw_cond;        // wait until completion signal is received
55
56   input       clk, se, si, reset;
57
58   output      so;
59
60   output [4:0] thr_state;
61
62   // local signals
63   reg [4:0]    next_state;
64   
65   //
66   // Code Begins Here
67   //
68   
69//   assign       spec_rdy     = thr_state[`TCR_READY];
70
71   always @ (/*AUTOSENSE*/ completion
72             or halt_thread or int_activate or ldhit or nuke_thread
73             or rst_thread or schedule or spec_ld or stall
74             or start_thread or sw_cond or switch_out or thaw_thread
75             or thr_state)
76     begin
77              case (thr_state[4:0])
78          `THRFSM_IDLE:  // 5'b00000
79                  begin
80                     if (rst_thread | thaw_thread)
81                             next_state = `THRFSM_WAIT;
82                     else if (start_thread)   
83                             next_state = `THRFSM_RDY;
84                     else  // all other interrupts ignored
85                             next_state = thr_state[4:0];
86                  end
87
88                `THRFSM_HALT:  // 5'b00010
89                  begin
90                     if (nuke_thread)
91                             next_state = `THRFSM_IDLE;
92                     else if (rst_thread | thaw_thread)
93                             next_state = `THRFSM_WAIT;
94                     else if (int_activate | start_thread) 
95                             next_state = `THRFSM_RDY;
96                     else
97                             next_state = thr_state[4:0];
98                  end
99               
100                `THRFSM_RDY:       // 5'b11001
101                  begin
102                     if (stall)     
103                             // trap also kills inst_s2 and nir
104                             // Ldmiss should not happen in this state
105                             next_state = `THRFSM_WAIT;
106                     else if (schedule)
107                             next_state = `THRFSM_RUN;
108                     else
109                             next_state = thr_state[4:0];
110                  end // case: `THRFSM_RDY
111
112                `THRFSM_RUN:       // 5'b00101
113                  begin
114                     if (stall | sw_cond)
115                             // trap also kills inst_s2 and nir
116                             // ldmiss should not happen in this state           
117                             next_state = `THRFSM_WAIT;
118                     else if (switch_out)
119                       // on an interrupt or thread stall, the fcl has to
120                       // switch out the thread and inform the fsm
121                             next_state = `THRFSM_RDY;
122                     else
123                             next_state = thr_state[4:0];
124                  end // case: `THRFSM_RUN
125
126                `THRFSM_WAIT:       // 5'b00001
127                  begin
128                     if (nuke_thread) 
129                             next_state = `THRFSM_IDLE;
130                     else if (halt_thread) // exclusive with above
131                             next_state = `THRFSM_HALT;
132                     else if (stall) // excl. with above
133                             next_state = `THRFSM_WAIT;
134                     else if (spec_ld) // exclusive with above
135                             next_state = `THRFSM_SPEC_RDY;
136                     else if (completion & ~halt_thread)
137                             next_state = `THRFSM_RDY;
138                     else
139                             next_state = thr_state[4:0];
140                  end // case: `THRFSM_WAIT
141               
142                `THRFSM_SPEC_RDY:       // 5'b10011
143                  begin
144                     if (stall)
145                             next_state = `THRFSM_WAIT;
146                     else if (schedule & ~ldhit) // exclusive
147                             next_state = `THRFSM_SPEC_RUN;
148                     else if (schedule & ldhit)  // exclusive
149                             next_state = `THRFSM_RUN;
150                     else if (ldhit)
151                             next_state = `THRFSM_RDY;
152                     else
153                             next_state = thr_state[4:0];
154                  end // case: `THRFSM_SPEC_RDY
155
156                `THRFSM_SPEC_RUN:       // 5'b00111
157                  begin
158                     if (stall | sw_cond)
159                             next_state = `THRFSM_WAIT;
160                     else if ((ldhit) & switch_out)
161                             next_state = `THRFSM_RDY;
162                     else if ((ldhit) & ~switch_out)
163                             next_state = `THRFSM_RUN;
164                     else if (~(ldhit) & switch_out)
165                             next_state = `THRFSM_SPEC_RDY;
166                     // on an interrupt or thread stall, the fcl has to
167                     // switch out the thread and inform the fsm
168                     else
169                             next_state = thr_state[4:0];
170                  end // case: `THRFSM_SPEC_RUN
171
172//VCS coverage off
173                default:
174                  begin
175               // synopsys translate_off
176                     // 0in <fire -message "thrfsm.v: Error! Invalid State"
177`ifdef DEFINE_0IN
178`else           
179                `ifdef MODELSIM
180                     $display("ILLEGAL_THR_STATE", "thrfsm.v: Error! Invalid State %b\n", thr_state);
181                `else
182                     $error("ILLEGAL_THR_STATE", "thrfsm.v: Error! Invalid State %b\n", thr_state);
183                `endif           
184`endif               
185               // synopsys translate_on
186                     if (rst_thread)
187                             next_state = `THRFSM_WAIT;
188                     else if (nuke_thread)
189                             next_state = `THRFSM_IDLE;         
190                     else 
191                             next_state = thr_state[4:0];
192                  end
193//VCS coverage on
194              endcase // casex({thr_state[4:0]})
195     end // always @ (...
196
197   // thread config register (tcr)
198   dffr_s #(5) tcr(.din  (next_state),
199                     .clk  (clk),
200                     .q    (thr_state),
201                     .rst  (reset),
202                     .se   (se), .so(), .si());
203
204
205endmodule
Note: See TracBrowser for help on using the repository browser.