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

Subversion Repositories qrisc32

[/] [qrisc32/] [trunk/] [qrisc32_ID.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 vinogradov
//////////////////////////////////////////////////////////////////////////////////////////////
2
//    Project Qrisc32 is risc cpu implementation, purpose is studying
3
//    Digital System Design course at Kyoung Hee University during my PhD earning
4
//    Copyright (C) 2010  Vinogradov Viacheslav
5
//
6
//    This library is free software; you can redistribute it and/or
7
//   modify it under the terms of the GNU Lesser General Public
8
//    License as published by the Free Software Foundation; either
9
//    version 2.1 of the License, or (at your option) any later version.
10
//
11
//    This library is distributed in the hope that it will be useful,
12
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
//    Lesser General Public License for more details.
15
//
16
//    You should have received a copy of the GNU Lesser General Public
17
//    License along with this library; if not, write to the Free Software
18
//    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19
//
20
//
21
//////////////////////////////////////////////////////////////////////////////////////////////
22
 
23
 
24
import risc_pack::*;
25
 
26
module qrisc32_ID(
27
                input                           clk,reset,
28
                input [31:0]            instruction,
29
                input [31:0]            pc,
30
 
31
                input                           pipe_stall,//feed back from MEM stage
32
                input pipe_struct       pipe_wb_mem,//for memory read
33
                input pipe_struct       pipe_wb_ex,//for R2 register and ALU operations only
34
 
35
                output pipe_struct      pipe_id_out,
36
                input                           verbose
37
        );
38
 
39
        import risc_pack::*;
40
 
41
        bit[31:0]                       rf[31:0];//32 regs width is 32
42
        bit[31:0]                       offset_w;
43
        pipe_struct                     pipe_id_out_w;
44
        bit[31:0]                       nop_counter;
45
        bit[31:0]                       jmp_counter;
46
        bit[31:0]                       alu_counter;
47
        bit[31:0]                       oth_counter;
48
 
49
        //comb part
50
        always_comb
51
        begin
52
                pipe_id_out_w.dst_r     = instruction[04:00];
53
                pipe_id_out_w.src_r1    = instruction[09:05];
54
                pipe_id_out_w.src_r2    = instruction[14:10];
55
                pipe_id_out_w.incr_r2   = 0;
56
                pipe_id_out_w.incr_r2_enable    = 1;
57
 
58
 
59
                pipe_id_out_w.read_mem  = 0;
60
                pipe_id_out_w.write_mem = 0;
61
                pipe_id_out_w.write_reg = 0;
62
 
63
                pipe_id_out_w.mul_op    = 0;
64
                pipe_id_out_w.add_op    = 0;
65
                pipe_id_out_w.or_op             = 0;
66
                pipe_id_out_w.and_op    = 0;
67
                pipe_id_out_w.xor_op    = 0;
68
                pipe_id_out_w.shl_op    = 0;
69
                pipe_id_out_w.shr_op    = 0;
70
                pipe_id_out_w.cmp_op    = 0;
71
                pipe_id_out_w.ldrf_op   = 0;
72
 
73
 
74
                pipe_id_out_w.jmpunc    = 0;
75
                pipe_id_out_w.jmpz              = 0;
76
                pipe_id_out_w.jmpnz             = 0;
77
                pipe_id_out_w.jmpc              = 0;
78
                pipe_id_out_w.jmpnc             = 0;
79
 
80
                pipe_id_out_w.val_r1    =       (pipe_wb_mem.write_reg && pipe_wb_mem.dst_r==pipe_id_out_w.src_r1)?
81
                                                                        pipe_wb_mem.val_dst://forward from memory read
82
                                                                        //(pipe_wb_mem.incr_r2_enable && pipe_wb_mem.src_r2==pipe_id_out_w.src_r1)?
83
                                                                        //pipe_wb_mem.val_r2://forward from mem stage R2 register
84
                                                                        (pipe_wb_ex.write_reg && pipe_wb_ex.dst_r==pipe_id_out_w.src_r1)?
85
                                                                        pipe_wb_ex.val_dst://forward from execution stage DST register
86
                                                                        (pipe_wb_ex.incr_r2_enable && pipe_wb_ex.src_r2==pipe_id_out_w.src_r1)?
87
                                                                        pipe_wb_ex.val_r2://forward from execution stage R2 register
88
                                                                        rf[pipe_id_out_w.src_r1];//otherwise from register file
89
 
90
                pipe_id_out_w.val_r2    =       (pipe_wb_mem.write_reg && pipe_wb_mem.dst_r==pipe_id_out_w.src_r2)?
91
                                                                        pipe_wb_mem.val_dst://forward from memory read
92
                                                                        //(pipe_wb_mem.incr_r2_enable && pipe_wb_mem.src_r2==pipe_id_out_w.src_r2)?
93
                                                                        //pipe_wb_mem.val_r2://forward from mem stage R2 register
94
                                                                        (pipe_wb_ex.write_reg && pipe_wb_ex.dst_r==pipe_id_out_w.src_r2)?
95
                                                                        pipe_wb_ex.val_dst://forward from execution stage DST register
96
                                                                        (pipe_wb_ex.incr_r2_enable && pipe_wb_ex.src_r2==pipe_id_out_w.src_r2)?
97
                                                                        pipe_wb_ex.val_r2://forward from execution stage R2 register
98
                                                                        rf[pipe_id_out_w.src_r2];//otherwise from register file
99
 
100
 
101
                pipe_id_out_w.val_dst   =       (pipe_wb_mem.write_reg && pipe_wb_mem.dst_r==pipe_id_out_w.dst_r)?
102
                                                                        pipe_wb_mem.val_dst://forward from memory read
103
                                                                        //(pipe_wb_mem.incr_r2_enable && pipe_wb_mem.src_r2==pipe_id_out_w.dst_r)?
104
                                                                        //pipe_wb_mem.val_r2://forward from mem stage R2 register
105
                                                                        (pipe_wb_ex.write_reg && pipe_wb_ex.dst_r==pipe_id_out_w.dst_r)?
106
                                                                        pipe_wb_ex.val_dst://forward from execution stage DST register
107
                                                                        (pipe_wb_ex.incr_r2_enable && pipe_wb_ex.src_r2==pipe_id_out_w.dst_r)?
108
                                                                        pipe_wb_ex.val_r2://forward from execution stage R2 register
109
                                                                        rf[pipe_id_out_w.dst_r];//otherwise from register file
110
 
111
                offset_w = (instruction[25])?pipe_id_out_w.val_r2:{{17{instruction[24]}},instruction[24:10]};//17 bit sign + 15 bit offset
112
 
113
                case(instruction[24:22])
114
                        0:begin pipe_id_out_w.incr_r2=4'd0;pipe_id_out_w.incr_r2_enable = 0;end
115
                        1:pipe_id_out_w.incr_r2=4'd1;
116
                        2:pipe_id_out_w.incr_r2=4'd2;
117
                        3:pipe_id_out_w.incr_r2=4'd4;
118
                        4:begin pipe_id_out_w.incr_r2=4'd0;pipe_id_out_w.incr_r2_enable = 0;end
119
                        5:pipe_id_out_w.incr_r2=-4'd1;
120
                        6:pipe_id_out_w.incr_r2=-4'd2;
121
                        7:pipe_id_out_w.incr_r2=-4'd4;
122
                endcase
123
 
124
                case(instruction[31:28])
125
                        //load and store
126
                        LDR:
127
                        case(instruction[27:26])
128
                                2'b00:
129
                                begin
130
                                pipe_id_out_w.write_reg = (pipe_id_out_w.dst_r!=pipe_id_out_w.src_r1)?1:0;//write from reg src1 to reg dst
131
                                //pipe_id_out_w.incr_r2_enable  = pipe_id_out_w.write_reg;
132
                                pipe_id_out_w.val_dst   = pipe_id_out_w.val_r1;
133
                                end
134
                                2'b01:
135
                                begin
136
                                        pipe_id_out_w.val_dst[31:16]    = instruction[20:5];
137
                                        pipe_id_out_w.write_reg = 1;//write from reg src1 to reg dst
138
                                        pipe_id_out_w.incr_r2_enable    = 0;
139
                                end
140
                                2'b10:
141
                                begin
142
                                        pipe_id_out_w.val_dst[15:0]     = instruction[20:5];
143
                                        pipe_id_out_w.write_reg = 1;//write from reg src1 to reg dst
144
                                        pipe_id_out_w.incr_r2_enable    = 0;
145
                                end
146
                                2'b11:
147
                                begin
148
                                        pipe_id_out_w.read_mem  = 1;//read from mem by Rscr2+Rsrc1 and then write to register
149
                                        pipe_id_out_w.write_reg = 1;//write from reg src1 to reg dst
150
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
151
                                        pipe_id_out_w.val_r2    = offset_w;
152
                                end
153
                        endcase
154
 
155
                        STR:
156
                        case(instruction[27:26])
157
                                //2'b11:
158
                                default:
159
                                begin
160
                                        pipe_id_out_w.write_mem = 1;//write Rdst to mem by Rscr2+Rsrc1
161
                                        pipe_id_out_w.val_r2    = offset_w;
162
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
163
                                end
164
                        endcase
165
 
166
                        //jumps
167
                        JMPUNC:
168
                        case(instruction[27:26])
169
                                2'b00:
170
                                begin
171
                                        pipe_id_out_w.val_r1    =instruction[25:0];
172
                                        pipe_id_out_w.val_r2    ='0;//no offset
173
                                        pipe_id_out_w.incr_r2_enable    = 0;
174
                                        pipe_id_out_w.jmpunc    = 1;
175
                                end
176
                                2'b01://relative jump
177
                                begin
178
                                        pipe_id_out_w.val_r1    =pc;
179
                                        pipe_id_out_w.val_r2    =offset_w;//offset
180
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
181
                                        pipe_id_out_w.jmpunc    = 1;
182
                                end
183
                                2'b10://call
184
                                begin
185
                                        pipe_id_out_w.val_r1    =pc;
186
                                        pipe_id_out_w.val_r2    =offset_w;//offset
187
                                        pipe_id_out_w.val_dst   =pc;//return address
188
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
189
                                        pipe_id_out_w.jmpunc    = 1;
190
                                        pipe_id_out_w.write_reg = 1;
191
                                end
192
                                2'b11://ret
193
                                begin
194
                                        pipe_id_out_w.val_r1    =pipe_id_out_w.val_dst;
195
                                        pipe_id_out_w.val_r2    ='0;//offset
196
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
197
                                        pipe_id_out_w.jmpunc    = 1;
198
                                end
199
                        endcase
200
 
201
                        JMPF:
202
                        case(instruction[27:26])
203
                                2'b00://jmpz
204
                                begin
205
                                        pipe_id_out_w.val_r1    =pc;
206
                                        pipe_id_out_w.val_r2    =offset_w;//offset
207
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
208
                                        pipe_id_out_w.jmpz      = 1;
209
                                end
210
                                2'b01://jmpnz
211
                                begin
212
                                        pipe_id_out_w.val_r1    =pc;
213
                                        pipe_id_out_w.val_r2    =offset_w;//offset
214
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
215
                                        pipe_id_out_w.jmpnz     = 1;
216
                                end
217
                                2'b10://jmpc
218
                                begin
219
                                        pipe_id_out_w.val_r1    =pc;
220
                                        pipe_id_out_w.val_r2    =offset_w;//offset
221
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
222
                                        pipe_id_out_w.jmpc      = 1;
223
                                end
224
                                2'b11://jmpnc
225
                                begin
226
                                        pipe_id_out_w.val_r1    =pc;
227
                                        pipe_id_out_w.val_r2    =offset_w;//offset
228
                                        pipe_id_out_w.incr_r2_enable    = instruction[25];
229
                                        pipe_id_out_w.jmpnc     = 1;
230
                                end
231
                        endcase
232
 
233
                        //Arithmetic
234
                        ALU:
235
                        case(instruction[27:25])
236
                                3'd0:
237
                                begin
238
                                        pipe_id_out_w.write_reg = 1;
239
                                        pipe_id_out_w.and_op    = 1;
240
                                end
241
                                3'd1:
242
                                begin
243
                                        pipe_id_out_w.write_reg = 1;
244
                                        pipe_id_out_w.or_op     = 1;
245
                                end
246
                                3'd2:
247
                                begin
248
                                        pipe_id_out_w.write_reg = 1;
249
                                        pipe_id_out_w.xor_op    = 1;
250
                                end
251
                                3'd3:
252
                                begin
253
                                        pipe_id_out_w.write_reg = 1;
254
                                        pipe_id_out_w.add_op    = 1;
255
                                end
256
                                3'd4:
257
                                begin
258
                                        pipe_id_out_w.write_reg = 1;
259
                                        pipe_id_out_w.mul_op    = 1;
260
                                end
261
                                3'd5:
262
                                begin
263
                                        pipe_id_out_w.write_reg = 1;
264
                                        pipe_id_out_w.shl_op    = 1;
265
                                end
266
                                3'd6:
267
                                begin
268
                                        pipe_id_out_w.write_reg = 1;
269
                                        pipe_id_out_w.shr_op    = 1;
270
                                end
271
                                //cmp_op =7
272
                                default:
273
                                begin
274
                                        //pipe_id_out_w.write_reg       = 0;
275
                                        pipe_id_out_w.cmp_op    = 1;
276
                                end
277
                        endcase
278
 
279
                        LDRF:
280
                        case(instruction[27:26])
281
                                2'b00://ldrz
282
                                begin
283
                                        pipe_id_out_w.jmpz      = 1;
284
                                        pipe_id_out_w.ldrf_op   = 1;
285
                                        pipe_id_out_w.write_reg = 1;
286
                                end
287
                                2'b01://ldrnz
288
                                begin
289
                                        pipe_id_out_w.jmpnz     = 1;
290
                                        pipe_id_out_w.ldrf_op   = 1;
291
                                        pipe_id_out_w.write_reg = 1;
292
                                end
293
                                2'b10://ldrc
294
                                begin
295
                                        pipe_id_out_w.ldrf_op   = 1;
296
                                        pipe_id_out_w.jmpc      = 1;
297
                                        pipe_id_out_w.write_reg = 1;
298
                                end
299
                                2'b11://ldrnc
300
                                begin
301
                                        pipe_id_out_w.ldrf_op   = 1;
302
                                        pipe_id_out_w.jmpnc     = 1;
303
                                        pipe_id_out_w.write_reg = 1;
304
                                end
305
                        endcase
306
 
307
                        default:
308
                                begin
309
                                        pipe_id_out_w='0;
310
                                end
311
                endcase
312
        end
313
 
314
        always@(posedge clk)// or posedge reset)
315
        if(reset)
316
        begin
317
                pipe_id_out<='0;
318
                for(int i=0;i<32;i++)
319
                        rf[i]<='0;
320
                nop_counter<='0;
321
                jmp_counter<='0;
322
                alu_counter<='0;
323
                oth_counter<='0;
324
        end
325
        else
326
        begin
327
                if(instruction==0)
328
                        nop_counter<=nop_counter+1;
329
                else
330
                if(instruction[31:28]==JMPUNC || instruction[31:28]==JMPF)
331
                        jmp_counter<=jmp_counter+1;
332
                else
333
                if(instruction[31:28]==ALU)
334
                        alu_counter<=alu_counter+1;
335
                else
336
                        oth_counter<=oth_counter+1;
337
 
338
                if(~pipe_stall)
339
                        pipe_id_out<=pipe_id_out_w;
340
 
341
                if(pipe_wb_ex.write_reg)//from ex stage DST register
342
                        rf[pipe_wb_ex.dst_r]<=pipe_wb_ex.val_dst;
343
 
344
                if(pipe_wb_ex.incr_r2_enable)//from ex stage R2 register
345
                        rf[pipe_wb_ex.src_r2]<=pipe_wb_ex.val_r2;
346
 
347
                if(pipe_wb_mem.write_reg)//from memory read stage
348
                        rf[pipe_wb_mem.dst_r]<=pipe_wb_mem.val_dst;
349
 
350
                //if(pipe_wb_mem.incr_r2_enable)//from mem stage R2 register
351
                //      rf[pipe_wb_mem.src_r2]<=pipe_wb_mem.val_r2;
352
 
353
 
354
//synthesys translate_off
355
                if(verbose)
356
                begin
357
                        if(~pipe_stall)
358
                        begin
359
                                case(instruction[31:28])
360
                                        //load and store
361
                                        LDR:
362
                                        case(instruction[27:26])
363
                                                2'b00:$display("LDR R%0d, R%0d, R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
364
                                                2'b01:$display("LDRH R%0d,0x%x",pipe_id_out_w.dst_r,instruction[20:5]);
365
                                                2'b10:$display("LDRL R%0d,0x%x",pipe_id_out_w.dst_r,instruction[20:5]);
366
                                                2'b11:$display("LDRP R%0d,[R%0d +%0d],R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,$signed(offset_w),pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
367
                                        endcase
368
 
369
                                STR:
370
                                case(instruction[27:26])
371
                                        default:$display("STR R%0d,[R%0d +%0d],R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,$signed(offset_w),pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
372
                                endcase
373
 
374
                                //jumps
375
                                JMPUNC:
376
                                case(instruction[27:26])
377
                                        2'b00:$display("JMP 0x%0x",instruction[25:0]);
378
                                        2'b01://relative jump
379
                                        $display("JMPR PC 0x%0x + offset %0d",pc,$signed(offset_w));
380
                                        2'b10://call
381
                                        $display("CALLR PC 0x%0x + offset %0d",pc,$signed(offset_w));
382
                                        2'b11://ret
383
                                        $display("RET to 0x%0x",pipe_id_out_w.val_dst);
384
                                endcase
385
 
386
                                JMPF:
387
                                case(instruction[27:26])
388
                                        2'b00://jmpz
389
                                                $display("JMPZ PC 0x%0x + offset %0d",pc,$signed(offset_w));
390
                                        2'b01://jmpnz
391
                                                $display("JMPNZ PC 0x%0x + offset %0d",pc,$signed(offset_w));
392
                                        2'b10://jmpc
393
                                                $display("JMPC PC 0x%0x + offset %0d",pc,$signed(offset_w));
394
                                        2'b11://jmpnc
395
                                                $display("JMPNC PC 0x%0x + offset %0d",pc,$signed(offset_w));
396
                                endcase
397
 
398
                                //Arithmetic
399
                                ALU:
400
                                case(instruction[27:25])
401
                                        3'd0:$display("AND R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
402
                                        3'd1:$display("OR  R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
403
                                        3'd2:$display("XOR R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
404
                                        3'd3:$display("ADD R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
405
                                        3'd4:$display("MUL R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
406
                                        3'd5:$display("SHL R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
407
                                        3'd6:$display("SHR R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
408
                                        default:$display("CMP R%0d with R%0d+%d",pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
409
                                endcase
410
 
411
                                LDRF:
412
                                case(instruction[27:26])
413
                                        2'b00://ldrz
414
                                                $display("LDRZ R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
415
                                        2'b01://ldrnz
416
                                                $display("LDRNZ R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
417
                                        2'b10://ldrc
418
                                                $display("LDRC R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
419
                                        2'b11://ldrnc
420
                                                $display("LDRNC R%0d,R%0d,R%0d+%d",pipe_id_out_w.dst_r,pipe_id_out_w.src_r1,pipe_id_out_w.src_r2,$signed(pipe_id_out_w.incr_r2));
421
                                endcase
422
 
423
                                default:
424
                                        if(!reset)
425
                                        begin
426
                                                $display("Unknown Command %x",instruction[31:28]);
427
                                                $stop;
428
                                        end
429
                        endcase
430
                        end
431
                        else
432
                                $display("[ID stage] STALLED!",instruction[31:28]);
433
                end
434
//synthesys translate_on
435
        end
436
 
437
endmodule

powered by: WebSVN 2.1.0

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