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-3.1/] [rtl/] [verilog/] [mor1kx_execute_ctrl_cappuccino.v] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 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_MULTIPLIER = "THREESTAGE"
27
    )
28
   (
29
    input                                 clk,
30
    input                                 rst,
31
 
32
    input                                 padv_i,
33
    input                                 padv_ctrl_i,
34
 
35
    input                                 execute_except_ibus_err_i,
36
    input                                 execute_except_itlb_miss_i,
37
    input                                 execute_except_ipagefault_i,
38
    input                                 execute_except_illegal_i,
39
    input                                 execute_except_ibus_align_i,
40
    input                                 execute_except_syscall_i,
41
    input                                 lsu_except_dbus_i,
42
    input                                 lsu_except_align_i,
43
    input                                 lsu_except_dtlb_miss_i,
44
    input                                 lsu_except_dpagefault_i,
45
    input                                 execute_except_trap_i,
46
 
47
    input                                 pipeline_flush_i,
48
 
49
    input                                 op_mul_i,
50
 
51
    input                                 op_lsu_load_i,
52
    input                                 op_lsu_store_i,
53
    input                                 op_lsu_atomic_i,
54
    input [1:0]                    lsu_length_i,
55
    input                                 lsu_zext_i,
56
 
57
    input                                 op_mfspr_i,
58
    input                                 op_mtspr_i,
59
    input                                 alu_valid_i,
60
    input                                 lsu_valid_i,
61
 
62
    input                                 op_jr_i,
63
    input                                 op_jal_i,
64
    input                                 op_rfe_i,
65
 
66
    input [OPTION_OPERAND_WIDTH-1:0]       alu_result_i,
67
    input [OPTION_OPERAND_WIDTH-1:0]       adder_result_i,
68
    input [OPTION_OPERAND_WIDTH-1:0]       rfb_i,
69
    input [OPTION_OPERAND_WIDTH-1:0]       execute_jal_result_i,
70
    input                                 flag_set_i,
71
    input                                 flag_clear_i,
72
    input                                 carry_set_i,
73
    input                                 carry_clear_i,
74
    input                                 overflow_set_i,
75
    input                                 overflow_clear_i,
76
 
77
    input [OPTION_OPERAND_WIDTH-1:0]       pc_execute_i,
78
 
79
    input                                 execute_rf_wb_i,
80
    output reg                            ctrl_rf_wb_o,
81
    output reg                            wb_rf_wb_o,
82
 
83
 
84
    // address of destination register from execute stage
85
    input [OPTION_RF_ADDR_WIDTH-1:0]       execute_rfd_adr_i,
86
    output reg [OPTION_RF_ADDR_WIDTH-1:0] ctrl_rfd_adr_o,
87
    output reg [OPTION_RF_ADDR_WIDTH-1:0] wb_rfd_adr_o,
88
 
89
    input                                 execute_bubble_i,
90
 
91
    // Input from control stage for mfspr/mtspr ack
92
    input                                 ctrl_mfspr_ack_i,
93
    input                                 ctrl_mtspr_ack_i,
94
 
95
    output reg [OPTION_OPERAND_WIDTH-1:0] ctrl_alu_result_o,
96
    output reg [OPTION_OPERAND_WIDTH-1:0] ctrl_lsu_adr_o,
97
    output reg [OPTION_OPERAND_WIDTH-1:0] ctrl_rfb_o,
98
    output reg                            ctrl_flag_set_o,
99
    output reg                            ctrl_flag_clear_o,
100
    output reg                            ctrl_carry_set_o,
101
    output reg                            ctrl_carry_clear_o,
102
    output reg                            ctrl_overflow_set_o,
103
    output reg                            ctrl_overflow_clear_o,
104
 
105
    output reg [OPTION_OPERAND_WIDTH-1:0] pc_ctrl_o,
106
 
107
    output reg                            ctrl_op_mul_o,
108
 
109
    output reg                            ctrl_op_lsu_load_o,
110
    output reg                            ctrl_op_lsu_store_o,
111
    output reg                            ctrl_op_lsu_atomic_o,
112
    output reg [1:0]                       ctrl_lsu_length_o,
113
    output reg                            ctrl_lsu_zext_o,
114
 
115
    output reg                            ctrl_op_mfspr_o,
116
    output reg                            ctrl_op_mtspr_o,
117
 
118
    output reg                            ctrl_op_rfe_o,
119
 
120
    output reg                            ctrl_except_ibus_err_o,
121
    output reg                            ctrl_except_itlb_miss_o,
122
    output reg                            ctrl_except_ipagefault_o,
123
    output reg                            ctrl_except_ibus_align_o,
124
    output reg                            ctrl_except_illegal_o,
125
    output reg                            ctrl_except_syscall_o,
126
    output reg                            ctrl_except_dbus_o,
127
    output reg                            ctrl_except_dtlb_miss_o,
128
    output reg                            ctrl_except_dpagefault_o,
129
    output reg                            ctrl_except_align_o,
130
    output reg                            ctrl_except_trap_o,
131
 
132
    output                                execute_valid_o,
133
    output                                ctrl_valid_o
134
    );
135
 
136
   wire                                   ctrl_stall;
137
   wire                                   execute_stall;
138
 
139
   // LSU or MTSPR/MFSPR can stall from ctrl stage
140
   assign ctrl_stall = (ctrl_op_lsu_load_o | ctrl_op_lsu_store_o) &
141
                       !lsu_valid_i |
142
                       ctrl_op_mfspr_o & !ctrl_mfspr_ack_i |
143
                       ctrl_op_mtspr_o & !ctrl_mtspr_ack_i;
144
   assign ctrl_valid_o = !ctrl_stall;
145
 
146
   // Execute stage can be stalled from ctrl stage and by ALU
147
   assign execute_stall = ctrl_stall | !alu_valid_i;
148
   assign execute_valid_o = !execute_stall;
149
 
150
   always @(posedge clk `OR_ASYNC_RST)
151
     if (rst) begin
152
        ctrl_except_ibus_err_o <= 0;
153
        ctrl_except_itlb_miss_o <= 0;
154
        ctrl_except_ipagefault_o <= 0;
155
        ctrl_except_ibus_align_o <= 0;
156
        ctrl_except_illegal_o <= 0;
157
        ctrl_except_syscall_o <= 0;
158
        ctrl_except_trap_o <= 0;
159
        ctrl_except_dbus_o <= 0;
160
        ctrl_except_align_o <= 0;
161
     end
162
     else if (pipeline_flush_i) begin
163
        ctrl_except_ibus_err_o <= 0;
164
        ctrl_except_itlb_miss_o <= 0;
165
        ctrl_except_ipagefault_o <= 0;
166
        ctrl_except_ibus_align_o <= 0;
167
        ctrl_except_illegal_o <= 0;
168
        ctrl_except_syscall_o <= 0;
169
        ctrl_except_trap_o <= 0;
170
        ctrl_except_dbus_o <= 0;
171
        ctrl_except_align_o <= 0;
172
     end
173
     else begin
174
        if (padv_i) begin
175
           ctrl_except_ibus_err_o <= execute_except_ibus_err_i;
176
           ctrl_except_itlb_miss_o <= execute_except_itlb_miss_i;
177
           ctrl_except_ipagefault_o <= execute_except_ipagefault_i;
178
           ctrl_except_ibus_align_o <= execute_except_ibus_align_i;
179
           ctrl_except_illegal_o <= execute_except_illegal_i;
180
           ctrl_except_syscall_o <= execute_except_syscall_i;
181
           ctrl_except_trap_o <= execute_except_trap_i;
182
        end
183
        ctrl_except_dbus_o <= lsu_except_dbus_i;
184
        ctrl_except_align_o <= lsu_except_align_i;
185
        ctrl_except_dtlb_miss_o <= lsu_except_dtlb_miss_i;
186
        ctrl_except_dpagefault_o <= lsu_except_dpagefault_i;
187
     end
188
 
189
   always @(posedge clk)
190
     if (padv_i)
191
        if (op_jal_i)
192
          ctrl_alu_result_o <= execute_jal_result_i;
193
        else
194
          ctrl_alu_result_o <= alu_result_i;
195
 
196
   always @(posedge clk)
197
     if (padv_i & (op_lsu_store_i | op_lsu_load_i))
198
       ctrl_lsu_adr_o <= adder_result_i;
199
 
200
   always @(posedge clk)
201
     if (padv_i)
202
       ctrl_rfb_o <= rfb_i;
203
 
204
   always @(posedge clk `OR_ASYNC_RST)
205
     if (rst) begin
206
        ctrl_flag_set_o <= 0;
207
        ctrl_flag_clear_o <= 0;
208
        ctrl_carry_set_o <= 0;
209
        ctrl_carry_clear_o <= 0;
210
        ctrl_overflow_set_o <= 0;
211
        ctrl_overflow_clear_o <= 0;
212
     end
213
     else if (padv_i) begin
214
        ctrl_flag_set_o <= flag_set_i;
215
        ctrl_flag_clear_o <= flag_clear_i;
216
        ctrl_carry_set_o <= carry_set_i;
217
        ctrl_carry_clear_o <= carry_clear_i;
218
        ctrl_overflow_set_o <= overflow_set_i;
219
        ctrl_overflow_clear_o <= overflow_clear_i;
220
     end
221
 
222
   // pc_ctrl should not advance when a nop bubble moves from execute to
223
   // ctrl/mem stage
224
   always @(posedge clk `OR_ASYNC_RST)
225
     if (rst)
226
       pc_ctrl_o <= OPTION_RESET_PC;
227
     else if (padv_i & !execute_bubble_i)
228
       pc_ctrl_o <= pc_execute_i;
229
 
230
   //
231
   // The pipeline flush comes when the instruction that has caused
232
   // an exception or the instruction that has been interrupted is in
233
   // ctrl stage, so the padv_execute signal has to have higher prioity
234
   // than the pipeline flush in order to not accidently kill a valid
235
   // instruction coming in from execute stage.
236
   //
237
 
238
generate
239
if (FEATURE_MULTIPLIER=="PIPELINED") begin
240
   always @(posedge clk `OR_ASYNC_RST)
241
     if (rst)
242
       ctrl_op_mul_o <= 0;
243
     else if (padv_i)
244
       ctrl_op_mul_o <= op_mul_i;
245
     else if (pipeline_flush_i)
246
       ctrl_op_mul_o <= 0;
247
end else begin
248
   always @(posedge clk)
249
       ctrl_op_mul_o <= 0;
250
end
251
endgenerate
252
 
253
   always @(posedge clk `OR_ASYNC_RST)
254
     if (rst) begin
255
        ctrl_op_mfspr_o <= 0;
256
        ctrl_op_mtspr_o <= 0;
257
     end else if (padv_i) begin
258
        ctrl_op_mfspr_o <= op_mfspr_i;
259
        ctrl_op_mtspr_o <= op_mtspr_i;
260
     end else if (pipeline_flush_i) begin
261
        ctrl_op_mfspr_o <= 0;
262
        ctrl_op_mtspr_o <= 0;
263
     end
264
 
265
   always @(posedge clk `OR_ASYNC_RST)
266
     if (rst)
267
       ctrl_op_rfe_o <= 0;
268
     else if (padv_i)
269
       ctrl_op_rfe_o <= op_rfe_i;
270
     else if (pipeline_flush_i)
271
       ctrl_op_rfe_o <= 0;
272
 
273
   always @(posedge clk `OR_ASYNC_RST)
274
     if (rst) begin
275
        ctrl_op_lsu_load_o <= 0;
276
        ctrl_op_lsu_store_o <= 0;
277
        ctrl_op_lsu_atomic_o <= 0;
278
     end else if (ctrl_except_align_o | ctrl_except_dbus_o |
279
                  ctrl_except_dtlb_miss_o | ctrl_except_dpagefault_o) begin
280
        ctrl_op_lsu_load_o <= 0;
281
        ctrl_op_lsu_store_o <= 0;
282
        ctrl_op_lsu_atomic_o <= 0;
283
    end else if (padv_i) begin
284
        ctrl_op_lsu_load_o <= op_lsu_load_i;
285
        ctrl_op_lsu_store_o <= op_lsu_store_i;
286
        ctrl_op_lsu_atomic_o <= op_lsu_atomic_i;
287
     end else if (pipeline_flush_i) begin
288
        ctrl_op_lsu_load_o <= 0;
289
        ctrl_op_lsu_store_o <= 0;
290
        ctrl_op_lsu_atomic_o <= 0;
291
     end
292
 
293
   always @(posedge clk)
294
     if (padv_i) begin
295
        ctrl_lsu_length_o <= lsu_length_i;
296
        ctrl_lsu_zext_o <= lsu_zext_i;
297
     end
298
 
299
   always @(posedge clk `OR_ASYNC_RST)
300
     if (rst)
301
        ctrl_rf_wb_o <= 0;
302
     else if (padv_i)
303
        ctrl_rf_wb_o <= execute_rf_wb_i;
304
     else if (ctrl_op_mfspr_o & ctrl_mfspr_ack_i |
305
              ctrl_op_lsu_load_o & lsu_valid_i)
306
       // Deassert the write enable when the "bus" access is done, to avoid:
307
       // 1) Writing multiple times to RF
308
       // 2) Signaling a need to bypass from control stage, when it really
309
       //    should be a bypass from wb stage.
310
       ctrl_rf_wb_o <= 0;
311
     else if (pipeline_flush_i)
312
       ctrl_rf_wb_o <= 0;
313
 
314
   always @(posedge clk)
315
     if (padv_i)
316
       ctrl_rfd_adr_o <= execute_rfd_adr_i;
317
 
318
   // load and mfpsr can stall from ctrl stage, so we have to hold off the
319
   // write back on them
320
   always @(posedge clk `OR_ASYNC_RST)
321
     if (rst | pipeline_flush_i)
322
       wb_rf_wb_o <= 0;
323
     else if (ctrl_op_mfspr_o)
324
       wb_rf_wb_o <= ctrl_rf_wb_o & ctrl_mfspr_ack_i;
325
     else if (ctrl_op_lsu_load_o)
326
       wb_rf_wb_o <= ctrl_rf_wb_o & lsu_valid_i;
327
     else
328
       wb_rf_wb_o <= ctrl_rf_wb_o & padv_ctrl_i;
329
 
330
   always @(posedge clk)
331
     wb_rfd_adr_o <= ctrl_rfd_adr_o;
332
 
333
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.