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

Subversion Repositories mips32r1

[/] [mips32r1/] [trunk/] [Hardware/] [MIPS32_Standalone/] [MIPS_Parameters.v] - Blame information for rev 10

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

Line No. Rev Author Line
1 3 ayersg
/*
2
 * File         : MIPS_Parameters.v
3
 * Project      : University of Utah, XUM Project MIPS32 core
4
 * Creator(s)   : Grant Ayers (ayers@cs.utah.edu)
5
 *
6
 * Modification History:
7
 *   Rev   Date         Initials  Description of Change
8
 *   1.0   26-May-2012  GEA       Release version.
9
 *
10
 * Standards/Formatting:
11
 *   Verilog 2001, 4 soft tab, wide column.
12
 *
13
 * Description:
14
 *   Provides a language abstraction for the MIPS32-specific op-codes and
15
 *   the processor-specific datapath, hazard, and exception bits which
16
 *   control the processor. These parameter names are used extensively
17
 *   throughout the processor HDL modules.
18
 */
19
 
20
 
21
/*** Exception Vector Locations ***
22
 
23
     When the CPU powers up or is reset, it will begin execution at 'EXC_Vector_Base_Reset'.
24
     All other exceptions are the sum of a base address and offset:
25
      - The base address is either a bootstrap or normal value. It is controlled by
26
        the 'BEV' bit in the CP0 'Status' register. Both base addresses can be mapped to
27
        the same location.
28
      - The offset address is either a standard offset (which is always used for
29
        non-interrupt general exceptions in this processor because it lacks TLB Refill
30
        and Cache errors), or a special interrupt-only offset for interrupts, which is
31
        enabled with the 'IV' bit in the CP0 'Cause' register.
32
 
33
     Current Setup:
34
        General exceptions go to 0x0. Interrupts go to 0x8. Booting starts at 0x10.
35
*/
36
parameter [31:0] EXC_Vector_Base_Reset          = 32'h0000_0010;    // MIPS Standard is 0xBFC0_0000
37
parameter [31:0] EXC_Vector_Base_Other_NoBoot   = 32'h0000_0000;    // MIPS Standard is 0x8000_0000
38
parameter [31:0] EXC_Vector_Base_Other_Boot     = 32'h0000_0000;    // MIPS Standard is 0xBFC0_0200
39
parameter [31:0] EXC_Vector_Offset_General      = 32'h0000_0000;    // MIPS Standard is 0x0000_0180
40
parameter [31:0] EXC_Vector_Offset_Special      = 32'h0000_0008;    // MIPS Standard is 0x0000_0200
41
 
42
 
43
 
44
/*** Kernel/User Memory Areas ***
45
 
46
     Kernel memory starts at address 0x0. User memory starts at 'UMem_Lower' and extends to
47
     the end of the address space.
48
 
49
     A distinction is made to protect against accesses to kernel memory while the processor
50
     is in user mode. Lacking MMU hardware, these addresses are physical, not virtual.
51
     This simple two-part division of the address space can be extended almost arbitrarily
52
     in the Data Memory Controller. Note that there is currently no user/kernel space check
53
     for the Instruction Memory, because it is assumed that instructions are in the kernel space.
54
*/
55
parameter [31:0] UMem_Lower = 32'h08000000;
56
 
57
 
58
 
59
/*** Processor Endianness ***
60
 
61 9 ayersg
     The MIPS Configuration Register (CP0 Register 16 Select 0) specifies the processor's
62
     endianness. A processor in user mode may switch to reverse endianness, which will be
63
     the opposite of this parameter.
64 3 ayersg
*/
65 9 ayersg
parameter Big_Endian = 1;
66 3 ayersg
 
67
 
68
 
69
/*** Encodings for MIPS32 Release 1 Architecture ***/
70
 
71
 
72
/* Op Code Categories */
73
parameter [5:0] Op_Type_R   = 6'b00_0000;  // Standard R-Type instructions
74
parameter [5:0] Op_Type_R2  = 6'b01_1100;  // Extended R-Like instructions
75
parameter [5:0] Op_Type_BI  = 6'b00_0001;  // Branch/Trap extended instructions
76
parameter [5:0] Op_Type_CP0 = 6'b01_0000;  // Coprocessor 0 instructions
77
parameter [5:0] Op_Type_CP1 = 6'b01_0001;  // Coprocessor 1 instructions (not implemented)
78
parameter [5:0] Op_Type_CP2 = 6'b01_0010;  // Coprocessor 2 instructions (not implemented)
79
parameter [5:0] Op_Type_CP3 = 6'b01_0011;  // Coprocessor 3 instructions (not implemented)
80
// --------------------------------------
81
parameter [5:0] Op_Add      = Op_Type_R;
82
parameter [5:0] Op_Addi     = 6'b00_1000;
83
parameter [5:0] Op_Addiu    = 6'b00_1001;
84
parameter [5:0] Op_Addu     = Op_Type_R;
85
parameter [5:0] Op_And      = Op_Type_R;
86
parameter [5:0] Op_Andi     = 6'b00_1100;
87
parameter [5:0] Op_Beq      = 6'b00_0100;
88
parameter [5:0] Op_Bgez     = Op_Type_BI;
89
parameter [5:0] Op_Bgezal   = Op_Type_BI;
90
parameter [5:0] Op_Bgtz     = 6'b00_0111;
91
parameter [5:0] Op_Blez     = 6'b00_0110;
92
parameter [5:0] Op_Bltz     = Op_Type_BI;
93
parameter [5:0] Op_Bltzal   = Op_Type_BI;
94
parameter [5:0] Op_Bne      = 6'b00_0101;
95
parameter [5:0] Op_Break    = Op_Type_R;
96
parameter [5:0] Op_Clo      = Op_Type_R2;
97
parameter [5:0] Op_Clz      = Op_Type_R2;
98
parameter [5:0] Op_Div      = Op_Type_R;
99
parameter [5:0] Op_Divu     = Op_Type_R;
100
parameter [5:0] Op_Eret     = Op_Type_CP0;
101
parameter [5:0] Op_J        = 6'b00_0010;
102
parameter [5:0] Op_Jal      = 6'b00_0011;
103
parameter [5:0] Op_Jalr     = Op_Type_R;
104
parameter [5:0] Op_Jr       = Op_Type_R;
105
parameter [5:0] Op_Lb       = 6'b10_0000;
106
parameter [5:0] Op_Lbu      = 6'b10_0100;
107
parameter [5:0] Op_Lh       = 6'b10_0001;
108
parameter [5:0] Op_Lhu      = 6'b10_0101;
109
parameter [5:0] Op_Ll       = 6'b11_0000;
110
parameter [5:0] Op_Lui      = 6'b00_1111;
111
parameter [5:0] Op_Lw       = 6'b10_0011;
112
parameter [5:0] Op_Lwl      = 6'b10_0010;
113
parameter [5:0] Op_Lwr      = 6'b10_0110;
114
parameter [5:0] Op_Madd     = Op_Type_R2;
115
parameter [5:0] Op_Maddu    = Op_Type_R2;
116
parameter [5:0] Op_Mfc0     = Op_Type_CP0;
117
parameter [5:0] Op_Mfhi     = Op_Type_R;
118
parameter [5:0] Op_Mflo     = Op_Type_R;
119
parameter [5:0] Op_Movn     = Op_Type_R;
120
parameter [5:0] Op_Movz     = Op_Type_R;
121
parameter [5:0] Op_Msub     = Op_Type_R2;
122
parameter [5:0] Op_Msubu    = Op_Type_R2;
123
parameter [5:0] Op_Mtc0     = Op_Type_CP0;
124
parameter [5:0] Op_Mthi     = Op_Type_R;
125
parameter [5:0] Op_Mtlo     = Op_Type_R;
126
parameter [5:0] Op_Mul      = Op_Type_R2;
127
parameter [5:0] Op_Mult     = Op_Type_R;
128
parameter [5:0] Op_Multu    = Op_Type_R;
129
parameter [5:0] Op_Nor      = Op_Type_R;
130
parameter [5:0] Op_Or       = Op_Type_R;
131
parameter [5:0] Op_Ori      = 6'b00_1101;
132
parameter [5:0] Op_Pref     = 6'b11_0011; // Prefetch does nothing in this implementation.
133
parameter [5:0] Op_Sb       = 6'b10_1000;
134
parameter [5:0] Op_Sc       = 6'b11_1000;
135
parameter [5:0] Op_Sh       = 6'b10_1001;
136
parameter [5:0] Op_Sll      = Op_Type_R;
137
parameter [5:0] Op_Sllv     = Op_Type_R;
138
parameter [5:0] Op_Slt      = Op_Type_R;
139
parameter [5:0] Op_Slti     = 6'b00_1010;
140
parameter [5:0] Op_Sltiu    = 6'b00_1011;
141
parameter [5:0] Op_Sltu     = Op_Type_R;
142
parameter [5:0] Op_Sra      = Op_Type_R;
143
parameter [5:0] Op_Srav     = Op_Type_R;
144
parameter [5:0] Op_Srl      = Op_Type_R;
145
parameter [5:0] Op_Srlv     = Op_Type_R;
146
parameter [5:0] Op_Sub      = Op_Type_R;
147
parameter [5:0] Op_Subu     = Op_Type_R;
148
parameter [5:0] Op_Sw       = 6'b10_1011;
149
parameter [5:0] Op_Swl      = 6'b10_1010;
150
parameter [5:0] Op_Swr      = 6'b10_1110;
151
parameter [5:0] Op_Syscall  = Op_Type_R;
152
parameter [5:0] Op_Teq      = Op_Type_R;
153
parameter [5:0] Op_Teqi     = Op_Type_BI;
154
parameter [5:0] Op_Tge      = Op_Type_R;
155
parameter [5:0] Op_Tgei     = Op_Type_BI;
156
parameter [5:0] Op_Tgeiu    = Op_Type_BI;
157
parameter [5:0] Op_Tgeu     = Op_Type_R;
158
parameter [5:0] Op_Tlt      = Op_Type_R;
159
parameter [5:0] Op_Tlti     = Op_Type_BI;
160
parameter [5:0] Op_Tltiu    = Op_Type_BI;
161
parameter [5:0] Op_Tltu     = Op_Type_R;
162
parameter [5:0] Op_Tne      = Op_Type_R;
163
parameter [5:0] Op_Tnei     = Op_Type_BI;
164
parameter [5:0] Op_Xor      = Op_Type_R;
165
parameter [5:0] Op_Xori     = 6'b00_1110;
166
 
167
/* Op Code Rt fields for Branches & Traps */
168
parameter [4:0] OpRt_Bgez   = 5'b00001;
169
parameter [4:0] OpRt_Bgezal = 5'b10001;
170
parameter [4:0] OpRt_Bltz   = 5'b00000;
171
parameter [4:0] OpRt_Bltzal = 5'b10000;
172
parameter [4:0] OpRt_Teqi   = 5'b01100;
173
parameter [4:0] OpRt_Tgei   = 5'b01000;
174
parameter [4:0] OpRt_Tgeiu  = 5'b01001;
175
parameter [4:0] OpRt_Tlti   = 5'b01010;
176
parameter [4:0] OpRt_Tltiu  = 5'b01011;
177
parameter [4:0] OpRt_Tnei   = 5'b01110;
178
 
179
/* Op Code Rs fields for Coprocessors */
180
parameter [4:0] OpRs_MF     = 5'b00000;
181
parameter [4:0] OpRs_MT     = 5'b00100;
182
 
183
/* Special handling for ERET */
184
parameter [4:0] OpRs_ERET   = 5'b10000;
185
parameter [5:0] Funct_ERET  = 6'b011000;
186
 
187
/* Function Codes for R-Type Op Codes */
188
parameter [5:0] Funct_Add     = 6'b10_0000;
189
parameter [5:0] Funct_Addu    = 6'b10_0001;
190
parameter [5:0] Funct_And     = 6'b10_0100;
191
parameter [5:0] Funct_Break   = 6'b00_1101;
192
parameter [5:0] Funct_Clo     = 6'b10_0001; // same as Addu
193
parameter [5:0] Funct_Clz     = 6'b10_0000; // same as Add
194
parameter [5:0] Funct_Div     = 6'b01_1010;
195
parameter [5:0] Funct_Divu    = 6'b01_1011;
196
parameter [5:0] Funct_Jr      = 6'b00_1000;
197
parameter [5:0] Funct_Jalr    = 6'b00_1001;
198
parameter [5:0] Funct_Madd    = 6'b00_0000;
199
parameter [5:0] Funct_Maddu   = 6'b00_0001;
200
parameter [5:0] Funct_Mfhi    = 6'b01_0000;
201
parameter [5:0] Funct_Mflo    = 6'b01_0010;
202
parameter [5:0] Funct_Movn    = 6'b00_1011;
203
parameter [5:0] Funct_Movz    = 6'b00_1010;
204
parameter [5:0] Funct_Msub    = 6'b00_0100; // same as Sllv
205
parameter [5:0] Funct_Msubu   = 6'b00_0101;
206
parameter [5:0] Funct_Mthi    = 6'b01_0001;
207
parameter [5:0] Funct_Mtlo    = 6'b01_0011;
208
parameter [5:0] Funct_Mul     = 6'b00_0010; // same as Srl
209
parameter [5:0] Funct_Mult    = 6'b01_1000;
210
parameter [5:0] Funct_Multu   = 6'b01_1001;
211
parameter [5:0] Funct_Nor     = 6'b10_0111;
212
parameter [5:0] Funct_Or      = 6'b10_0101;
213
parameter [5:0] Funct_Sll     = 6'b00_0000;
214
parameter [5:0] Funct_Sllv    = 6'b00_0100;
215
parameter [5:0] Funct_Slt     = 6'b10_1010;
216
parameter [5:0] Funct_Sltu    = 6'b10_1011;
217
parameter [5:0] Funct_Sra     = 6'b00_0011;
218
parameter [5:0] Funct_Srav    = 6'b00_0111;
219
parameter [5:0] Funct_Srl     = 6'b00_0010;
220
parameter [5:0] Funct_Srlv    = 6'b00_0110;
221
parameter [5:0] Funct_Sub     = 6'b10_0010;
222
parameter [5:0] Funct_Subu    = 6'b10_0011;
223
parameter [5:0] Funct_Syscall = 6'b00_1100;
224
parameter [5:0] Funct_Teq     = 6'b11_0100;
225
parameter [5:0] Funct_Tge     = 6'b11_0000;
226
parameter [5:0] Funct_Tgeu    = 6'b11_0001;
227
parameter [5:0] Funct_Tlt     = 6'b11_0010;
228
parameter [5:0] Funct_Tltu    = 6'b11_0011;
229
parameter [5:0] Funct_Tne     = 6'b11_0110;
230
parameter [5:0] Funct_Xor     = 6'b10_0110;
231
 
232
/* ALU Operations (Implementation) */
233
parameter [4:0] AluOp_Add    = 5'd1;
234
parameter [4:0] AluOp_Addu   = 5'd0;
235
parameter [4:0] AluOp_And    = 5'd2;
236
parameter [4:0] AluOp_Clo    = 5'd3;
237
parameter [4:0] AluOp_Clz    = 5'd4;
238
parameter [4:0] AluOp_Div    = 5'd5;
239
parameter [4:0] AluOp_Divu   = 5'd6;
240
parameter [4:0] AluOp_Madd   = 5'd7;
241
parameter [4:0] AluOp_Maddu  = 5'd8;
242
parameter [4:0] AluOp_Mfhi   = 5'd9;
243
parameter [4:0] AluOp_Mflo   = 5'd10;
244
parameter [4:0] AluOp_Msub   = 5'd13;
245
parameter [4:0] AluOp_Msubu  = 5'd14;
246
parameter [4:0] AluOp_Mthi   = 5'd11;
247
parameter [4:0] AluOp_Mtlo   = 5'd12;
248
parameter [4:0] AluOp_Mul    = 5'd15;
249
parameter [4:0] AluOp_Mult   = 5'd16;
250
parameter [4:0] AluOp_Multu  = 5'd17;
251
parameter [4:0] AluOp_Nor    = 5'd18;
252
parameter [4:0] AluOp_Or     = 5'd19;
253
parameter [4:0] AluOp_Sll    = 5'd20;
254
parameter [4:0] AluOp_Sllc   = 5'd21;  // Move this if another AluOp is needed
255
parameter [4:0] AluOp_Sllv   = 5'd22;
256
parameter [4:0] AluOp_Slt    = 5'd23;
257
parameter [4:0] AluOp_Sltu   = 5'd24;
258
parameter [4:0] AluOp_Sra    = 5'd25;
259
parameter [4:0] AluOp_Srav   = 5'd26;
260
parameter [4:0] AluOp_Srl    = 5'd27;
261
parameter [4:0] AluOp_Srlv   = 5'd28;
262
parameter [4:0] AluOp_Sub    = 5'd29;
263
parameter [4:0] AluOp_Subu   = 5'd30;
264
parameter [4:0] AluOp_Xor    = 5'd31;
265
 
266
 
267
// Movc:10->11, Trap:9->10, TrapCond:8->9, RegDst:7->8
268
 
269
/*** Datapath ***
270
 
271
     All Signals are Active High. Branching and Jump signals (determined by "PCSrc"),
272
     as well as ALU operation signals ("ALUOp") are handled by the controller and are not found here.
273
 
274
     Bit  Name          Description
275
     ------------------------------
276
     15:  PCSrc         (Instruction Type)
277
     14:                   11: Instruction is Jump to Register
278
                           10: Instruction is Branch
279
                           01: Instruction is Jump to Immediate
280
                           00: Instruction does not branch nor jump
281
     13:  Link          (Link on Branch/Jump)
282
     ------------------------------
283
     12:  ALUSrc        (ALU Source) [0=ALU input B is 2nd register file output; 1=Immediate value]
284
     11:  Movc          (Conditional Move)
285
     10:  Trap          (Trap Instruction)
286
     9 :  TrapCond      (Trap Condition) [0=ALU result is 0; 1=ALU result is not 0]
287
     8 :  RegDst        (Register File Target) [0=Rt field; 1=Rd field]
288
     ------------------------------
289
     7 :  LLSC          (Load Linked or Store Conditional)
290
     6 :  MemRead       (Data Memory Read)
291
     5 :  MemWrite      (Data Memory Write)
292
     4 :  MemHalf       (Half Word Memory Access)
293
     3 :  MemByte       (Byte size Memory Access)
294
     2 :  MemSignExtend (Sign Extend Read Memory) [0=Zero Extend; 1=Sign Extend]
295
     ------------------------------
296
     1 :  RegWrite      (Register File Write)
297
 
298
     ------------------------------
299
*/
300
parameter [15:0] DP_None        = 16'b000_00000_000000_00;    // Instructions which require nothing of the main datapath.
301
parameter [15:0] DP_RType       = 16'b000_00001_000000_10;    // Standard R-Type
302
parameter [15:0] DP_IType       = 16'b000_10000_000000_10;    // Standard I-Type
303
parameter [15:0] DP_Branch      = 16'b100_00000_000000_00;    // Standard Branch
304
parameter [15:0] DP_BranchLink  = 16'b101_00000_000000_10;    // Branch and Link
305
parameter [15:0] DP_HiLoWr      = 16'b000_00000_000000_00;    // Write to Hi/Lo ALU register (Div,Divu,Mult,Multu,Mthi,Mtlo). Currently 'DP_None'.
306
parameter [15:0] DP_Jump        = 16'b010_00000_000000_00;    // Standard Jump
307
parameter [15:0] DP_JumpLink    = 16'b011_00000_000000_10;    // Jump and Link
308
parameter [15:0] DP_JumpLinkReg = 16'b111_00000_000000_10;    // Jump and Link Register
309
parameter [15:0] DP_JumpReg     = 16'b110_00000_000000_00;    // Jump Register
310
parameter [15:0] DP_LoadByteS   = 16'b000_10000_010011_11;    // Load Byte Signed
311
parameter [15:0] DP_LoadByteU   = 16'b000_10000_010010_11;    // Load Byte Unsigned
312
parameter [15:0] DP_LoadHalfS   = 16'b000_10000_010101_11;    // Load Half Signed
313
parameter [15:0] DP_LoadHalfU   = 16'b000_10000_010100_11;    // Load Half Unsigned
314
parameter [15:0] DP_LoadWord    = 16'b000_10000_010000_11;    // Load Word
315
parameter [15:0] DP_ExtWrRt     = 16'b000_00000_000000_10;    // A DP-external write to Rt
316
parameter [15:0] DP_ExtWrRd     = 16'b000_00001_000000_10;    // A DP-external write to Rd
317
parameter [15:0] DP_Movc        = 16'b000_01001_000000_10;    // Conditional Move
318
parameter [15:0] DP_LoadLinked  = 16'b000_10000_110000_11;    // Load Linked
319
parameter [15:0] DP_StoreCond   = 16'b000_10000_101000_11;    // Store Conditional
320
parameter [15:0] DP_StoreByte   = 16'b000_10000_001010_00;    // Store Byte
321
parameter [15:0] DP_StoreHalf   = 16'b000_10000_001100_00;    // Store Half
322
parameter [15:0] DP_StoreWord   = 16'b000_10000_001000_00;    // Store Word
323
parameter [15:0] DP_TrapRegCNZ  = 16'b000_00110_000000_00;    // Trap using Rs and Rt,  non-zero ALU (Tlt,  Tltu,  Tne)
324
parameter [15:0] DP_TrapRegCZ   = 16'b000_00100_000000_00;    // Trap using RS and Rt,  zero ALU     (Teq,  Tge,   Tgeu)
325
parameter [15:0] DP_TrapImmCNZ  = 16'b000_10110_000000_00;    // Trap using Rs and Imm, non-zero ALU (Tlti, Tltiu, Tnei)
326
parameter [15:0] DP_TrapImmCZ   = 16'b000_10100_000000_00;    // Trap using Rs and Imm, zero ALU     (Teqi, Tgei,  Tgeiu)
327
//--------------------------------------------------------
328 2 ayersg
parameter [15:0] DP_Add     = DP_RType;
329
parameter [15:0] DP_Addi    = DP_IType;
330
parameter [15:0] DP_Addiu   = DP_IType;
331
parameter [15:0] DP_Addu    = DP_RType;
332
parameter [15:0] DP_And     = DP_RType;
333
parameter [15:0] DP_Andi    = DP_IType;
334
parameter [15:0] DP_Beq     = DP_Branch;
335
parameter [15:0] DP_Bgez    = DP_Branch;
336
parameter [15:0] DP_Bgezal  = DP_BranchLink;
337
parameter [15:0] DP_Bgtz    = DP_Branch;
338
parameter [15:0] DP_Blez    = DP_Branch;
339
parameter [15:0] DP_Bltz    = DP_Branch;
340
parameter [15:0] DP_Bltzal  = DP_BranchLink;
341
parameter [15:0] DP_Bne     = DP_Branch;
342
parameter [15:0] DP_Break   = DP_None;
343
parameter [15:0] DP_Clo     = DP_RType;
344
parameter [15:0] DP_Clz     = DP_RType;
345
parameter [15:0] DP_Div     = DP_HiLoWr;
346
parameter [15:0] DP_Divu    = DP_HiLoWr;
347
parameter [15:0] DP_Eret    = DP_None;
348
parameter [15:0] DP_J       = DP_Jump;
349
parameter [15:0] DP_Jal     = DP_JumpLink;
350
parameter [15:0] DP_Jalr    = DP_JumpLinkReg;
351
parameter [15:0] DP_Jr      = DP_JumpReg;
352
parameter [15:0] DP_Lb      = DP_LoadByteS;
353
parameter [15:0] DP_Lbu     = DP_LoadByteU;
354
parameter [15:0] DP_Lh      = DP_LoadHalfS;
355
parameter [15:0] DP_Lhu     = DP_LoadHalfU;
356
parameter [15:0] DP_Ll      = DP_LoadLinked;
357
parameter [15:0] DP_Lui     = DP_IType;
358
parameter [15:0] DP_Lw      = DP_LoadWord;
359
parameter [15:0] DP_Lwl     = DP_LoadWord;
360
parameter [15:0] DP_Lwr     = DP_LoadWord;
361
parameter [15:0] DP_Madd    = DP_HiLoWr;
362
parameter [15:0] DP_Maddu   = DP_HiLoWr;
363
parameter [15:0] DP_Mfc0    = DP_ExtWrRt;
364
parameter [15:0] DP_Mfhi    = DP_ExtWrRd;
365
parameter [15:0] DP_Mflo    = DP_ExtWrRd;
366
parameter [15:0] DP_Movn    = DP_Movc;
367
parameter [15:0] DP_Movz    = DP_Movc;
368
parameter [15:0] DP_Msub    = DP_HiLoWr;
369
parameter [15:0] DP_Msubu   = DP_HiLoWr;
370
parameter [15:0] DP_Mtc0    = DP_None;
371
parameter [15:0] DP_Mthi    = DP_HiLoWr;
372
parameter [15:0] DP_Mtlo    = DP_HiLoWr;
373
parameter [15:0] DP_Mul     = DP_RType;
374
parameter [15:0] DP_Mult    = DP_HiLoWr;
375
parameter [15:0] DP_Multu   = DP_HiLoWr;
376
parameter [15:0] DP_Nor     = DP_RType;
377
parameter [15:0] DP_Or      = DP_RType;
378
parameter [15:0] DP_Ori     = DP_IType;
379
parameter [15:0] DP_Pref    = DP_None; // Not Implemented
380
parameter [15:0] DP_Sb      = DP_StoreByte;
381
parameter [15:0] DP_Sc      = DP_StoreCond;
382
parameter [15:0] DP_Sh      = DP_StoreHalf;
383
parameter [15:0] DP_Sll     = DP_RType;
384
parameter [15:0] DP_Sllv    = DP_RType;
385
parameter [15:0] DP_Slt     = DP_RType;
386
parameter [15:0] DP_Slti    = DP_IType;
387
parameter [15:0] DP_Sltiu   = DP_IType;
388
parameter [15:0] DP_Sltu    = DP_RType;
389
parameter [15:0] DP_Sra     = DP_RType;
390
parameter [15:0] DP_Srav    = DP_RType;
391
parameter [15:0] DP_Srl     = DP_RType;
392
parameter [15:0] DP_Srlv    = DP_RType;
393
parameter [15:0] DP_Sub     = DP_RType;
394
parameter [15:0] DP_Subu    = DP_RType;
395
parameter [15:0] DP_Sw      = DP_StoreWord;
396
parameter [15:0] DP_Swl     = DP_StoreWord;
397
parameter [15:0] DP_Swr     = DP_StoreWord;
398
parameter [15:0] DP_Syscall = DP_None;
399
parameter [15:0] DP_Teq     = DP_TrapRegCZ;
400
parameter [15:0] DP_Teqi    = DP_TrapImmCZ;
401
parameter [15:0] DP_Tge     = DP_TrapRegCZ;
402
parameter [15:0] DP_Tgei    = DP_TrapImmCZ;
403
parameter [15:0] DP_Tgeiu   = DP_TrapImmCZ;
404
parameter [15:0] DP_Tgeu    = DP_TrapRegCZ;
405
parameter [15:0] DP_Tlt     = DP_TrapRegCNZ;
406
parameter [15:0] DP_Tlti    = DP_TrapImmCNZ;
407
parameter [15:0] DP_Tltiu   = DP_TrapImmCNZ;
408
parameter [15:0] DP_Tltu    = DP_TrapRegCNZ;
409
parameter [15:0] DP_Tne     = DP_TrapRegCNZ;
410
parameter [15:0] DP_Tnei    = DP_TrapImmCNZ;
411
parameter [15:0] DP_Xor     = DP_RType;
412 3 ayersg
parameter [15:0] DP_Xori    = DP_IType;
413
 
414
 
415
 
416
 
417
/*** Exception Information ***
418
 
419
     All signals are Active High.
420
 
421
     Bit  Meaning
422
     ------------
423
     2:   Instruction can cause exceptions in ID
424
     1:   Instruction can cause exceptions in EX
425
     0:   Instruction can cause exceptions in MEM
426
*/
427
parameter [2:0] EXC_None = 3'b000;
428
parameter [2:0] EXC_ID   = 3'b100;
429
parameter [2:0] EXC_EX   = 3'b010;
430
parameter [2:0] EXC_MEM  = 3'b001;
431
//--------------------------------
432
parameter [2:0] EXC_Add     = EXC_EX;
433
parameter [2:0] EXC_Addi    = EXC_EX;
434
parameter [2:0] EXC_Addiu   = EXC_None;
435
parameter [2:0] EXC_Addu    = EXC_None;
436
parameter [2:0] EXC_And     = EXC_None;
437
parameter [2:0] EXC_Andi    = EXC_None;
438
parameter [2:0] EXC_Beq     = EXC_None;
439
parameter [2:0] EXC_Bgez    = EXC_None;
440
parameter [2:0] EXC_Bgezal  = EXC_None;
441
parameter [2:0] EXC_Bgtz    = EXC_None;
442
parameter [2:0] EXC_Blez    = EXC_None;
443
parameter [2:0] EXC_Bltz    = EXC_None;
444
parameter [2:0] EXC_Bltzal  = EXC_None;
445
parameter [2:0] EXC_Bne     = EXC_None;
446
parameter [2:0] EXC_Break   = EXC_ID;
447
parameter [2:0] EXC_Clo     = EXC_None;
448
parameter [2:0] EXC_Clz     = EXC_None;
449
parameter [2:0] EXC_Div     = EXC_None;
450
parameter [2:0] EXC_Divu    = EXC_None;
451
parameter [2:0] EXC_Eret    = EXC_ID;
452
parameter [2:0] EXC_J       = EXC_None;
453
parameter [2:0] EXC_Jal     = EXC_None;
454
parameter [2:0] EXC_Jalr    = EXC_None;
455
parameter [2:0] EXC_Jr      = EXC_None;
456
parameter [2:0] EXC_Lb      = EXC_MEM;
457
parameter [2:0] EXC_Lbu     = EXC_MEM;
458
parameter [2:0] EXC_Lh      = EXC_MEM;
459
parameter [2:0] EXC_Lhu     = EXC_MEM;
460
parameter [2:0] EXC_Ll      = EXC_MEM;
461
parameter [2:0] EXC_Lui     = EXC_None;
462
parameter [2:0] EXC_Lw      = EXC_MEM;
463
parameter [2:0] EXC_Lwl     = EXC_MEM;
464
parameter [2:0] EXC_Lwr     = EXC_MEM;
465
parameter [2:0] EXC_Madd    = EXC_None;
466
parameter [2:0] EXC_Maddu   = EXC_None;
467
parameter [2:0] EXC_Mfc0    = EXC_ID;
468
parameter [2:0] EXC_Mfhi    = EXC_None;
469
parameter [2:0] EXC_Mflo    = EXC_None;
470
parameter [2:0] EXC_Movn    = EXC_None;
471
parameter [2:0] EXC_Movz    = EXC_None;
472
parameter [2:0] EXC_Msub    = EXC_None;
473
parameter [2:0] EXC_Msubu   = EXC_None;
474
parameter [2:0] EXC_Mtc0    = EXC_ID;
475
parameter [2:0] EXC_Mthi    = EXC_None;
476
parameter [2:0] EXC_Mtlo    = EXC_None;
477
parameter [2:0] EXC_Mul     = EXC_None;
478
parameter [2:0] EXC_Mult    = EXC_None;
479
parameter [2:0] EXC_Multu   = EXC_None;
480
parameter [2:0] EXC_Nor     = EXC_None;
481
parameter [2:0] EXC_Or      = EXC_None;
482
parameter [2:0] EXC_Ori     = EXC_None;
483
parameter [2:0] EXC_Pref    = EXC_None; // XXX
484
parameter [2:0] EXC_Sb      = EXC_MEM;
485
parameter [2:0] EXC_Sc      = EXC_MEM;
486
parameter [2:0] EXC_Sh      = EXC_MEM;
487
parameter [2:0] EXC_Sll     = EXC_None;
488
parameter [2:0] EXC_Sllv    = EXC_None;
489
parameter [2:0] EXC_Slt     = EXC_None;
490
parameter [2:0] EXC_Slti    = EXC_None;
491
parameter [2:0] EXC_Sltiu   = EXC_None;
492
parameter [2:0] EXC_Sltu    = EXC_None;
493
parameter [2:0] EXC_Sra     = EXC_None;
494
parameter [2:0] EXC_Srav    = EXC_None;
495
parameter [2:0] EXC_Srl     = EXC_None;
496
parameter [2:0] EXC_Srlv    = EXC_None;
497
parameter [2:0] EXC_Sub     = EXC_EX;
498
parameter [2:0] EXC_Subu    = EXC_None;
499
parameter [2:0] EXC_Sw      = EXC_MEM;
500
parameter [2:0] EXC_Swl     = EXC_MEM;
501
parameter [2:0] EXC_Swr     = EXC_MEM;
502
parameter [2:0] EXC_Syscall = EXC_ID;
503
parameter [2:0] EXC_Teq     = EXC_MEM;
504
parameter [2:0] EXC_Teqi    = EXC_MEM;
505
parameter [2:0] EXC_Tge     = EXC_MEM;
506
parameter [2:0] EXC_Tgei    = EXC_MEM;
507
parameter [2:0] EXC_Tgeiu   = EXC_MEM;
508
parameter [2:0] EXC_Tgeu    = EXC_MEM;
509
parameter [2:0] EXC_Tlt     = EXC_MEM;
510
parameter [2:0] EXC_Tlti    = EXC_MEM;
511
parameter [2:0] EXC_Tltiu   = EXC_MEM;
512
parameter [2:0] EXC_Tltu    = EXC_MEM;
513
parameter [2:0] EXC_Tne     = EXC_MEM;
514
parameter [2:0] EXC_Tnei    = EXC_MEM;
515
parameter [2:0] EXC_Xor     = EXC_None;
516
parameter [2:0] EXC_Xori    = EXC_None;
517
 
518
 
519
 
520
 
521
/*** Hazard & Forwarding Datapath ***
522
 
523
     All signals are Active High.
524
 
525
     Bit  Meaning
526
     ------------
527
     7:   Wants Rs by ID
528
     6:   Needs Rs by ID
529
     5:   Wants Rt by ID
530
     4:   Needs Rt by ID
531
     3:   Wants Rs by EX
532
     2:   Needs Rs by EX
533
     1:   Wants Rt by EX
534
     0:   Needs Rt by EX
535
*/
536
parameter [7:0] HAZ_Nothing  = 8'b00000000; // Jumps, Lui, Mfhi/lo, special, etc.
537
parameter [7:0] HAZ_IDRsIDRt = 8'b11110000; // Beq, Bne, Traps
538
parameter [7:0] HAZ_IDRs     = 8'b11000000; // Most branches, Jumps to registers
539
parameter [7:0] HAZ_IDRt     = 8'b00110000; // Mtc0
540
parameter [7:0] HAZ_IDRtEXRs = 8'b10111100; // Movn, Movz
541
parameter [7:0] HAZ_EXRsEXRt = 8'b10101111; // Many R-Type ops
542
parameter [7:0] HAZ_EXRs     = 8'b10001100; // Immediates: Loads, Clo/z, Mthi/lo, etc.
543
parameter [7:0] HAZ_EXRsWRt  = 8'b10101110; // Stores
544
parameter [7:0] HAZ_EXRt     = 8'b00100011; // Shifts using Shamt field
545
//-----------------------------------------
546
parameter [7:0] HAZ_Add     = HAZ_EXRsEXRt;
547
parameter [7:0] HAZ_Addi    = HAZ_EXRs;
548
parameter [7:0] HAZ_Addiu   = HAZ_EXRs;
549
parameter [7:0] HAZ_Addu    = HAZ_EXRsEXRt;
550
parameter [7:0] HAZ_And     = HAZ_EXRsEXRt;
551
parameter [7:0] HAZ_Andi    = HAZ_EXRs;
552
parameter [7:0] HAZ_Beq     = HAZ_IDRsIDRt;
553
parameter [7:0] HAZ_Bgez    = HAZ_IDRs;
554
parameter [7:0] HAZ_Bgezal  = HAZ_IDRs;
555
parameter [7:0] HAZ_Bgtz    = HAZ_IDRs;
556
parameter [7:0] HAZ_Blez    = HAZ_IDRs;
557
parameter [7:0] HAZ_Bltz    = HAZ_IDRs;
558
parameter [7:0] HAZ_Bltzal  = HAZ_IDRs;
559
parameter [7:0] HAZ_Bne     = HAZ_IDRsIDRt;
560
parameter [7:0] HAZ_Break   = HAZ_Nothing;
561
parameter [7:0] HAZ_Clo     = HAZ_EXRs;
562
parameter [7:0] HAZ_Clz     = HAZ_EXRs;
563
parameter [7:0] HAZ_Div     = HAZ_EXRsEXRt;
564
parameter [7:0] HAZ_Divu    = HAZ_EXRsEXRt;
565
parameter [7:0] HAZ_Eret    = HAZ_Nothing;
566
parameter [7:0] HAZ_J       = HAZ_Nothing;
567
parameter [7:0] HAZ_Jal     = HAZ_Nothing;
568
parameter [7:0] HAZ_Jalr    = HAZ_IDRs;
569
parameter [7:0] HAZ_Jr      = HAZ_IDRs;
570
parameter [7:0] HAZ_Lb      = HAZ_EXRs;
571
parameter [7:0] HAZ_Lbu     = HAZ_EXRs;
572
parameter [7:0] HAZ_Lh      = HAZ_EXRs;
573
parameter [7:0] HAZ_Lhu     = HAZ_EXRs;
574
parameter [7:0] HAZ_Ll      = HAZ_EXRs;
575
parameter [7:0] HAZ_Lui     = HAZ_Nothing;
576
parameter [7:0] HAZ_Lw      = HAZ_EXRs;
577
parameter [7:0] HAZ_Lwl     = HAZ_EXRsEXRt;
578
parameter [7:0] HAZ_Lwr     = HAZ_EXRsEXRt;
579
parameter [7:0] HAZ_Madd    = HAZ_EXRsEXRt;
580
parameter [7:0] HAZ_Maddu   = HAZ_EXRsEXRt;
581
parameter [7:0] HAZ_Mfc0    = HAZ_Nothing;
582
parameter [7:0] HAZ_Mfhi    = HAZ_Nothing;
583
parameter [7:0] HAZ_Mflo    = HAZ_Nothing;
584
parameter [7:0] HAZ_Movn    = HAZ_IDRtEXRs;
585
parameter [7:0] HAZ_Movz    = HAZ_IDRtEXRs;
586
parameter [7:0] HAZ_Msub    = HAZ_EXRsEXRt;
587
parameter [7:0] HAZ_Msubu   = HAZ_EXRsEXRt;
588
parameter [7:0] HAZ_Mtc0    = HAZ_IDRt;
589
parameter [7:0] HAZ_Mthi    = HAZ_EXRs;
590
parameter [7:0] HAZ_Mtlo    = HAZ_EXRs;
591
parameter [7:0] HAZ_Mul     = HAZ_EXRsEXRt;
592
parameter [7:0] HAZ_Mult    = HAZ_EXRsEXRt;
593
parameter [7:0] HAZ_Multu   = HAZ_EXRsEXRt;
594
parameter [7:0] HAZ_Nor     = HAZ_EXRsEXRt;
595
parameter [7:0] HAZ_Or      = HAZ_EXRsEXRt;
596
parameter [7:0] HAZ_Ori     = HAZ_EXRs;
597
parameter [7:0] HAZ_Pref    = HAZ_Nothing; // XXX
598
parameter [7:0] HAZ_Sb      = HAZ_EXRsWRt;
599
parameter [7:0] HAZ_Sc      = HAZ_EXRsWRt;
600
parameter [7:0] HAZ_Sh      = HAZ_EXRsWRt;
601
parameter [7:0] HAZ_Sll     = HAZ_EXRt;
602
parameter [7:0] HAZ_Sllv    = HAZ_EXRsEXRt;
603
parameter [7:0] HAZ_Slt     = HAZ_EXRsEXRt;
604
parameter [7:0] HAZ_Slti    = HAZ_EXRs;
605
parameter [7:0] HAZ_Sltiu   = HAZ_EXRs;
606
parameter [7:0] HAZ_Sltu    = HAZ_EXRsEXRt;
607
parameter [7:0] HAZ_Sra     = HAZ_EXRt;
608
parameter [7:0] HAZ_Srav    = HAZ_EXRsEXRt;
609
parameter [7:0] HAZ_Srl     = HAZ_EXRt;
610
parameter [7:0] HAZ_Srlv    = HAZ_EXRsEXRt;
611
parameter [7:0] HAZ_Sub     = HAZ_EXRsEXRt;
612
parameter [7:0] HAZ_Subu    = HAZ_EXRsEXRt;
613
parameter [7:0] HAZ_Sw      = HAZ_EXRsWRt;
614
parameter [7:0] HAZ_Swl     = HAZ_EXRsWRt;
615
parameter [7:0] HAZ_Swr     = HAZ_EXRsWRt;
616
parameter [7:0] HAZ_Syscall = HAZ_Nothing;
617
parameter [7:0] HAZ_Teq     = HAZ_EXRsEXRt;
618
parameter [7:0] HAZ_Teqi    = HAZ_EXRs;
619
parameter [7:0] HAZ_Tge     = HAZ_EXRsEXRt;
620
parameter [7:0] HAZ_Tgei    = HAZ_EXRs;
621
parameter [7:0] HAZ_Tgeiu   = HAZ_EXRs;
622
parameter [7:0] HAZ_Tgeu    = HAZ_EXRsEXRt;
623
parameter [7:0] HAZ_Tlt     = HAZ_EXRsEXRt;
624
parameter [7:0] HAZ_Tlti    = HAZ_EXRs;
625
parameter [7:0] HAZ_Tltiu   = HAZ_EXRs;
626
parameter [7:0] HAZ_Tltu    = HAZ_EXRsEXRt;
627
parameter [7:0] HAZ_Tne     = HAZ_EXRsEXRt;
628
parameter [7:0] HAZ_Tnei    = HAZ_EXRs;
629
parameter [7:0] HAZ_Xor     = HAZ_EXRsEXRt;
630
parameter [7:0] HAZ_Xori    = HAZ_EXRs;
631
 

powered by: WebSVN 2.1.0

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