punk@1
|
1
|
punk@1
|
2 import Trace::*;
|
punk@1
|
3
|
punk@1
|
4 //----------------------------------------------------------------------
|
punk@1
|
5 // Other typedefs
|
punk@1
|
6 //----------------------------------------------------------------------
|
punk@1
|
7
|
punk@1
|
8 typedef Bit#(32) Addr;
|
punk@1
|
9 typedef Int#(18) Stat;
|
punk@1
|
10
|
punk@1
|
11 //----------------------------------------------------------------------
|
punk@1
|
12 // Basic instruction type
|
punk@1
|
13 //----------------------------------------------------------------------
|
punk@1
|
14
|
punk@1
|
15 typedef Bit#(5) Rindx;
|
punk@1
|
16 typedef Bit#(16) Simm;
|
punk@1
|
17 typedef Bit#(16) Zimm;
|
punk@1
|
18 typedef Bit#(8) Epoch;
|
punk@1
|
19 typedef Bit#(5) Shamt;
|
punk@1
|
20 typedef Bit#(26) Target;
|
punk@1
|
21 typedef Bit#(5) CP0indx;
|
punk@1
|
22 typedef Bit#(32) Data;
|
punk@1
|
23
|
punk@1
|
24 typedef enum
|
punk@1
|
25 {
|
punk@1
|
26 Taken,
|
punk@1
|
27 NotTaken
|
punk@1
|
28 }
|
punk@1
|
29 Direction
|
punk@1
|
30 deriving(Bits,Eq);
|
punk@1
|
31
|
punk@1
|
32
|
punk@1
|
33 //----------------------------------------------------------------------
|
punk@1
|
34 // Pipeline typedefs
|
punk@1
|
35 //----------------------------------------------------------------------
|
punk@1
|
36
|
punk@1
|
37 typedef union tagged
|
punk@1
|
38 {
|
punk@1
|
39 Tuple2#(Rindx,Data) ALUWB;
|
punk@1
|
40 Rindx MemWB;
|
punk@1
|
41 Tuple2#(Rindx,Data) CoWB;
|
punk@1
|
42 }
|
punk@1
|
43 WritebackType
|
punk@1
|
44 deriving(Bits,Eq);
|
punk@1
|
45
|
punk@1
|
46 ////////////////////////
|
punk@1
|
47 // I Add Writeback queue type
|
punk@1
|
48 ////////////
|
punk@1
|
49 typedef union tagged
|
punk@1
|
50 {
|
punk@1
|
51 struct {Bit#(32) data; Rindx dest; } WB_ALU;
|
punk@1
|
52 Bit#(32) WB_Host;
|
punk@1
|
53 Rindx WB_Load;
|
punk@1
|
54 void WB_Store;
|
punk@1
|
55 }
|
punk@1
|
56 WBResult deriving(Eq, Bits);
|
punk@1
|
57
|
punk@1
|
58 //typedef struct{Addr qpc; Addr qnxtpc; Epoch qepoch;} PCStat deriving(Eq, Bits);
|
punk@1
|
59 typedef struct{Addr qpc; Epoch qepoch;} PCStat deriving(Eq, Bits);
|
punk@1
|
60
|
punk@1
|
61 typedef union tagged
|
punk@1
|
62 {
|
punk@1
|
63
|
punk@1
|
64 struct { Rindx rbase; Rindx rdst; Simm offset; } LW;
|
punk@1
|
65 struct { Rindx rbase; Rindx rsrc; Simm offset; } SW;
|
punk@1
|
66
|
punk@1
|
67 struct { Rindx rsrc; Rindx rdst; Simm imm; } ADDIU;
|
punk@1
|
68 struct { Rindx rsrc; Rindx rdst; Simm imm; } SLTI;
|
punk@1
|
69 struct { Rindx rsrc; Rindx rdst; Simm imm; } SLTIU;
|
punk@1
|
70 struct { Rindx rsrc; Rindx rdst; Zimm imm; } ANDI;
|
punk@1
|
71 struct { Rindx rsrc; Rindx rdst; Zimm imm; } ORI;
|
punk@1
|
72 struct { Rindx rsrc; Rindx rdst; Zimm imm; } XORI;
|
punk@1
|
73 struct { Rindx rdst; Zimm imm; } LUI;
|
punk@1
|
74
|
punk@1
|
75 struct { Rindx rsrc; Rindx rdst; Shamt shamt; } SLL;
|
punk@1
|
76 struct { Rindx rsrc; Rindx rdst; Shamt shamt; } SRL;
|
punk@1
|
77 struct { Rindx rsrc; Rindx rdst; Shamt shamt; } SRA;
|
punk@1
|
78 struct { Rindx rsrc; Rindx rdst; Rindx rshamt; } SLLV;
|
punk@1
|
79 struct { Rindx rsrc; Rindx rdst; Rindx rshamt; } SRLV;
|
punk@1
|
80 struct { Rindx rsrc; Rindx rdst; Rindx rshamt; } SRAV;
|
punk@1
|
81 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } ADDU;
|
punk@1
|
82 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } SUBU;
|
punk@1
|
83 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } AND;
|
punk@1
|
84 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } OR;
|
punk@1
|
85 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } XOR;
|
punk@1
|
86 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } NOR;
|
punk@1
|
87 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } SLT;
|
punk@1
|
88 struct { Rindx rsrc1; Rindx rsrc2; Rindx rdst; } SLTU;
|
punk@1
|
89
|
punk@1
|
90 struct { Target target; } J;
|
punk@1
|
91 struct { Target target; } JAL;
|
punk@1
|
92 struct { Rindx rsrc; } JR;
|
punk@1
|
93 struct { Rindx rsrc; Rindx rdst; } JALR;
|
punk@1
|
94 struct { Rindx rsrc1; Rindx rsrc2; Simm offset; } BEQ;
|
punk@1
|
95 struct { Rindx rsrc1; Rindx rsrc2; Simm offset; } BNE;
|
punk@1
|
96 struct { Rindx rsrc; Simm offset; } BLEZ;
|
punk@1
|
97 struct { Rindx rsrc; Simm offset; } BGTZ;
|
punk@1
|
98 struct { Rindx rsrc; Simm offset; } BLTZ;
|
punk@1
|
99 struct { Rindx rsrc; Simm offset; } BGEZ;
|
punk@1
|
100
|
punk@1
|
101 struct { Rindx rdst; CP0indx cop0src; } MFC0;
|
punk@1
|
102 struct { Rindx rsrc; CP0indx cop0dst; } MTC0;
|
punk@1
|
103
|
punk@1
|
104 void ILLEGAL;
|
punk@1
|
105
|
punk@1
|
106 }
|
punk@1
|
107 Instr deriving(Eq);
|
punk@1
|
108
|
punk@1
|
109 //----------------------------------------------------------------------
|
punk@1
|
110 // Pack and Unpack
|
punk@1
|
111 //----------------------------------------------------------------------
|
punk@1
|
112
|
punk@1
|
113 Bit#(6) opFUNC = 6'b000000; Bit#(6) fcSLL = 6'b000000;
|
punk@1
|
114 Bit#(6) opRT = 6'b000001; Bit#(6) fcSRL = 6'b000010;
|
punk@1
|
115 Bit#(6) opRS = 6'b010000; Bit#(6) fcSRA = 6'b000011;
|
punk@1
|
116 Bit#(6) fcSLLV = 6'b000100;
|
punk@1
|
117 Bit#(6) opLW = 6'b100011; Bit#(6) fcSRLV = 6'b000110;
|
punk@1
|
118 Bit#(6) opSW = 6'b101011; Bit#(6) fcSRAV = 6'b000111;
|
punk@1
|
119 Bit#(6) fcADDU = 6'b100001;
|
punk@1
|
120 Bit#(6) opADDIU = 6'b001001; Bit#(6) fcSUBU = 6'b100011;
|
punk@1
|
121 Bit#(6) opSLTI = 6'b001010; Bit#(6) fcAND = 6'b100100;
|
punk@1
|
122 Bit#(6) opSLTIU = 6'b001011; Bit#(6) fcOR = 6'b100101;
|
punk@1
|
123 Bit#(6) opANDI = 6'b001100; Bit#(6) fcXOR = 6'b100110;
|
punk@1
|
124 Bit#(6) opORI = 6'b001101; Bit#(6) fcNOR = 6'b100111;
|
punk@1
|
125 Bit#(6) opXORI = 6'b001110; Bit#(6) fcSLT = 6'b101010;
|
punk@1
|
126 Bit#(6) opLUI = 6'b001111; Bit#(6) fcSLTU = 6'b101011;
|
punk@1
|
127
|
punk@1
|
128 Bit#(6) opJ = 6'b000010;
|
punk@1
|
129 Bit#(6) opJAL = 6'b000011;
|
punk@1
|
130 Bit#(6) fcJR = 6'b001000;
|
punk@1
|
131 Bit#(6) fcJALR = 6'b001001;
|
punk@1
|
132 Bit#(6) opBEQ = 6'b000100;
|
punk@1
|
133 Bit#(6) opBNE = 6'b000101;
|
punk@1
|
134 Bit#(6) opBLEZ = 6'b000110;
|
punk@1
|
135 Bit#(6) opBGTZ = 6'b000111;
|
punk@1
|
136 Bit#(5) rtBLTZ = 5'b00000;
|
punk@1
|
137 Bit#(5) rtBGEZ = 5'b00001;
|
punk@1
|
138
|
punk@1
|
139 Bit#(5) rsMFC0 = 5'b00000;
|
punk@1
|
140 Bit#(5) rsMTC0 = 5'b00100;
|
punk@1
|
141
|
punk@1
|
142 instance Bits#(Instr,32);
|
punk@1
|
143
|
punk@1
|
144 // Pack Function
|
punk@1
|
145
|
punk@1
|
146 function Bit#(32) pack( Instr instr );
|
punk@1
|
147
|
punk@1
|
148 case ( instr ) matches
|
punk@1
|
149
|
punk@1
|
150 tagged LW .it : return { opLW, it.rbase, it.rdst, it.offset };
|
punk@1
|
151 tagged SW .it : return { opSW, it.rbase, it.rsrc, it.offset };
|
punk@1
|
152
|
punk@1
|
153 tagged ADDIU .it : return { opADDIU, it.rsrc, it.rdst, it.imm };
|
punk@1
|
154 tagged SLTI .it : return { opSLTI, it.rsrc, it.rdst, it.imm };
|
punk@1
|
155 tagged SLTIU .it : return { opSLTIU, it.rsrc, it.rdst, it.imm };
|
punk@1
|
156 tagged ANDI .it : return { opANDI, it.rsrc, it.rdst, it.imm };
|
punk@1
|
157 tagged ORI .it : return { opORI, it.rsrc, it.rdst, it.imm };
|
punk@1
|
158 tagged XORI .it : return { opXORI, it.rsrc, it.rdst, it.imm };
|
punk@1
|
159 tagged LUI .it : return { opLUI, 5'b0, it.rdst, it.imm };
|
punk@1
|
160
|
punk@1
|
161 tagged SLL .it : return { opFUNC, 5'b0, it.rsrc, it.rdst, it.shamt, fcSLL };
|
punk@1
|
162 tagged SRL .it : return { opFUNC, 5'b0, it.rsrc, it.rdst, it.shamt, fcSRL };
|
punk@1
|
163 tagged SRA .it : return { opFUNC, 5'b0, it.rsrc, it.rdst, it.shamt, fcSRA };
|
punk@1
|
164
|
punk@1
|
165 tagged SLLV .it : return { opFUNC, it.rshamt, it.rsrc, it.rdst, 5'b0, fcSLLV };
|
punk@1
|
166 tagged SRLV .it : return { opFUNC, it.rshamt, it.rsrc, it.rdst, 5'b0, fcSRLV };
|
punk@1
|
167 tagged SRAV .it : return { opFUNC, it.rshamt, it.rsrc, it.rdst, 5'b0, fcSRAV };
|
punk@1
|
168
|
punk@1
|
169 tagged ADDU .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcADDU };
|
punk@1
|
170 tagged SUBU .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcSUBU };
|
punk@1
|
171 tagged AND .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcAND };
|
punk@1
|
172 tagged OR .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcOR };
|
punk@1
|
173 tagged XOR .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcXOR };
|
punk@1
|
174 tagged NOR .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcNOR };
|
punk@1
|
175 tagged SLT .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcSLT };
|
punk@1
|
176 tagged SLTU .it : return { opFUNC, it.rsrc1, it.rsrc2, it.rdst, 5'b0, fcSLTU };
|
punk@1
|
177
|
punk@1
|
178 tagged J .it : return { opJ, it.target };
|
punk@1
|
179 tagged JAL .it : return { opJAL, it.target };
|
punk@1
|
180 tagged JR .it : return { opFUNC, it.rsrc, 5'b0, 5'b0, 5'b0, fcJR };
|
punk@1
|
181 tagged JALR .it : return { opFUNC, it.rsrc, 5'b0, it.rdst, 5'b0, fcJALR };
|
punk@1
|
182 tagged BEQ .it : return { opBEQ, it.rsrc1, it.rsrc2, it.offset };
|
punk@1
|
183 tagged BNE .it : return { opBNE, it.rsrc1, it.rsrc2, it.offset };
|
punk@1
|
184 tagged BLEZ .it : return { opBLEZ, it.rsrc, 5'b0, it.offset };
|
punk@1
|
185 tagged BGTZ .it : return { opBGTZ, it.rsrc, 5'b0, it.offset };
|
punk@1
|
186 tagged BLTZ .it : return { opRT, it.rsrc, rtBLTZ, it.offset };
|
punk@1
|
187 tagged BGEZ .it : return { opRT, it.rsrc, rtBGEZ, it.offset };
|
punk@1
|
188
|
punk@1
|
189 tagged MFC0 .it : return { opRS, rsMFC0, it.rdst, it.cop0src, 11'b0 };
|
punk@1
|
190 tagged MTC0 .it : return { opRS, rsMTC0, it.rsrc, it.cop0dst, 11'b0 };
|
punk@1
|
191
|
punk@1
|
192 endcase
|
punk@1
|
193
|
punk@1
|
194 endfunction
|
punk@1
|
195
|
punk@1
|
196 // Unpack Function
|
punk@1
|
197
|
punk@1
|
198 function Instr unpack( Bit#(32) instrBits );
|
punk@1
|
199
|
punk@1
|
200 let opcode = instrBits[ 31 : 26 ];
|
punk@1
|
201 let rs = instrBits[ 25 : 21 ];
|
punk@1
|
202 let rt = instrBits[ 20 : 16 ];
|
punk@1
|
203 let rd = instrBits[ 15 : 11 ];
|
punk@1
|
204 let shamt = instrBits[ 10 : 6 ];
|
punk@1
|
205 let funct = instrBits[ 5 : 0 ];
|
punk@1
|
206 let imm = instrBits[ 15 : 0 ];
|
punk@1
|
207 let target = instrBits[ 25 : 0 ];
|
punk@1
|
208
|
punk@1
|
209 case ( opcode )
|
punk@1
|
210
|
punk@1
|
211 opLW : return LW { rbase:rs, rdst:rt, offset:imm };
|
punk@1
|
212 opSW : return SW { rbase:rs, rsrc:rt, offset:imm };
|
punk@1
|
213 opADDIU : return ADDIU { rsrc:rs, rdst:rt, imm:imm };
|
punk@1
|
214 opSLTI : return SLTI { rsrc:rs, rdst:rt, imm:imm };
|
punk@1
|
215 opSLTIU : return SLTIU { rsrc:rs, rdst:rt, imm:imm };
|
punk@1
|
216 opANDI : return ANDI { rsrc:rs, rdst:rt, imm:imm };
|
punk@1
|
217 opORI : return ORI { rsrc:rs, rdst:rt, imm:imm };
|
punk@1
|
218 opXORI : return XORI { rsrc:rs, rdst:rt, imm:imm };
|
punk@1
|
219 opLUI : return LUI { rdst:rt, imm:imm };
|
punk@1
|
220 opJ : return J { target:target };
|
punk@1
|
221 opJAL : return JAL { target:target };
|
punk@1
|
222 opBEQ : return BEQ { rsrc1:rs, rsrc2:rt, offset:imm };
|
punk@1
|
223 opBNE : return BNE { rsrc1:rs, rsrc2:rt, offset:imm };
|
punk@1
|
224 opBLEZ : return BLEZ { rsrc:rs, offset:imm };
|
punk@1
|
225 opBGTZ : return BGTZ { rsrc:rs, offset:imm };
|
punk@1
|
226
|
punk@1
|
227 opFUNC :
|
punk@1
|
228 case ( funct )
|
punk@1
|
229 fcSLL : return SLL { rsrc:rt, rdst:rd, shamt:shamt };
|
punk@1
|
230 fcSRL : return SRL { rsrc:rt, rdst:rd, shamt:shamt };
|
punk@1
|
231 fcSRA : return SRA { rsrc:rt, rdst:rd, shamt:shamt };
|
punk@1
|
232 fcSLLV : return SLLV { rsrc:rt, rdst:rd, rshamt:rs };
|
punk@1
|
233 fcSRLV : return SRLV { rsrc:rt, rdst:rd, rshamt:rs };
|
punk@1
|
234 fcSRAV : return SRAV { rsrc:rt, rdst:rd, rshamt:rs };
|
punk@1
|
235 fcADDU : return ADDU { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
236 fcSUBU : return SUBU { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
237 fcAND : return AND { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
238 fcOR : return OR { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
239 fcXOR : return XOR { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
240 fcNOR : return NOR { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
241 fcSLT : return SLT { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
242 fcSLTU : return SLTU { rsrc1:rs, rsrc2:rt, rdst:rd };
|
punk@1
|
243 fcJR : return JR { rsrc:rs };
|
punk@1
|
244 fcJALR : return JALR { rsrc:rs, rdst:rd };
|
punk@1
|
245 default : return ILLEGAL;
|
punk@1
|
246 endcase
|
punk@1
|
247
|
punk@1
|
248 opRT :
|
punk@1
|
249 case ( rt )
|
punk@1
|
250 rtBLTZ : return BLTZ { rsrc:rs, offset:imm };
|
punk@1
|
251 rtBGEZ : return BGEZ { rsrc:rs, offset:imm };
|
punk@1
|
252 default : return ILLEGAL;
|
punk@1
|
253 endcase
|
punk@1
|
254
|
punk@1
|
255 opRS :
|
punk@1
|
256 case ( rs )
|
punk@1
|
257 rsMFC0 : return MFC0 { rdst:rt, cop0src:rd };
|
punk@1
|
258 rsMTC0 : return MTC0 { rsrc:rt, cop0dst:rd };
|
punk@1
|
259 default : return ILLEGAL;
|
punk@1
|
260 endcase
|
punk@1
|
261
|
punk@1
|
262 default : return ILLEGAL;
|
punk@1
|
263
|
punk@1
|
264 endcase
|
punk@1
|
265
|
punk@1
|
266 endfunction
|
punk@1
|
267
|
punk@1
|
268 endinstance
|
punk@1
|
269
|
punk@1
|
270 //----------------------------------------------------------------------
|
punk@1
|
271 // Trace
|
punk@1
|
272 //----------------------------------------------------------------------
|
punk@1
|
273
|
punk@1
|
274 instance Traceable#(Instr);
|
punk@1
|
275
|
punk@1
|
276 function Action traceTiny( String loc, String ttag, Instr inst );
|
punk@1
|
277 case ( inst ) matches
|
punk@1
|
278
|
punk@1
|
279 tagged LW .it : $fdisplay(stderr, " => %s:%s lw", loc, ttag );
|
punk@1
|
280 tagged SW .it : $fdisplay(stderr, " => %s:%s sw", loc, ttag );
|
punk@1
|
281
|
punk@1
|
282 tagged ADDIU .it : $fdisplay(stderr, " => %s:%s addi", loc, ttag );
|
punk@1
|
283 tagged SLTI .it : $fdisplay(stderr, " => %s:%s sli", loc, ttag );
|
punk@1
|
284 tagged SLTIU .it : $fdisplay(stderr, " => %s:%s sliu", loc, ttag );
|
punk@1
|
285 tagged ANDI .it : $fdisplay(stderr, " => %s:%s andi", loc, ttag );
|
punk@1
|
286 tagged ORI .it : $fdisplay(stderr, " => %s:%s ori", loc, ttag );
|
punk@1
|
287 tagged XORI .it : $fdisplay(stderr, " => %s:%s xori", loc, ttag );
|
punk@1
|
288 tagged LUI .it : $fdisplay(stderr, " => %s:%s lui", loc, ttag );
|
punk@1
|
289
|
punk@1
|
290 tagged SLL .it : $fdisplay(stderr, " => %s:%s sll", loc, ttag );
|
punk@1
|
291 tagged SRL .it : $fdisplay(stderr, " => %s:%s srl", loc, ttag );
|
punk@1
|
292 tagged SRA .it : $fdisplay(stderr, " => %s:%s sra", loc, ttag );
|
punk@1
|
293 tagged SLLV .it : $fdisplay(stderr, " => %s:%s sllv", loc, ttag );
|
punk@1
|
294 tagged SRLV .it : $fdisplay(stderr, " => %s:%s srlv", loc, ttag );
|
punk@1
|
295 tagged SRAV .it : $fdisplay(stderr, " => %s:%s srav", loc, ttag );
|
punk@1
|
296
|
punk@1
|
297 tagged ADDU .it : $fdisplay(stderr, " => %s:%s addu", loc, ttag );
|
punk@1
|
298 tagged SUBU .it : $fdisplay(stderr, " => %s:%s subu", loc, ttag );
|
punk@1
|
299 tagged AND .it : $fdisplay(stderr, " => %s:%s and", loc, ttag );
|
punk@1
|
300 tagged OR .it : $fdisplay(stderr, " => %s:%s or", loc, ttag );
|
punk@1
|
301 tagged XOR .it : $fdisplay(stderr, " => %s:%s xor", loc, ttag );
|
punk@1
|
302 tagged NOR .it : $fdisplay(stderr, " => %s:%s nor", loc, ttag );
|
punk@1
|
303 tagged SLT .it : $fdisplay(stderr, " => %s:%s slt", loc, ttag );
|
punk@1
|
304 tagged SLTU .it : $fdisplay(stderr, " => %s:%s sltu", loc, ttag );
|
punk@1
|
305
|
punk@1
|
306 tagged J .it : $fdisplay(stderr, " => %s:%s j", loc, ttag );
|
punk@1
|
307 tagged JAL .it : $fdisplay(stderr, " => %s:%s jal", loc, ttag );
|
punk@1
|
308 tagged JR .it : $fdisplay(stderr, " => %s:%s jr", loc, ttag );
|
punk@1
|
309 tagged JALR .it : $fdisplay(stderr, " => %s:%s jalr", loc, ttag );
|
punk@1
|
310 tagged BEQ .it : $fdisplay(stderr, " => %s:%s beq", loc, ttag );
|
punk@1
|
311 tagged BNE .it : $fdisplay(stderr, " => %s:%s bne", loc, ttag );
|
punk@1
|
312 tagged BLEZ .it : $fdisplay(stderr, " => %s:%s blez", loc, ttag );
|
punk@1
|
313 tagged BGTZ .it : $fdisplay(stderr, " => %s:%s bgtz", loc, ttag );
|
punk@1
|
314 tagged BLTZ .it : $fdisplay(stderr, " => %s:%s bltz", loc, ttag );
|
punk@1
|
315 tagged BGEZ .it : $fdisplay(stderr, " => %s:%s bgez", loc, ttag );
|
punk@1
|
316
|
punk@1
|
317 tagged MFC0 .it : $fdisplay(stderr, " => %s:%s mfc0", loc, ttag );
|
punk@1
|
318 tagged MTC0 .it : $fdisplay(stderr, " => %s:%s mtc0", loc, ttag );
|
punk@1
|
319
|
punk@1
|
320 tagged ILLEGAL : $fdisplay(stderr, " => %s:%s ill", loc, ttag );
|
punk@1
|
321
|
punk@1
|
322 endcase
|
punk@1
|
323 endfunction
|
punk@1
|
324
|
punk@1
|
325 function Action traceFull( String loc, String ttag, Instr inst );
|
punk@1
|
326 case ( inst ) matches
|
punk@1
|
327
|
punk@1
|
328 tagged LW .it : $fdisplay(stderr, " => %s:%s lw r%0d, 0x%x(r%0d)", loc, ttag, it.rdst, it.offset, it.rbase );
|
punk@1
|
329 tagged SW .it : $fdisplay(stderr, " => %s:%s sw r%0d, 0x%x(r%0d)", loc, ttag, it.rsrc, it.offset, it.rbase );
|
punk@1
|
330
|
punk@1
|
331 tagged ADDIU .it : $fdisplay(stderr, " => %s:%s addiu r%0d, r%0d, 0x%x", loc, ttag, it.rdst, it.rsrc, it.imm );
|
punk@1
|
332 tagged SLTI .it : $fdisplay(stderr, " => %s:%s slti r%0d, r%0d, 0x%x", loc, ttag, it.rdst, it.rsrc, it.imm );
|
punk@1
|
333 tagged SLTIU .it : $fdisplay(stderr, " => %s:%s sltiu r%0d, r%0d, 0x%x", loc, ttag, it.rdst, it.rsrc, it.imm );
|
punk@1
|
334 tagged ANDI .it : $fdisplay(stderr, " => %s:%s andi r%0d, r%0d, 0x%x", loc, ttag, it.rdst, it.rsrc, it.imm );
|
punk@1
|
335 tagged ORI .it : $fdisplay(stderr, " => %s:%s ori r%0d, r%0d, 0x%x", loc, ttag, it.rdst, it.rsrc, it.imm );
|
punk@1
|
336 tagged XORI .it : $fdisplay(stderr, " => %s:%s xori r%0d, r%0d, 0x%x", loc, ttag, it.rdst, it.rsrc, it.imm );
|
punk@1
|
337 tagged LUI .it : $fdisplay(stderr, " => %s:%s lui r%0d, 0x%x", loc, ttag, it.rdst, it.imm );
|
punk@1
|
338
|
punk@1
|
339 tagged SLL .it : $fdisplay(stderr, " => %s:%s sll r%0d, r%0d, %0d", loc, ttag, it.rdst, it.rsrc, it.shamt );
|
punk@1
|
340 tagged SRL .it : $fdisplay(stderr, " => %s:%s srl r%0d, r%0d, %0d", loc, ttag, it.rdst, it.rsrc, it.shamt );
|
punk@1
|
341 tagged SRA .it : $fdisplay(stderr, " => %s:%s sra r%0d, r%0d, %0d", loc, ttag, it.rdst, it.rsrc, it.shamt );
|
punk@1
|
342 tagged SLLV .it : $fdisplay(stderr, " => %s:%s sllv r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc, it.rshamt );
|
punk@1
|
343 tagged SRLV .it : $fdisplay(stderr, " => %s:%s srlv r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc, it.rshamt );
|
punk@1
|
344 tagged SRAV .it : $fdisplay(stderr, " => %s:%s srav r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc, it.rshamt );
|
punk@1
|
345
|
punk@1
|
346 tagged ADDU .it : $fdisplay(stderr, " => %s:%s addu r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
347 tagged SUBU .it : $fdisplay(stderr, " => %s:%s subu r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
348 tagged AND .it : $fdisplay(stderr, " => %s:%s and r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
349 tagged OR .it : $fdisplay(stderr, " => %s:%s or r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
350 tagged XOR .it : $fdisplay(stderr, " => %s:%s xor r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
351 tagged NOR .it : $fdisplay(stderr, " => %s:%s nor r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
352 tagged SLT .it : $fdisplay(stderr, " => %s:%s slt r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
353 tagged SLTU .it : $fdisplay(stderr, " => %s:%s sltu r%0d, r%0d, r%0d", loc, ttag, it.rdst, it.rsrc1, it.rsrc2 );
|
punk@1
|
354
|
punk@1
|
355 tagged J .it : $fdisplay(stderr, " => %s:%s j 0x%x", loc, ttag, it.target );
|
punk@1
|
356 tagged JAL .it : $fdisplay(stderr, " => %s:%s jal 0x%x", loc, ttag, it.target );
|
punk@1
|
357 tagged JR .it : $fdisplay(stderr, " => %s:%s jr r%0d", loc, ttag, it.rsrc );
|
punk@1
|
358 tagged JALR .it : $fdisplay(stderr, " => %s:%s jalr r%0d", loc, ttag, it.rsrc );
|
punk@1
|
359 tagged BEQ .it : $fdisplay(stderr, " => %s:%s beq r%0d, r%0d, 0x%x", loc, ttag, it.rsrc1, it.rsrc2, it.offset );
|
punk@1
|
360 tagged BNE .it : $fdisplay(stderr, " => %s:%s bne r%0d, r%0d, 0x%x", loc, ttag, it.rsrc1, it.rsrc2, it.offset );
|
punk@1
|
361 tagged BLEZ .it : $fdisplay(stderr, " => %s:%s blez r%0d, 0x%x", loc, ttag, it.rsrc, it.offset );
|
punk@1
|
362 tagged BGTZ .it : $fdisplay(stderr, " => %s:%s bgtz r%0d, 0x%x", loc, ttag, it.rsrc, it.offset );
|
punk@1
|
363 tagged BLTZ .it : $fdisplay(stderr, " => %s:%s bltz r%0d, 0x%x", loc, ttag, it.rsrc, it.offset );
|
punk@1
|
364 tagged BGEZ .it : $fdisplay(stderr, " => %s:%s bgez r%0d, 0x%x", loc, ttag, it.rsrc, it.offset );
|
punk@1
|
365
|
punk@1
|
366 tagged MFC0 .it : $fdisplay(stderr, " => %s:%s mfc0 r%0d, cpr%0d", loc, ttag, it.rdst, it.cop0src );
|
punk@1
|
367 tagged MTC0 .it : $fdisplay(stderr, " => %s:%s mtc0 r%0d, cpr%0d", loc, ttag, it.rsrc, it.cop0dst );
|
punk@1
|
368
|
punk@1
|
369 tagged ILLEGAL : $fdisplay(stderr, " => %s:%s illegal instruction", loc, ttag );
|
punk@1
|
370
|
punk@1
|
371 endcase
|
punk@1
|
372 endfunction
|
punk@1
|
373
|
punk@1
|
374 endinstance
|
punk@1
|
375
|