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

powered by: WebSVN 2.1.0

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