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

Subversion Repositories mips32r1

[/] [mips32r1/] [trunk/] [Hardware/] [XUPV5-LX110T_SoC/] [MIPS32-Pipelined-Hw/] [src/] [MIPS32/] [MIPS_Parameters.v] - Blame information for rev 2

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

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

powered by: WebSVN 2.1.0

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