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

Subversion Repositories mips32

[/] [mips32/] [trunk/] [Classic-MIPS/] [source/] [src/] [decode.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jjf
`timescale 1ns / 1ps
2
//////////////////////////////////////////////////////////////////////////////////
3
// Company: 
4
// Engineer: 
5
// 
6
// Create Date:    17:00:52 12/29/2016 
7
// Design Name: 
8
// Module Name:    registers 
9
// Project Name: 
10
// Target Devices: 
11
// Tool versions: 
12
// Description: 
13
//
14
// Dependencies: 
15
//
16
// Revision: 
17
// Revision 0.01 - File Created
18
// Additional Comments: 
19
//
20
//////////////////////////////////////////////////////////////////////////////////
21
`include "macros.v"
22
module decode(
23
input wire                                              clk,
24
input wire                                              rst,
25
input wire [31:0]               pc,
26
input wire [31:0]               instruction,
27
input wire                                              regwrite_flag,
28
input wire [4:0]                write_reg,
29
input wire [31:0]               write_data,
30
input wire                      isFlush,
31
input wire                      isCacheStall,
32
output reg [31:0]               reg1_data,
33
output reg [31:0]               reg2_data,
34
output reg signed [31:0]        reg_immediate,
35
output reg [31:0]               reg_instruction,
36
output reg [4:0]                reg_rt,
37
output reg [4:0]                reg_rd,
38
output reg [31:0]               reg_pc,
39
output reg [3:0]                reg_ctr_ex,
40
output reg [5:0]                reg_ctr_m,
41
output reg [1:0]                reg_ctr_wb,
42
output wire                     isHazard,
43
/* bypass interface */
44
input wire [4:0]                ex_write_reg,
45
input wire                      ex_regwrite_flag,
46
input wire [4:0]                mem_write_reg,
47
input wire                      mem_regwrite_flag,
48
output reg [1:0]                reg_forward_a,
49
output reg [1:0]                reg_forward_b,
50
output reg [3:0]                reg_ALUcmd,
51
input wire [1:0]                bht_token,
52
output reg [1:0]                reg_bht_token
53
    );
54
 
55
         /* define 32 32-bit width register */
56
         reg    [31:0]                           registers[31:0];
57
 
58
         /* the CPU control signals */
59
         wire                    c_regdst_flag;
60
     wire [1:0]              c_jump_flag;
61
     wire [1:0]              c_branch_flag;
62
     wire                    c_memread_flag;
63
     wire                    c_memtoReg_flag;
64
     wire [1:0]              c_ALUOp;
65
     wire                    c_memwrite_flag;
66
     wire                    c_ALUSrc_flag;
67
     wire                    c_regwrite_flag;
68
 
69
         /* the register indes */
70
         wire [4:0]                rs;
71
         wire [4:0]                rt;
72
         wire [4:0]                rd;
73
         integer                   index;
74
 
75
         assign rs = instruction[25:21];
76
         assign rt = instruction[20:16];
77
         assign rd = instruction[15:11];
78
 
79
         /* detech the Hazard of LW instruction */
80
         assign isHazard = (reg_ctr_m[1] == 1'b1) && ( (reg_rt == rs) || (reg_rt == rt));
81
 
82
 
83
         wire [1:0]                    forward_a;
84
         wire [1:0]                    forward_b;
85
          /* instantiate of the bypass control unit */
86
      bypath_ctr bypath_ctr_inst(
87
        .id_ex_rs(                  rs                          ),
88
        .id_ex_rt(                  rt                          ),
89
        .ex_mem_rd(                 ex_write_reg                ),
90
        .mem_wb_rd(                 mem_write_reg             ),
91
        .ex_mem_regwrite_flag(      ex_regwrite_flag               ),
92
        .mem_wb_regwrite_flag(      mem_regwrite_flag           ),
93
        .forward_a(                 forward_a                   ),
94
        .forward_b(                 forward_b                   )
95
      );
96
 
97
      /* save the registers to the next stage */
98
      always @(posedge clk)
99
      begin
100
        if( rst )
101
        begin
102
            reg_forward_a <= 0;
103
            reg_forward_b <= 0;
104
            reg_rt <= 0;
105
            reg_rd <= 0;
106
            reg_pc <= 0;
107
            reg_instruction <= 0;
108
            reg_immediate <= 0;
109
            reg1_data <= 0;
110
            reg2_data <= 0;
111
        end
112
        else
113
        begin
114
            if( isFlush )
115
            begin
116
                reg_forward_a <= 0;
117
                reg_forward_b <= 0;
118
                reg_rt <= 0;
119
                reg_rd <= 0;
120
                reg_pc <= 0;
121
                reg_instruction <= 0;
122
                reg_immediate <= 0;
123
                reg1_data <= 0;
124
                reg2_data <= 0;
125
            end
126
            else if( isCacheStall || isHazard )
127
            begin
128
                reg_forward_a <= reg_forward_a;
129
                reg_forward_b <= reg_forward_b;
130
                reg_rt <= reg_rt;
131
                reg_rd <= reg_rd;
132
                reg_pc <= reg_pc;
133
                reg_instruction <= reg_instruction;
134
                reg_immediate <= reg_immediate;
135
                reg1_data <= reg1_data;
136
                reg2_data <= reg2_data;
137
            end
138
            else
139
            begin
140
                reg_forward_a <= forward_a;
141
                reg_forward_b <= forward_b;
142
                reg_rd <= rd;
143
                if( c_jump_flag == `JUMP_JAL)
144
                    reg_rt <= 5'd31;
145
                else
146
                    reg_rt <= rt;
147
                reg_pc <= pc;
148
                reg_instruction <= instruction;
149
                reg_immediate <= instruction[15] ? {16'hFFFF, instruction[15:0]} : {16'h0, instruction[15:0]};
150
                /* create a bypath for reg1_data */
151
                if( regwrite_flag && write_reg == rs)
152
                    reg1_data <= write_data;
153
                else
154
                    reg1_data <= registers[rs];
155
                /* create a bypath for reg2_data */
156
                if(regwrite_flag && write_reg == rt)
157
                    reg2_data <= write_data;
158
                else
159
                    reg2_data <= registers[rt];
160
            end
161
        end
162
      end
163
 
164
 
165
         /* write the register */
166
         always @(posedge clk)
167
         begin
168
                if( rst )
169
                        begin
170
                                for( index = 0; index < 32; index = index + 1)
171
                                begin
172
                                        registers[ index ] <= 0;
173
                                end
174
                        end
175
                else
176
                        begin
177
                                if( regwrite_flag )
178
                                        registers[ write_reg ] <= write_data;
179
                        end
180
         end
181
 
182
         // Instantiate of the ALU_ctr
183
         wire [5:0]    opcode;
184
         wire [5:0]    funct;
185
         wire [3:0]    ALUcmd;
186
         assign opcode = instruction[31:26];
187
         assign funct = instruction[5:0];
188
     ALU_Ctr ALU_Ctr_inst (
189
         .opcode(       opcode        ),
190
         .funct(        funct         ),
191
         .ALUOp(        c_ALUOp       ),
192
         .cmd(          ALUcmd        )
193
     );
194
 
195
         /* generate the CPU control signals in the decode stage */
196
         CPU_Ctr CPU_Ctr_inst (
197
         .instruction(        instruction         ),
198
         .regdst_flag(        c_regdst_flag        ),
199
         .jump_flag(          c_jump_flag        ),
200
         .branch_flag(        c_branch_flag        ),
201
         .memread_flag(       c_memread_flag    ),
202
         .memtoReg_flag(      c_memtoReg_flag    ),
203
         .ALUOp(              c_ALUOp            ),
204
         .memwrite_flag(      c_memwrite_flag    ),
205
         .ALUSrc_flag(        c_ALUSrc_flag        ),
206
         .regwrite_flag(      c_regwrite_flag    )
207
         );
208
         /* combine and save the control signals */
209
         always @(posedge clk)
210
         begin
211
           if( rst )
212
           begin
213
               reg_ctr_wb <= 0;
214
               reg_ctr_m <= 0;
215
               reg_ctr_ex <= 0;
216
               reg_bht_token <= 0;
217
               reg_ALUcmd <= 0;
218
           end
219
           else
220
           begin
221
               if( isCacheStall )
222
               begin
223
                   reg_ctr_ex <= reg_ctr_ex;
224
                   reg_ctr_m <= reg_ctr_m;
225
                   reg_ctr_wb <= reg_ctr_wb;
226
                   reg_ALUcmd <= reg_ALUcmd;
227
                   reg_bht_token <= reg_bht_token;
228
               end
229
               /* clear the control signals when found the Hazard or Flush  */
230
               else if( isHazard || isFlush )
231
               begin
232
                   reg_ctr_ex <= 0;
233
                   reg_ctr_m <= 0;
234
                   reg_ctr_wb <= 0;
235
                   reg_ALUcmd <= 0;
236
                   reg_bht_token <= 0;
237
               end
238
               else
239
               begin
240
                   reg_ALUcmd <= ALUcmd;
241
                   /* control signals for EX stage */
242
                   reg_ctr_ex[0] <= c_ALUSrc_flag;
243
                   reg_ctr_ex[2:1] <= c_ALUOp;
244
                   reg_ctr_ex[3] <= c_regdst_flag;
245
                   /* control signals for M stage */
246
                   reg_ctr_m[0] <= c_memwrite_flag;
247
                   reg_ctr_m[1] <= c_memread_flag;
248
                   reg_ctr_m[3:2] <= c_branch_flag;
249
                   reg_ctr_m[5:4] <= c_jump_flag;
250
                   /* control signals for WB stage */
251
                   reg_ctr_wb[0] <= c_memtoReg_flag;
252
                   reg_ctr_wb[1] <= c_regwrite_flag;
253
                   /* the bht_token */
254
                   reg_bht_token <= bht_token;
255
               end
256
           end
257
         end
258
 
259
 
260
endmodule

powered by: WebSVN 2.1.0

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