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_cpu.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: CPU wrapper module
8
 
9
  Allows selection of CPU pipeline implementation based on parameter.
10
 
11
  Also provides some API-like hooks into the pipeline for monitors.
12
 
13
  Copyright (C) 2012 Authors
14
 
15
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
16
 
17
***************************************************************************** */
18
 
19
`include "mor1kx-defines.v"
20
 
21
module mor1kx_cpu
22
  #(
23
    parameter OPTION_OPERAND_WIDTH      = 32,
24
 
25
    parameter OPTION_CPU                = "CAPPUCCINO",
26
 
27
    parameter FEATURE_DATACACHE         = "NONE",
28
    parameter OPTION_DCACHE_BLOCK_WIDTH = 5,
29
    parameter OPTION_DCACHE_SET_WIDTH   = 9,
30
    parameter OPTION_DCACHE_WAYS        = 2,
31
    parameter OPTION_DCACHE_LIMIT_WIDTH = 32,
32
    parameter OPTION_DCACHE_SNOOP = "NONE",
33
    parameter FEATURE_DMMU              = "NONE",
34
    parameter FEATURE_DMMU_HW_TLB_RELOAD = "NONE",
35
    parameter OPTION_DMMU_SET_WIDTH     = 6,
36
    parameter OPTION_DMMU_WAYS          = 1,
37
    parameter FEATURE_INSTRUCTIONCACHE  = "NONE",
38
    parameter OPTION_ICACHE_BLOCK_WIDTH = 5,
39
    parameter OPTION_ICACHE_SET_WIDTH   = 9,
40
    parameter OPTION_ICACHE_WAYS        = 2,
41
    parameter OPTION_ICACHE_LIMIT_WIDTH = 32,
42
    parameter FEATURE_IMMU              = "NONE",
43
    parameter FEATURE_IMMU_HW_TLB_RELOAD = "NONE",
44
    parameter OPTION_IMMU_SET_WIDTH     = 6,
45
    parameter OPTION_IMMU_WAYS          = 1,
46
    parameter FEATURE_TIMER             = "ENABLED",
47
    parameter FEATURE_DEBUGUNIT         = "NONE",
48
    parameter FEATURE_PERFCOUNTERS      = "NONE",
49
    parameter OPTION_PERFCOUNTERS_NUM   = 0,
50
    parameter FEATURE_MAC               = "NONE",
51
 
52
    parameter FEATURE_SYSCALL           = "ENABLED",
53
    parameter FEATURE_TRAP              = "ENABLED",
54
    parameter FEATURE_RANGE             = "ENABLED",
55
 
56
    parameter FEATURE_PIC               = "ENABLED",
57
    parameter OPTION_PIC_TRIGGER        = "LEVEL",
58
    parameter OPTION_PIC_NMI_WIDTH      = 0,
59
 
60
    parameter FEATURE_DSX               = "NONE",
61
    parameter FEATURE_OVERFLOW          = "NONE",
62
    parameter FEATURE_CARRY_FLAG        = "ENABLED",
63
 
64
    parameter FEATURE_FASTCONTEXTS      = "NONE",
65
    parameter OPTION_RF_CLEAR_ON_INIT   = 0,
66
    parameter OPTION_RF_NUM_SHADOW_GPR  = 0,
67
    parameter OPTION_RF_ADDR_WIDTH      = 5,
68
    parameter OPTION_RF_WORDS           = 32,
69
 
70
    parameter OPTION_RESET_PC           = {{(OPTION_OPERAND_WIDTH-13){1'b0}},
71
                                           `OR1K_RESET_VECTOR,8'd0},
72
 
73
    parameter OPTION_TCM_FETCHER        = "DISABLED",
74
 
75
    parameter FEATURE_MULTIPLIER        = "THREESTAGE",
76
    parameter FEATURE_DIVIDER           = "NONE",
77
 
78
    parameter OPTION_SHIFTER            = "BARREL",
79
 
80
    parameter FEATURE_ADDC              = "NONE",
81
    parameter FEATURE_SRA               = "ENABLED",
82
    parameter FEATURE_ROR               = "NONE",
83
    parameter FEATURE_EXT               = "NONE",
84
    parameter FEATURE_CMOV              = "NONE",
85
    parameter FEATURE_FFL1              = "NONE",
86
    parameter FEATURE_MSYNC             = "ENABLED",
87
    parameter FEATURE_PSYNC             = "NONE",
88
    parameter FEATURE_CSYNC             = "NONE",
89
    parameter FEATURE_ATOMIC            = "ENABLED",
90
 
91
    parameter FEATURE_FPU               = "NONE", // ENABLED|NONE
92
 
93
    parameter FEATURE_CUST1             = "NONE",
94
    parameter FEATURE_CUST2             = "NONE",
95
    parameter FEATURE_CUST3             = "NONE",
96
    parameter FEATURE_CUST4             = "NONE",
97
    parameter FEATURE_CUST5             = "NONE",
98
    parameter FEATURE_CUST6             = "NONE",
99
    parameter FEATURE_CUST7             = "NONE",
100
    parameter FEATURE_CUST8             = "NONE",
101
 
102
    parameter FEATURE_STORE_BUFFER      = "ENABLED",
103
    parameter OPTION_STORE_BUFFER_DEPTH_WIDTH = 8,
104
 
105
    parameter FEATURE_MULTICORE = "NONE",
106
 
107
    parameter FEATURE_TRACEPORT_EXEC = "NONE",
108
    parameter FEATURE_BRANCH_PREDICTOR = "SIMPLE"
109
    )
110
   (
111
    input                             clk,
112
    input                             rst,
113
 
114
    // Instruction bus
115
    input                             ibus_err_i,
116
    input                             ibus_ack_i,
117
    input [`OR1K_INSN_WIDTH-1:0]      ibus_dat_i,
118
    output [OPTION_OPERAND_WIDTH-1:0] ibus_adr_o,
119
    output                            ibus_req_o,
120
    output                            ibus_burst_o,
121
 
122
    // Data bus
123
    input                             dbus_err_i,
124
    input                             dbus_ack_i,
125
    input [OPTION_OPERAND_WIDTH-1:0]  dbus_dat_i,
126
    output [OPTION_OPERAND_WIDTH-1:0] dbus_adr_o,
127
    output [OPTION_OPERAND_WIDTH-1:0] dbus_dat_o,
128
    output                            dbus_req_o,
129
    output [3:0]                       dbus_bsel_o,
130
    output                            dbus_we_o,
131
    output                            dbus_burst_o,
132
 
133
    // Interrupts
134
    input [31:0]                       irq_i,
135
 
136
    // Debug interface
137
    input [15:0]                       du_addr_i,
138
    input                             du_stb_i,
139
    input [OPTION_OPERAND_WIDTH-1:0]  du_dat_i,
140
    input                             du_we_i,
141
    output [OPTION_OPERAND_WIDTH-1:0] du_dat_o,
142
    output                            du_ack_o,
143
    // Stall control from debug interface
144
    input                             du_stall_i,
145
    output                            du_stall_o,
146
 
147
    output                            traceport_exec_valid_o,
148
    output [31:0]                     traceport_exec_pc_o,
149
    output                            traceport_exec_jb_o,
150
    output                            traceport_exec_jal_o,
151
    output                            traceport_exec_jr_o,
152
    output [31:0]                     traceport_exec_jbtarget_o,
153
    output [`OR1K_INSN_WIDTH-1:0]     traceport_exec_insn_o,
154
    output [OPTION_OPERAND_WIDTH-1:0] traceport_exec_wbdata_o,
155
    output [OPTION_RF_ADDR_WIDTH-1:0] traceport_exec_wbreg_o,
156
    output                           traceport_exec_wben_o,
157
 
158
    // SPR accesses to external units (cache, mmu, etc.)
159
    output [15:0]                      spr_bus_addr_o,
160
    output                            spr_bus_we_o,
161
    output                            spr_bus_stb_o,
162
    output [OPTION_OPERAND_WIDTH-1:0] spr_bus_dat_o,
163
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_dmmu_i,
164
    input                             spr_bus_ack_dmmu_i,
165
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_immu_i,
166
    input                             spr_bus_ack_immu_i,
167
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_mac_i,
168
    input                             spr_bus_ack_mac_i,
169
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_pmu_i,
170
    input                             spr_bus_ack_pmu_i,
171
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_pcu_i,
172
    input                             spr_bus_ack_pcu_i,
173
    input [OPTION_OPERAND_WIDTH-1:0]  spr_bus_dat_fpu_i,
174
    input                             spr_bus_ack_fpu_i,
175
    output [15:0]                      spr_sr_o,
176
 
177
    // The multicore core identifier
178
    input [OPTION_OPERAND_WIDTH-1:0]  multicore_coreid_i,
179
    // The number of cores
180
    input [OPTION_OPERAND_WIDTH-1:0]  multicore_numcores_i,
181
 
182
    input [31:0]                      snoop_adr_i,
183
    input                            snoop_en_i
184
    );
185
 
186
   wire [`OR1K_INSN_WIDTH-1:0]        monitor_execute_insn/* verilator public */;
187
   wire                              monitor_execute_advance/* verilator public */;
188
   wire                              monitor_flag_set/* verilator public */;
189
   wire                              monitor_flag_clear/* verilator public */;
190
   wire                              monitor_flag_sr/* verilator public */;
191
   wire                              monitor_flag/* verilator public */;
192
   wire [OPTION_OPERAND_WIDTH-1:0]   monitor_spr_sr/* verilator public */;
193
   wire [OPTION_OPERAND_WIDTH-1:0]   monitor_execute_pc/* verilator public */;
194
   wire [OPTION_OPERAND_WIDTH-1:0]   monitor_rf_result_in/* verilator public */;
195
   wire                              monitor_clk/* verilator public */;
196
   wire [OPTION_OPERAND_WIDTH-1:0]   monitor_spr_epcr/* verilator public */;
197
   wire [OPTION_OPERAND_WIDTH-1:0]   monitor_spr_eear/* verilator public */;
198
   wire [OPTION_OPERAND_WIDTH-1:0]   monitor_spr_esr/* verilator public */;
199
   wire                              monitor_branch_mispredict/* verilator public */;
200
 
201
        // synthesis translate_off
202
`ifndef SYNTHESIS
203
        `include "mor1kx_utils.vh"
204
 
205
   /* Provide interface hooks for register functions. */
206
   generate
207
      if (OPTION_CPU=="CAPPUCCINO") begin : monitor
208
 
209
 
210
         localparam RF_ADDR_WIDTH = calc_rf_addr_width(OPTION_RF_ADDR_WIDTH,
211
                                                       OPTION_RF_NUM_SHADOW_GPR);
212
 
213
         function [OPTION_OPERAND_WIDTH-1:0] get_gpr;
214
            // verilator public
215
            input [RF_ADDR_WIDTH-1:0] gpr_num;
216
            get_gpr = cappuccino.mor1kx_cpu.get_gpr(gpr_num);
217
         endfunction
218
         task set_gpr;
219
            // verilator public
220
            input [RF_ADDR_WIDTH-1:0] gpr_num;
221
            input [OPTION_OPERAND_WIDTH-1:0] gpr_value;
222
            cappuccino.mor1kx_cpu.set_gpr(gpr_num, gpr_value);
223
         endtask
224
      end
225
     else if (OPTION_CPU=="ESPRESSO") begin : monitor
226
         function [OPTION_OPERAND_WIDTH-1:0] get_gpr;
227
            // verilator public
228
            input [15:0] gpr_num;
229
            get_gpr = espresso.mor1kx_cpu.get_gpr(gpr_num);
230
         endfunction
231
         task set_gpr;
232
            // verilator public
233
            input [15:0] gpr_num;
234
            input [OPTION_OPERAND_WIDTH-1:0] gpr_value;
235
            espresso.mor1kx_cpu.set_gpr(gpr_num, gpr_value);
236
         endtask
237
      end
238
      /* verilator lint_off WIDTH */
239
     else if (OPTION_CPU=="PRONTO_ESPRESSO") begin : monitor
240
         function [OPTION_OPERAND_WIDTH-1:0] get_gpr;
241
            // verilator public
242
            input [15:0] gpr_num;
243
            get_gpr = prontoespresso.mor1kx_cpu.get_gpr(gpr_num);
244
         endfunction
245
         task set_gpr;
246
            // verilator public
247
            input [15:0] gpr_num;
248
            input [OPTION_OPERAND_WIDTH-1:0] gpr_value;
249
            prontoespresso.mor1kx_cpu.set_gpr(gpr_num, gpr_value);
250
         endtask
251
      end
252
   endgenerate
253
`endif
254
        // synthesis translate_on
255
 
256
   generate
257
      /* verilator lint_off WIDTH */
258
      if (OPTION_CPU=="CAPPUCCINO") begin : cappuccino
259
         /* verilator lint_on WIDTH */
260
         mor1kx_cpu_cappuccino
261
           #(
262
             .OPTION_OPERAND_WIDTH(OPTION_OPERAND_WIDTH),
263
             .FEATURE_DATACACHE(FEATURE_DATACACHE),
264
             .OPTION_DCACHE_BLOCK_WIDTH(OPTION_DCACHE_BLOCK_WIDTH),
265
             .OPTION_DCACHE_SET_WIDTH(OPTION_DCACHE_SET_WIDTH),
266
             .OPTION_DCACHE_WAYS(OPTION_DCACHE_WAYS),
267
             .OPTION_DCACHE_LIMIT_WIDTH(OPTION_DCACHE_LIMIT_WIDTH),
268
             .OPTION_DCACHE_SNOOP(OPTION_DCACHE_SNOOP),
269
             .FEATURE_DMMU(FEATURE_DMMU),
270
             .FEATURE_DMMU_HW_TLB_RELOAD(FEATURE_DMMU_HW_TLB_RELOAD),
271
             .OPTION_DMMU_SET_WIDTH(OPTION_DMMU_SET_WIDTH),
272
             .OPTION_DMMU_WAYS(OPTION_DMMU_WAYS),
273
             .FEATURE_INSTRUCTIONCACHE(FEATURE_INSTRUCTIONCACHE),
274
             .OPTION_ICACHE_BLOCK_WIDTH(OPTION_ICACHE_BLOCK_WIDTH),
275
             .OPTION_ICACHE_SET_WIDTH(OPTION_ICACHE_SET_WIDTH),
276
             .OPTION_ICACHE_WAYS(OPTION_ICACHE_WAYS),
277
             .OPTION_ICACHE_LIMIT_WIDTH(OPTION_ICACHE_LIMIT_WIDTH),
278
             .FEATURE_IMMU(FEATURE_IMMU),
279
             .FEATURE_IMMU_HW_TLB_RELOAD(FEATURE_IMMU_HW_TLB_RELOAD),
280
             .OPTION_IMMU_SET_WIDTH(OPTION_IMMU_SET_WIDTH),
281
             .OPTION_IMMU_WAYS(OPTION_IMMU_WAYS),
282
             .FEATURE_PIC(FEATURE_PIC),
283
             .FEATURE_TIMER(FEATURE_TIMER),
284
             .FEATURE_DEBUGUNIT(FEATURE_DEBUGUNIT),
285
             .FEATURE_PERFCOUNTERS(FEATURE_PERFCOUNTERS),
286
             .OPTION_PERFCOUNTERS_NUM(OPTION_PERFCOUNTERS_NUM),
287
             .FEATURE_MAC(FEATURE_MAC),
288
             .FEATURE_MULTICORE(FEATURE_MULTICORE),
289
             .FEATURE_TRACEPORT_EXEC(FEATURE_TRACEPORT_EXEC),
290
             .FEATURE_BRANCH_PREDICTOR(FEATURE_BRANCH_PREDICTOR),
291
             .FEATURE_SYSCALL(FEATURE_SYSCALL),
292
             .FEATURE_TRAP(FEATURE_TRAP),
293
             .FEATURE_RANGE(FEATURE_RANGE),
294
             .OPTION_PIC_TRIGGER(OPTION_PIC_TRIGGER),
295
             .OPTION_PIC_NMI_WIDTH(OPTION_PIC_NMI_WIDTH),
296
             .FEATURE_DSX(FEATURE_DSX),
297
             .FEATURE_FASTCONTEXTS(FEATURE_FASTCONTEXTS),
298
             .OPTION_RF_CLEAR_ON_INIT(OPTION_RF_CLEAR_ON_INIT),
299
             .OPTION_RF_NUM_SHADOW_GPR(OPTION_RF_NUM_SHADOW_GPR),
300
             .FEATURE_OVERFLOW(FEATURE_OVERFLOW),
301
             .FEATURE_CARRY_FLAG(FEATURE_CARRY_FLAG),
302
             .OPTION_RF_ADDR_WIDTH(OPTION_RF_ADDR_WIDTH),
303
             .OPTION_RF_WORDS(OPTION_RF_WORDS),
304
             .OPTION_RESET_PC(OPTION_RESET_PC),
305
             .FEATURE_MULTIPLIER(FEATURE_MULTIPLIER),
306
             .FEATURE_DIVIDER(FEATURE_DIVIDER),
307
             .FEATURE_ADDC(FEATURE_ADDC),
308
             .FEATURE_SRA(FEATURE_SRA),
309
             .FEATURE_ROR(FEATURE_ROR),
310
             .FEATURE_EXT(FEATURE_EXT),
311
             .FEATURE_CMOV(FEATURE_CMOV),
312
             .FEATURE_FFL1(FEATURE_FFL1),
313
             .FEATURE_MSYNC(FEATURE_MSYNC),
314
             .FEATURE_PSYNC(FEATURE_PSYNC),
315
             .FEATURE_CSYNC(FEATURE_CSYNC),
316
             .FEATURE_ATOMIC(FEATURE_ATOMIC),
317
             .FEATURE_FPU(FEATURE_FPU),
318
             .FEATURE_CUST1(FEATURE_CUST1),
319
             .FEATURE_CUST2(FEATURE_CUST2),
320
             .FEATURE_CUST3(FEATURE_CUST3),
321
             .FEATURE_CUST4(FEATURE_CUST4),
322
             .FEATURE_CUST5(FEATURE_CUST5),
323
             .FEATURE_CUST6(FEATURE_CUST6),
324
             .FEATURE_CUST7(FEATURE_CUST7),
325
             .FEATURE_CUST8(FEATURE_CUST8),
326
             .OPTION_SHIFTER(OPTION_SHIFTER),
327
             .FEATURE_STORE_BUFFER(FEATURE_STORE_BUFFER),
328
             .OPTION_STORE_BUFFER_DEPTH_WIDTH(OPTION_STORE_BUFFER_DEPTH_WIDTH)
329
             )
330
           mor1kx_cpu
331
           (/*AUTOINST*/
332
            // Outputs
333
            .ibus_adr_o                 (ibus_adr_o[OPTION_OPERAND_WIDTH-1:0]),
334
            .ibus_req_o                 (ibus_req_o),
335
            .ibus_burst_o               (ibus_burst_o),
336
            .dbus_adr_o                 (dbus_adr_o[OPTION_OPERAND_WIDTH-1:0]),
337
            .dbus_dat_o                 (dbus_dat_o[OPTION_OPERAND_WIDTH-1:0]),
338
            .dbus_req_o                 (dbus_req_o),
339
            .dbus_bsel_o                (dbus_bsel_o[3:0]),
340
            .dbus_we_o                  (dbus_we_o),
341
            .dbus_burst_o               (dbus_burst_o),
342
            .du_dat_o                   (du_dat_o[OPTION_OPERAND_WIDTH-1:0]),
343
            .du_ack_o                   (du_ack_o),
344
            .du_stall_o                 (du_stall_o),
345
            .traceport_exec_valid_o     (traceport_exec_valid_o),
346
            .traceport_exec_pc_o        (traceport_exec_pc_o[31:0]),
347
            .traceport_exec_jb_o        (traceport_exec_jb_o),
348
            .traceport_exec_jal_o       (traceport_exec_jal_o),
349
            .traceport_exec_jr_o        (traceport_exec_jr_o),
350
            .traceport_exec_jbtarget_o  (traceport_exec_jbtarget_o[31:0]),
351
            .traceport_exec_insn_o      (traceport_exec_insn_o[`OR1K_INSN_WIDTH-1:0]),
352
            .traceport_exec_wbdata_o    (traceport_exec_wbdata_o[OPTION_OPERAND_WIDTH-1:0]),
353
            .traceport_exec_wbreg_o     (traceport_exec_wbreg_o[OPTION_RF_ADDR_WIDTH-1:0]),
354
            .traceport_exec_wben_o      (traceport_exec_wben_o),
355
            .spr_bus_addr_o             (spr_bus_addr_o[15:0]),
356
            .spr_bus_we_o               (spr_bus_we_o),
357
            .spr_bus_stb_o              (spr_bus_stb_o),
358
            .spr_bus_dat_o              (spr_bus_dat_o[OPTION_OPERAND_WIDTH-1:0]),
359
            .spr_sr_o                   (spr_sr_o[15:0]),
360
            // Inputs
361
            .clk                        (clk),
362
            .rst                        (rst),
363
            .ibus_err_i                 (ibus_err_i),
364
            .ibus_ack_i                 (ibus_ack_i),
365
            .ibus_dat_i                 (ibus_dat_i[`OR1K_INSN_WIDTH-1:0]),
366
            .dbus_err_i                 (dbus_err_i),
367
            .dbus_ack_i                 (dbus_ack_i),
368
            .dbus_dat_i                 (dbus_dat_i[OPTION_OPERAND_WIDTH-1:0]),
369
            .irq_i                      (irq_i[31:0]),
370
            .du_addr_i                  (du_addr_i[15:0]),
371
            .du_stb_i                   (du_stb_i),
372
            .du_dat_i                   (du_dat_i[OPTION_OPERAND_WIDTH-1:0]),
373
            .du_we_i                    (du_we_i),
374
            .du_stall_i                 (du_stall_i),
375
            .spr_bus_dat_mac_i          (spr_bus_dat_mac_i[OPTION_OPERAND_WIDTH-1:0]),
376
            .spr_bus_ack_mac_i          (spr_bus_ack_mac_i),
377
            .spr_bus_dat_pmu_i          (spr_bus_dat_pmu_i[OPTION_OPERAND_WIDTH-1:0]),
378
            .spr_bus_ack_pmu_i          (spr_bus_ack_pmu_i),
379
            .spr_bus_dat_pcu_i          (spr_bus_dat_pcu_i[OPTION_OPERAND_WIDTH-1:0]),
380
            .spr_bus_ack_pcu_i          (spr_bus_ack_pcu_i),
381
            .spr_bus_dat_fpu_i          (spr_bus_dat_fpu_i[OPTION_OPERAND_WIDTH-1:0]),
382
            .spr_bus_ack_fpu_i          (spr_bus_ack_fpu_i),
383
            .multicore_coreid_i         (multicore_coreid_i[OPTION_OPERAND_WIDTH-1:0]),
384
            .multicore_numcores_i       (multicore_numcores_i[OPTION_OPERAND_WIDTH-1:0]),
385
            .snoop_adr_i                (snoop_adr_i[31:0]),
386
            .snoop_en_i                 (snoop_en_i));
387
 
388
        // synthesis translate_off
389
`ifndef SYNTHESIS
390
 
391
         assign monitor_flag =  monitor_flag_set ? 1 :
392
                                monitor_flag_clear ? 0 :
393
                                monitor_flag_sr;
394
         assign monitor_clk = clk;
395
 
396
         assign monitor_execute_advance = cappuccino.mor1kx_cpu.padv_execute_o;
397
         assign monitor_flag_set = cappuccino.mor1kx_cpu.mor1kx_execute_ctrl_cappuccino.flag_set_i;
398
         assign monitor_flag_clear = cappuccino.mor1kx_cpu.mor1kx_execute_ctrl_cappuccino.flag_clear_i;
399
         assign monitor_flag_sr = cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.ctrl_flag_o;
400
         assign monitor_spr_sr = {16'd0,cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.spr_sr[15:`OR1K_SPR_SR_F+1],cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.ctrl_flag_o,cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.spr_sr[`OR1K_SPR_SR_F-1:0]};
401
         assign monitor_execute_pc = cappuccino.mor1kx_cpu.pc_decode_to_execute;
402
         assign monitor_rf_result_in = cappuccino.mor1kx_cpu.mor1kx_rf_cappuccino.result_i;
403
         assign monitor_spr_esr = {16'd0,cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.spr_esr};
404
         assign monitor_spr_epcr = cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.spr_epcr;
405
         assign monitor_spr_eear = cappuccino.mor1kx_cpu.mor1kx_ctrl_cappuccino.spr_eear;
406
         assign monitor_branch_mispredict = cappuccino.mor1kx_cpu.branch_mispredict_o;
407
 
408
        reg [`OR1K_INSN_WIDTH-1:0]          monitor_execute_insn_reg;
409
        always @(posedge clk)
410
          if (cappuccino.mor1kx_cpu.padv_decode_o)
411
            monitor_execute_insn_reg <= cappuccino.mor1kx_cpu.mor1kx_decode.decode_insn_i;
412
 
413
        assign monitor_execute_insn = monitor_execute_insn_reg;
414
 
415
 
416
`endif
417
        // synthesis translate_on
418
 
419
 
420
      end // block: cappuccino
421
      /* verilator lint_off WIDTH */
422
      if (OPTION_CPU=="ESPRESSO") begin : espresso
423
         /* verilator lint_on WIDTH */
424
         mor1kx_cpu_espresso
425
           #(
426
             .OPTION_OPERAND_WIDTH(OPTION_OPERAND_WIDTH),
427
             .FEATURE_DATACACHE(FEATURE_DATACACHE),
428
             .OPTION_DCACHE_BLOCK_WIDTH(OPTION_DCACHE_BLOCK_WIDTH),
429
             .OPTION_DCACHE_SET_WIDTH(OPTION_DCACHE_SET_WIDTH),
430
             .OPTION_DCACHE_WAYS(OPTION_DCACHE_WAYS),
431
             .FEATURE_DMMU(FEATURE_DMMU),
432
             .FEATURE_INSTRUCTIONCACHE(FEATURE_INSTRUCTIONCACHE),
433
             .OPTION_ICACHE_BLOCK_WIDTH(OPTION_ICACHE_BLOCK_WIDTH),
434
             .OPTION_ICACHE_SET_WIDTH(OPTION_ICACHE_SET_WIDTH),
435
             .OPTION_ICACHE_WAYS(OPTION_ICACHE_WAYS),
436
             .FEATURE_IMMU(FEATURE_IMMU),
437
             .FEATURE_PIC(FEATURE_PIC),
438
             .FEATURE_TIMER(FEATURE_TIMER),
439
             .FEATURE_DEBUGUNIT(FEATURE_DEBUGUNIT),
440
             .FEATURE_PERFCOUNTERS(FEATURE_PERFCOUNTERS),
441
             .FEATURE_MAC(FEATURE_MAC),
442
             .FEATURE_MULTICORE(FEATURE_MULTICORE),
443
             .FEATURE_SYSCALL(FEATURE_SYSCALL),
444
             .FEATURE_TRAP(FEATURE_TRAP),
445
             .FEATURE_RANGE(FEATURE_RANGE),
446
             .OPTION_PIC_TRIGGER(OPTION_PIC_TRIGGER),
447
             .OPTION_PIC_NMI_WIDTH(OPTION_PIC_NMI_WIDTH),
448
             .FEATURE_DSX(FEATURE_DSX),
449
             .FEATURE_FASTCONTEXTS(FEATURE_FASTCONTEXTS),
450
             .FEATURE_OVERFLOW(FEATURE_OVERFLOW),
451
             .FEATURE_CARRY_FLAG(FEATURE_CARRY_FLAG),
452
             .OPTION_RF_ADDR_WIDTH(OPTION_RF_ADDR_WIDTH),
453
             .OPTION_RF_WORDS(OPTION_RF_WORDS),
454
             .OPTION_RESET_PC(OPTION_RESET_PC),
455
             .FEATURE_MULTIPLIER(FEATURE_MULTIPLIER),
456
             .FEATURE_DIVIDER(FEATURE_DIVIDER),
457
             .FEATURE_ADDC(FEATURE_ADDC),
458
             .FEATURE_SRA(FEATURE_SRA),
459
             .FEATURE_ROR(FEATURE_ROR),
460
             .FEATURE_EXT(FEATURE_EXT),
461
             .FEATURE_CMOV(FEATURE_CMOV),
462
             .FEATURE_FFL1(FEATURE_FFL1),
463
             .FEATURE_MSYNC(FEATURE_MSYNC),
464
             .FEATURE_PSYNC(FEATURE_PSYNC),
465
             .FEATURE_CSYNC(FEATURE_CSYNC),
466
             .FEATURE_CUST1(FEATURE_CUST1),
467
             .FEATURE_CUST2(FEATURE_CUST2),
468
             .FEATURE_CUST3(FEATURE_CUST3),
469
             .FEATURE_CUST4(FEATURE_CUST4),
470
             .FEATURE_CUST5(FEATURE_CUST5),
471
             .FEATURE_CUST6(FEATURE_CUST6),
472
             .FEATURE_CUST7(FEATURE_CUST7),
473
             .FEATURE_CUST8(FEATURE_CUST8),
474
             .OPTION_SHIFTER(OPTION_SHIFTER)
475
             )
476
           mor1kx_cpu
477
           (/*AUTOINST*/
478
            // Outputs
479
            .ibus_adr_o                 (ibus_adr_o[OPTION_OPERAND_WIDTH-1:0]),
480
            .ibus_req_o                 (ibus_req_o),
481
            .ibus_burst_o               (ibus_burst_o),
482
            .dbus_adr_o                 (dbus_adr_o[OPTION_OPERAND_WIDTH-1:0]),
483
            .dbus_dat_o                 (dbus_dat_o[OPTION_OPERAND_WIDTH-1:0]),
484
            .dbus_req_o                 (dbus_req_o),
485
            .dbus_bsel_o                (dbus_bsel_o[3:0]),
486
            .dbus_we_o                  (dbus_we_o),
487
            .dbus_burst_o               (dbus_burst_o),
488
            .du_dat_o                   (du_dat_o[OPTION_OPERAND_WIDTH-1:0]),
489
            .du_ack_o                   (du_ack_o),
490
            .du_stall_o                 (du_stall_o),
491
            .spr_bus_addr_o             (spr_bus_addr_o[15:0]),
492
            .spr_bus_we_o               (spr_bus_we_o),
493
            .spr_bus_stb_o              (spr_bus_stb_o),
494
            .spr_bus_dat_o              (spr_bus_dat_o[OPTION_OPERAND_WIDTH-1:0]),
495
            .spr_sr_o                   (spr_sr_o[15:0]),
496
            // Inputs
497
            .clk                        (clk),
498
            .rst                        (rst),
499
            .ibus_err_i                 (ibus_err_i),
500
            .ibus_ack_i                 (ibus_ack_i),
501
            .ibus_dat_i                 (ibus_dat_i[`OR1K_INSN_WIDTH-1:0]),
502
            .dbus_err_i                 (dbus_err_i),
503
            .dbus_ack_i                 (dbus_ack_i),
504
            .dbus_dat_i                 (dbus_dat_i[OPTION_OPERAND_WIDTH-1:0]),
505
            .irq_i                      (irq_i[31:0]),
506
            .du_addr_i                  (du_addr_i[15:0]),
507
            .du_stb_i                   (du_stb_i),
508
            .du_dat_i                   (du_dat_i[OPTION_OPERAND_WIDTH-1:0]),
509
            .du_we_i                    (du_we_i),
510
            .du_stall_i                 (du_stall_i),
511
            .spr_bus_dat_dmmu_i         (spr_bus_dat_dmmu_i[OPTION_OPERAND_WIDTH-1:0]),
512
            .spr_bus_ack_dmmu_i         (spr_bus_ack_dmmu_i),
513
            .spr_bus_dat_immu_i         (spr_bus_dat_immu_i[OPTION_OPERAND_WIDTH-1:0]),
514
            .spr_bus_ack_immu_i         (spr_bus_ack_immu_i),
515
            .spr_bus_dat_mac_i          (spr_bus_dat_mac_i[OPTION_OPERAND_WIDTH-1:0]),
516
            .spr_bus_ack_mac_i          (spr_bus_ack_mac_i),
517
            .spr_bus_dat_pmu_i          (spr_bus_dat_pmu_i[OPTION_OPERAND_WIDTH-1:0]),
518
            .spr_bus_ack_pmu_i          (spr_bus_ack_pmu_i),
519
            .spr_bus_dat_pcu_i          (spr_bus_dat_pcu_i[OPTION_OPERAND_WIDTH-1:0]),
520
            .spr_bus_ack_pcu_i          (spr_bus_ack_pcu_i),
521
            .spr_bus_dat_fpu_i          (spr_bus_dat_fpu_i[OPTION_OPERAND_WIDTH-1:0]),
522
            .spr_bus_ack_fpu_i          (spr_bus_ack_fpu_i),
523
            .multicore_coreid_i         (multicore_coreid_i[OPTION_OPERAND_WIDTH-1:0]));
524
 
525
         // synthesis translate_off
526
`ifndef SYNTHESIS
527
         assign monitor_flag =  monitor_flag_set ? 1 :
528
                                monitor_flag_clear ? 0 :
529
                                monitor_flag_sr;
530
         assign monitor_clk = clk;
531
         assign monitor_execute_insn = espresso.mor1kx_cpu.mor1kx_fetch_espresso.decode_insn_o;
532
         assign monitor_execute_advance = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.execute_done;
533
         assign monitor_flag_set = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.ctrl_flag_set_i;
534
         assign monitor_flag_clear = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.ctrl_flag_clear_i;
535
         assign monitor_flag_sr = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.flag;
536
         assign monitor_spr_sr = {16'd0,espresso.mor1kx_cpu.mor1kx_ctrl_espresso.spr_sr[15:`OR1K_SPR_SR_F+1],
537
                                  // Use the locally calculated flag value
538
                                  monitor_flag,
539
                                  espresso.mor1kx_cpu.mor1kx_ctrl_espresso.spr_sr[`OR1K_SPR_SR_F-1:0]};
540
         assign monitor_execute_pc = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.spr_ppc;
541
         assign monitor_rf_result_in = espresso.mor1kx_cpu.mor1kx_rf_espresso.result_i;
542
         assign monitor_spr_esr = {16'd0,espresso.mor1kx_cpu.mor1kx_ctrl_espresso.spr_esr};
543
         assign monitor_spr_epcr = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.spr_epcr;
544
         assign monitor_spr_eear = espresso.mor1kx_cpu.mor1kx_ctrl_espresso.spr_eear;
545
         assign monitor_branch_mispredict = 0;
546
`endif
547
         // synthesis translate_on
548
 
549
      end // block: espresso
550
      /* verilator lint_off WIDTH */
551
      if (OPTION_CPU=="PRONTO_ESPRESSO") begin : prontoespresso
552
         /* verilator lint_on WIDTH */
553
         mor1kx_cpu_prontoespresso
554
           #(
555
             .OPTION_OPERAND_WIDTH(OPTION_OPERAND_WIDTH),
556
             .FEATURE_DATACACHE(FEATURE_DATACACHE),
557
             .OPTION_DCACHE_BLOCK_WIDTH(OPTION_DCACHE_BLOCK_WIDTH),
558
             .OPTION_DCACHE_SET_WIDTH(OPTION_DCACHE_SET_WIDTH),
559
             .OPTION_DCACHE_WAYS(OPTION_DCACHE_WAYS),
560
             .FEATURE_DMMU(FEATURE_DMMU),
561
             .FEATURE_INSTRUCTIONCACHE(FEATURE_INSTRUCTIONCACHE),
562
             .OPTION_ICACHE_BLOCK_WIDTH(OPTION_ICACHE_BLOCK_WIDTH),
563
             .OPTION_ICACHE_SET_WIDTH(OPTION_ICACHE_SET_WIDTH),
564
             .OPTION_ICACHE_WAYS(OPTION_ICACHE_WAYS),
565
             .FEATURE_IMMU(FEATURE_IMMU),
566
             .FEATURE_PIC(FEATURE_PIC),
567
             .FEATURE_TIMER(FEATURE_TIMER),
568
             .FEATURE_DEBUGUNIT(FEATURE_DEBUGUNIT),
569
             .FEATURE_PERFCOUNTERS(FEATURE_PERFCOUNTERS),
570
             .FEATURE_MAC(FEATURE_MAC),
571
             .FEATURE_MULTICORE(FEATURE_MULTICORE),
572
             .FEATURE_SYSCALL(FEATURE_SYSCALL),
573
             .FEATURE_TRAP(FEATURE_TRAP),
574
             .FEATURE_RANGE(FEATURE_RANGE),
575
             .OPTION_PIC_TRIGGER(OPTION_PIC_TRIGGER),
576
             .OPTION_PIC_NMI_WIDTH(OPTION_PIC_NMI_WIDTH),
577
             .FEATURE_DSX(FEATURE_DSX),
578
             .FEATURE_FASTCONTEXTS(FEATURE_FASTCONTEXTS),
579
             .FEATURE_OVERFLOW(FEATURE_OVERFLOW),
580
             .FEATURE_CARRY_FLAG(FEATURE_CARRY_FLAG),
581
             .OPTION_RF_ADDR_WIDTH(OPTION_RF_ADDR_WIDTH),
582
             .OPTION_RF_WORDS(OPTION_RF_WORDS),
583
             .OPTION_RESET_PC(OPTION_RESET_PC),
584
             .OPTION_TCM_FETCHER(OPTION_TCM_FETCHER),
585
             .FEATURE_MULTIPLIER(FEATURE_MULTIPLIER),
586
             .FEATURE_DIVIDER(FEATURE_DIVIDER),
587
             .FEATURE_ADDC(FEATURE_ADDC),
588
             .FEATURE_SRA(FEATURE_SRA),
589
             .FEATURE_ROR(FEATURE_ROR),
590
             .FEATURE_EXT(FEATURE_EXT),
591
             .FEATURE_CMOV(FEATURE_CMOV),
592
             .FEATURE_FFL1(FEATURE_FFL1),
593
             .FEATURE_MSYNC(FEATURE_MSYNC),
594
             .FEATURE_PSYNC(FEATURE_PSYNC),
595
             .FEATURE_CSYNC(FEATURE_CSYNC),
596
             .FEATURE_CUST1(FEATURE_CUST1),
597
             .FEATURE_CUST2(FEATURE_CUST2),
598
             .FEATURE_CUST3(FEATURE_CUST3),
599
             .FEATURE_CUST4(FEATURE_CUST4),
600
             .FEATURE_CUST5(FEATURE_CUST5),
601
             .FEATURE_CUST6(FEATURE_CUST6),
602
             .FEATURE_CUST7(FEATURE_CUST7),
603
             .FEATURE_CUST8(FEATURE_CUST8),
604
             .OPTION_SHIFTER(OPTION_SHIFTER)
605
             )
606
           mor1kx_cpu
607
           (/*AUTOINST*/
608
            // Outputs
609
            .ibus_adr_o                 (ibus_adr_o[OPTION_OPERAND_WIDTH-1:0]),
610
            .ibus_req_o                 (ibus_req_o),
611
            .ibus_burst_o               (ibus_burst_o),
612
            .dbus_adr_o                 (dbus_adr_o[OPTION_OPERAND_WIDTH-1:0]),
613
            .dbus_dat_o                 (dbus_dat_o[OPTION_OPERAND_WIDTH-1:0]),
614
            .dbus_req_o                 (dbus_req_o),
615
            .dbus_bsel_o                (dbus_bsel_o[3:0]),
616
            .dbus_we_o                  (dbus_we_o),
617
            .dbus_burst_o               (dbus_burst_o),
618
            .du_dat_o                   (du_dat_o[OPTION_OPERAND_WIDTH-1:0]),
619
            .du_ack_o                   (du_ack_o),
620
            .du_stall_o                 (du_stall_o),
621
            .spr_bus_addr_o             (spr_bus_addr_o[15:0]),
622
            .spr_bus_we_o               (spr_bus_we_o),
623
            .spr_bus_stb_o              (spr_bus_stb_o),
624
            .spr_bus_dat_o              (spr_bus_dat_o[OPTION_OPERAND_WIDTH-1:0]),
625
            .spr_sr_o                   (spr_sr_o[15:0]),
626
            // Inputs
627
            .clk                        (clk),
628
            .rst                        (rst),
629
            .ibus_err_i                 (ibus_err_i),
630
            .ibus_ack_i                 (ibus_ack_i),
631
            .ibus_dat_i                 (ibus_dat_i[`OR1K_INSN_WIDTH-1:0]),
632
            .dbus_err_i                 (dbus_err_i),
633
            .dbus_ack_i                 (dbus_ack_i),
634
            .dbus_dat_i                 (dbus_dat_i[OPTION_OPERAND_WIDTH-1:0]),
635
            .irq_i                      (irq_i[31:0]),
636
            .du_addr_i                  (du_addr_i[15:0]),
637
            .du_stb_i                   (du_stb_i),
638
            .du_dat_i                   (du_dat_i[OPTION_OPERAND_WIDTH-1:0]),
639
            .du_we_i                    (du_we_i),
640
            .du_stall_i                 (du_stall_i),
641
            .spr_bus_dat_dmmu_i         (spr_bus_dat_dmmu_i[OPTION_OPERAND_WIDTH-1:0]),
642
            .spr_bus_ack_dmmu_i         (spr_bus_ack_dmmu_i),
643
            .spr_bus_dat_immu_i         (spr_bus_dat_immu_i[OPTION_OPERAND_WIDTH-1:0]),
644
            .spr_bus_ack_immu_i         (spr_bus_ack_immu_i),
645
            .spr_bus_dat_mac_i          (spr_bus_dat_mac_i[OPTION_OPERAND_WIDTH-1:0]),
646
            .spr_bus_ack_mac_i          (spr_bus_ack_mac_i),
647
            .spr_bus_dat_pmu_i          (spr_bus_dat_pmu_i[OPTION_OPERAND_WIDTH-1:0]),
648
            .spr_bus_ack_pmu_i          (spr_bus_ack_pmu_i),
649
            .spr_bus_dat_pcu_i          (spr_bus_dat_pcu_i[OPTION_OPERAND_WIDTH-1:0]),
650
            .spr_bus_ack_pcu_i          (spr_bus_ack_pcu_i),
651
            .spr_bus_dat_fpu_i          (spr_bus_dat_fpu_i[OPTION_OPERAND_WIDTH-1:0]),
652
            .spr_bus_ack_fpu_i          (spr_bus_ack_fpu_i),
653
            .multicore_coreid_i         (multicore_coreid_i[OPTION_OPERAND_WIDTH-1:0]));
654
 
655
         // synthesis translate_off
656
`ifndef SYNTHESIS
657
         assign monitor_flag =  monitor_flag_set ? 1 :
658
                                monitor_flag_clear ? 0 :
659
                                monitor_flag_sr;
660
         assign monitor_clk = clk;
661
         assign monitor_execute_insn = prontoespresso.mor1kx_cpu.insn_fetch_to_decode;
662
         assign monitor_execute_advance = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.execute_done;
663
         assign monitor_flag_set = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.ctrl_flag_set_i;
664
         assign monitor_flag_clear = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.ctrl_flag_clear_i;
665
         assign monitor_flag_sr = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.flag;
666
         assign monitor_spr_sr = {16'd0,prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.spr_sr[15:`OR1K_SPR_SR_F+1],
667
                                  // Use the locally calculated flag value
668
                                  monitor_flag,
669
                                  prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.spr_sr[`OR1K_SPR_SR_F-1:0]};
670
         assign monitor_execute_pc = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.spr_ppc;
671
         assign monitor_rf_result_in = prontoespresso.mor1kx_cpu.mor1kx_rf_espresso.result_i;
672
         assign monitor_spr_esr = {16'd0,prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.spr_esr};
673
         assign monitor_spr_epcr = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.spr_epcr;
674
         assign monitor_spr_eear = prontoespresso.mor1kx_cpu.mor1kx_ctrl_prontoespresso.spr_eear;
675
         assign monitor_branch_mispredict = 0;
676
`endif
677
         // synthesis translate_on
678
 
679
      end
680
      /* verilator lint_off WIDTH */
681
      if (OPTION_CPU!="CAPPUCCINO" && OPTION_CPU!="ESPRESSO" &&
682
          OPTION_CPU!="PRONTO_ESPRESSO")
683
        /* verilator lint_on WIDTH */
684
        begin
685
           initial begin
686
              $display("Error: OPTION_CPU, %s, not valid", OPTION_CPU);
687
              $finish();
688
           end
689
        end // else: !if(OPTION_CPU=="ESPRESSO")
690
   endgenerate
691
 
692
endmodule // mor1kx_cpu

powered by: WebSVN 2.1.0

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