OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-5.0/] [rtl/] [verilog/] [mor1kx_execute_ctrl_cappuccino.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
/* ****************************************************************************
2
  This Source Code Form is subject to the terms of the
3
  Open Hardware Description License, v. 1.0. If a copy
4
  of the OHDL was not distributed with this file, You
5
  can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
  Description: execute to control stage signal passing
8
 
9
  Generate valid signal when stage is done
10
 
11
  Copyright (C) 2012 Authors
12
 
13
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
14
             Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
15
 
16
***************************************************************************** */
17
 
18
`include "mor1kx-defines.v"
19
 
20
module mor1kx_execute_ctrl_cappuccino
21
  #(
22
    parameter OPTION_OPERAND_WIDTH = 32,
23
    parameter OPTION_RESET_PC = {{(OPTION_OPERAND_WIDTH-13){1'b0}},
24
                                 `OR1K_RESET_VECTOR,8'd0},
25
    parameter OPTION_RF_ADDR_WIDTH = 5,
26
    parameter FEATURE_FPU   = "NONE", // ENABLED|NONE
27
    parameter FEATURE_MULTIPLIER = "THREESTAGE"
28
    )
29
   (
30
    input                                 clk,
31
    input                                 rst,
32
 
33
    input                                 padv_i,
34
    input                                 padv_ctrl_i,
35
 
36
    input                                 execute_except_ibus_err_i,
37
    input                                 execute_except_itlb_miss_i,
38
    input                                 execute_except_ipagefault_i,
39
    input                                 execute_except_illegal_i,
40
    input                                 execute_except_ibus_align_i,
41
    input                                 execute_except_syscall_i,
42
    input                                 lsu_except_dbus_i,
43
    input                                 lsu_except_align_i,
44
    input                                 lsu_except_dtlb_miss_i,
45
    input                                 lsu_except_dpagefault_i,
46
    input                                 execute_except_trap_i,
47
 
48
    input                                 pipeline_flush_i,
49
 
50
    input                                 op_mul_i,
51
 
52
    input                                 op_lsu_load_i,
53
    input                                 op_lsu_store_i,
54
    input                                 op_lsu_atomic_i,
55
    input [1:0]                    lsu_length_i,
56
    input                                 lsu_zext_i,
57
 
58
    input                                 op_msync_i,
59
 
60
    input                                 op_mfspr_i,
61
    input                                 op_mtspr_i,
62
    input                                 alu_valid_i,
63
    input                                 lsu_valid_i,
64
 
65
    input                                 msync_stall_i,
66
 
67
    input                                 op_jr_i,
68
    input                                 op_jal_i,
69
    input                                 op_rfe_i,
70
 
71
    input [OPTION_OPERAND_WIDTH-1:0]       alu_result_i,
72
    input [OPTION_OPERAND_WIDTH-1:0]       adder_result_i,
73
    input [OPTION_OPERAND_WIDTH-1:0]       rfb_i,
74
    input [OPTION_OPERAND_WIDTH-1:0]       execute_jal_result_i,
75
    input                                 flag_set_i,
76
    input                                 flag_clear_i,
77
    input                                 carry_set_i,
78
    input                                 carry_clear_i,
79
    input                                 overflow_set_i,
80
    input                                 overflow_clear_i,
81
 
82
    input [`OR1K_FPCSR_WIDTH-1:0]         fpcsr_i,
83
    input                                 fpcsr_set_i,
84
 
85
 
86
    input [OPTION_OPERAND_WIDTH-1:0]       pc_execute_i,
87
 
88
    input                                 execute_rf_wb_i,
89
    output reg                            ctrl_rf_wb_o,
90
    output reg                            wb_rf_wb_o,
91
 
92
 
93
    // address of destination register from execute stage
94
    input [OPTION_RF_ADDR_WIDTH-1:0]       execute_rfd_adr_i,
95
    output reg [OPTION_RF_ADDR_WIDTH-1:0] ctrl_rfd_adr_o,
96
    output reg [OPTION_RF_ADDR_WIDTH-1:0] wb_rfd_adr_o,
97
 
98
    input                                 execute_bubble_i,
99
 
100
    // Input from control stage for mfspr/mtspr ack
101
    input                                 ctrl_mfspr_ack_i,
102
    input                                 ctrl_mtspr_ack_i,
103
 
104
    output reg [OPTION_OPERAND_WIDTH-1:0] ctrl_alu_result_o,
105
    output reg [OPTION_OPERAND_WIDTH-1:0] ctrl_lsu_adr_o,
106
    output reg [OPTION_OPERAND_WIDTH-1:0] ctrl_rfb_o,
107
    output reg                            ctrl_flag_set_o,
108
    output reg                            ctrl_flag_clear_o,
109
    output reg                            ctrl_carry_set_o,
110
    output reg                            ctrl_carry_clear_o,
111
    output reg                            ctrl_overflow_set_o,
112
    output reg                            ctrl_overflow_clear_o,
113
 
114
    output reg [`OR1K_FPCSR_WIDTH-1:0]    ctrl_fpcsr_o,
115
    output reg                            ctrl_fpcsr_set_o,
116
 
117
 
118
    output reg [OPTION_OPERAND_WIDTH-1:0] pc_ctrl_o,
119
 
120
    output reg                            ctrl_op_mul_o,
121
 
122
    output reg                            ctrl_op_lsu_load_o,
123
    output reg                            ctrl_op_lsu_store_o,
124
    output reg                            ctrl_op_lsu_atomic_o,
125
    output reg [1:0]                       ctrl_lsu_length_o,
126
    output reg                            ctrl_lsu_zext_o,
127
 
128
    output reg                            ctrl_op_msync_o,
129
 
130
    output reg                            ctrl_op_mfspr_o,
131
    output reg                            ctrl_op_mtspr_o,
132
 
133
    output reg                            ctrl_op_rfe_o,
134
 
135
    output reg                            ctrl_except_ibus_err_o,
136
    output reg                            ctrl_except_itlb_miss_o,
137
    output reg                            ctrl_except_ipagefault_o,
138
    output reg                            ctrl_except_ibus_align_o,
139
    output reg                            ctrl_except_illegal_o,
140
    output reg                            ctrl_except_syscall_o,
141
    output reg                            ctrl_except_dbus_o,
142
    output reg                            ctrl_except_dtlb_miss_o,
143
    output reg                            ctrl_except_dpagefault_o,
144
    output reg                            ctrl_except_align_o,
145
    output reg                            ctrl_except_trap_o,
146
 
147
    output                                execute_valid_o,
148
    output                                ctrl_valid_o
149
    );
150
 
151
   wire                                   ctrl_stall;
152
   wire                                   execute_stall;
153
 
154
   // LSU or MTSPR/MFSPR can stall from ctrl stage
155
   assign ctrl_stall = (ctrl_op_lsu_load_o | ctrl_op_lsu_store_o) &
156
                       !lsu_valid_i |
157
                       ctrl_op_msync_o & msync_stall_i |
158
                       ctrl_op_mfspr_o & !ctrl_mfspr_ack_i |
159
                       ctrl_op_mtspr_o & !ctrl_mtspr_ack_i;
160
   assign ctrl_valid_o = !ctrl_stall;
161
 
162
   // Execute stage can be stalled from ctrl stage and by ALU
163
   assign execute_stall = ctrl_stall | !alu_valid_i;
164
   assign execute_valid_o = !execute_stall;
165
 
166
   always @(posedge clk `OR_ASYNC_RST)
167
     if (rst) begin
168
        ctrl_except_ibus_err_o <= 0;
169
        ctrl_except_itlb_miss_o <= 0;
170
        ctrl_except_ipagefault_o <= 0;
171
        ctrl_except_ibus_align_o <= 0;
172
        ctrl_except_illegal_o <= 0;
173
        ctrl_except_syscall_o <= 0;
174
        ctrl_except_trap_o <= 0;
175
        ctrl_except_dbus_o <= 0;
176
        ctrl_except_align_o <= 0;
177
     end
178
     else if (pipeline_flush_i) begin
179
        ctrl_except_ibus_err_o <= 0;
180
        ctrl_except_itlb_miss_o <= 0;
181
        ctrl_except_ipagefault_o <= 0;
182
        ctrl_except_ibus_align_o <= 0;
183
        ctrl_except_illegal_o <= 0;
184
        ctrl_except_syscall_o <= 0;
185
        ctrl_except_trap_o <= 0;
186
        ctrl_except_dbus_o <= 0;
187
        ctrl_except_align_o <= 0;
188
     end
189
     else begin
190
        if (padv_i) begin
191
           ctrl_except_ibus_err_o <= execute_except_ibus_err_i;
192
           ctrl_except_itlb_miss_o <= execute_except_itlb_miss_i;
193
           ctrl_except_ipagefault_o <= execute_except_ipagefault_i;
194
           ctrl_except_ibus_align_o <= execute_except_ibus_align_i;
195
           ctrl_except_illegal_o <= execute_except_illegal_i;
196
           ctrl_except_syscall_o <= execute_except_syscall_i;
197
           ctrl_except_trap_o <= execute_except_trap_i;
198
        end
199
        ctrl_except_dbus_o <= lsu_except_dbus_i;
200
        ctrl_except_align_o <= lsu_except_align_i;
201
        ctrl_except_dtlb_miss_o <= lsu_except_dtlb_miss_i;
202
        ctrl_except_dpagefault_o <= lsu_except_dpagefault_i;
203
     end
204
 
205
   always @(posedge clk)
206
     if (padv_i)
207
        if (op_jal_i)
208
          ctrl_alu_result_o <= execute_jal_result_i;
209
        else
210
          ctrl_alu_result_o <= alu_result_i;
211
 
212
   always @(posedge clk)
213
     if (padv_i & (op_lsu_store_i | op_lsu_load_i))
214
       ctrl_lsu_adr_o <= adder_result_i;
215
 
216
   always @(posedge clk)
217
     if (padv_i)
218
       ctrl_rfb_o <= rfb_i;
219
 
220
   always @(posedge clk `OR_ASYNC_RST)
221
     if (rst) begin
222
        ctrl_flag_set_o <= 0;
223
        ctrl_flag_clear_o <= 0;
224
        ctrl_carry_set_o <= 0;
225
        ctrl_carry_clear_o <= 0;
226
        ctrl_overflow_set_o <= 0;
227
        ctrl_overflow_clear_o <= 0;
228
     end
229
     else if (padv_i) begin
230
        ctrl_flag_set_o <= flag_set_i;
231
        ctrl_flag_clear_o <= flag_clear_i;
232
        ctrl_carry_set_o <= carry_set_i;
233
        ctrl_carry_clear_o <= carry_clear_i;
234
        ctrl_overflow_set_o <= overflow_set_i;
235
        ctrl_overflow_clear_o <= overflow_clear_i;
236
     end
237
 
238
   // pc_ctrl should not advance when a nop bubble moves from execute to
239
   // ctrl/mem stage
240
   always @(posedge clk `OR_ASYNC_RST)
241
     if (rst)
242
       pc_ctrl_o <= OPTION_RESET_PC;
243
     else if (padv_i & !execute_bubble_i)
244
       pc_ctrl_o <= pc_execute_i;
245
 
246
   //
247
   // The pipeline flush comes when the instruction that has caused
248
   // an exception or the instruction that has been interrupted is in
249
   // ctrl stage, so the padv_execute signal has to have higher prioity
250
   // than the pipeline flush in order to not accidently kill a valid
251
   // instruction coming in from execute stage.
252
   //
253
 
254
generate
255
if (FEATURE_MULTIPLIER=="PIPELINED") begin
256
   always @(posedge clk `OR_ASYNC_RST)
257
     if (rst)
258
       ctrl_op_mul_o <= 0;
259
     else if (padv_i)
260
       ctrl_op_mul_o <= op_mul_i;
261
     else if (pipeline_flush_i)
262
       ctrl_op_mul_o <= 0;
263
end else begin
264
   always @(posedge clk)
265
       ctrl_op_mul_o <= 0;
266
end
267
endgenerate
268
 
269
   // FPU related
270
   generate
271
     /* verilator lint_off WIDTH */
272
     if (FEATURE_FPU!="NONE") begin : fpu_execute_ctrl_ena
273
     /* verilator lint_on WIDTH */
274
       always @(posedge clk `OR_ASYNC_RST) begin
275
         if (rst) begin
276
           ctrl_fpcsr_o <= {`OR1K_FPCSR_WIDTH{1'b0}};
277
           ctrl_fpcsr_set_o <= 0;
278
         end else if (pipeline_flush_i) begin
279
           ctrl_fpcsr_o <= {`OR1K_FPCSR_WIDTH{1'b0}};
280
           ctrl_fpcsr_set_o <= 0;
281
         end else if (padv_i) begin
282
           ctrl_fpcsr_o <= fpcsr_i;
283
           ctrl_fpcsr_set_o <= fpcsr_set_i;
284
         end
285
       end // @clk
286
     end
287
     else begin : fpu_execute_ctrl_none
288
       always @(posedge clk `OR_ASYNC_RST) begin
289
         if (rst) begin
290
           ctrl_fpcsr_o <= {`OR1K_FPCSR_WIDTH{1'b0}};
291
           ctrl_fpcsr_set_o <= 0;
292
         end
293
       end // @clk
294
     end
295
   endgenerate // FPU related
296
 
297
   always @(posedge clk `OR_ASYNC_RST)
298
     if (rst) begin
299
        ctrl_op_mfspr_o <= 0;
300
        ctrl_op_mtspr_o <= 0;
301
     end else if (padv_i) begin
302
        ctrl_op_mfspr_o <= op_mfspr_i;
303
        ctrl_op_mtspr_o <= op_mtspr_i;
304
     end else if (pipeline_flush_i) begin
305
        ctrl_op_mfspr_o <= 0;
306
        ctrl_op_mtspr_o <= 0;
307
     end
308
 
309
   always @(posedge clk `OR_ASYNC_RST)
310
     if (rst)
311
       ctrl_op_rfe_o <= 0;
312
     else if (padv_i)
313
       ctrl_op_rfe_o <= op_rfe_i;
314
     else if (pipeline_flush_i)
315
       ctrl_op_rfe_o <= 0;
316
 
317
   always @(posedge clk `OR_ASYNC_RST)
318
     if (rst)
319
       ctrl_op_msync_o <= 0;
320
     else if (padv_i)
321
       ctrl_op_msync_o <= op_msync_i;
322
     else if (pipeline_flush_i)
323
       ctrl_op_msync_o <= 0;
324
 
325
   always @(posedge clk `OR_ASYNC_RST)
326
     if (rst) begin
327
        ctrl_op_lsu_load_o <= 0;
328
        ctrl_op_lsu_store_o <= 0;
329
        ctrl_op_lsu_atomic_o <= 0;
330
     end else if (ctrl_except_align_o | ctrl_except_dbus_o |
331
                  ctrl_except_dtlb_miss_o | ctrl_except_dpagefault_o) begin
332
        ctrl_op_lsu_load_o <= 0;
333
        ctrl_op_lsu_store_o <= 0;
334
        ctrl_op_lsu_atomic_o <= 0;
335
    end else if (padv_i) begin
336
        ctrl_op_lsu_load_o <= op_lsu_load_i;
337
        ctrl_op_lsu_store_o <= op_lsu_store_i;
338
        ctrl_op_lsu_atomic_o <= op_lsu_atomic_i;
339
     end else if (pipeline_flush_i) begin
340
        ctrl_op_lsu_load_o <= 0;
341
        ctrl_op_lsu_store_o <= 0;
342
        ctrl_op_lsu_atomic_o <= 0;
343
     end
344
 
345
   always @(posedge clk)
346
     if (padv_i) begin
347
        ctrl_lsu_length_o <= lsu_length_i;
348
        ctrl_lsu_zext_o <= lsu_zext_i;
349
     end
350
 
351
   always @(posedge clk `OR_ASYNC_RST)
352
     if (rst)
353
        ctrl_rf_wb_o <= 0;
354
     else if (padv_i)
355
        ctrl_rf_wb_o <= execute_rf_wb_i;
356
     else if (ctrl_op_mfspr_o & ctrl_mfspr_ack_i |
357
              ctrl_op_lsu_load_o & lsu_valid_i)
358
       // Deassert the write enable when the "bus" access is done, to avoid:
359
       // 1) Writing multiple times to RF
360
       // 2) Signaling a need to bypass from control stage, when it really
361
       //    should be a bypass from wb stage.
362
       ctrl_rf_wb_o <= 0;
363
     else if (pipeline_flush_i)
364
       ctrl_rf_wb_o <= 0;
365
 
366
   always @(posedge clk)
367
     if (padv_i)
368
       ctrl_rfd_adr_o <= execute_rfd_adr_i;
369
 
370
   // load and mfpsr can stall from ctrl stage, so we have to hold off the
371
   // write back on them
372
   always @(posedge clk `OR_ASYNC_RST)
373
     if (rst)
374
       wb_rf_wb_o <= 0;
375
     else if (pipeline_flush_i)
376
       wb_rf_wb_o <= 0;
377
     else if (ctrl_op_mfspr_o)
378
       wb_rf_wb_o <= ctrl_rf_wb_o & ctrl_mfspr_ack_i;
379
     else if (ctrl_op_lsu_load_o)
380
       wb_rf_wb_o <= ctrl_rf_wb_o & lsu_valid_i;
381
     else
382
       wb_rf_wb_o <= ctrl_rf_wb_o & padv_ctrl_i;
383
 
384
   always @(posedge clk)
385
     wb_rfd_adr_o <= ctrl_rfd_adr_o;
386
 
387
endmodule // mor1kx_execute_ctrl_cappuccino

powered by: WebSVN 2.1.0

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