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

Subversion Repositories darkriscv

[/] [darkriscv/] [trunk/] [rtl/] [darkriscv.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 marcelos
/*
2
 * Copyright (c) 2018, Marcelo Samsoniuk
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions are met:
7
 *
8
 * * Redistributions of source code must retain the above copyright notice, this
9
 *   list of conditions and the following disclaimer.
10
 *
11
 * * Redistributions in binary form must reproduce the above copyright notice,
12
 *   this list of conditions and the following disclaimer in the documentation
13
 *   and/or other materials provided with the distribution.
14
 *
15
 * * Neither the name of the copyright holder nor the names of its
16
 *   contributors may be used to endorse or promote products derived from
17
 *   this software without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
 */
30
 
31
`timescale 1ns / 1ps
32
 
33
// implemented opcodes:
34
 
35
`define LUI     7'b01101_11      // lui   rd,imm[31:12]
36
`define AUIPC   7'b00101_11      // auipc rd,imm[31:12]
37
`define JAL     7'b11011_11      // jal   rd,imm[xxxxx]
38
`define JALR    7'b11001_11      // jalr  rd,rs1,imm[11:0] 
39
`define BCC     7'b11000_11      // bcc   rs1,rs2,imm[12:1]
40
`define LCC     7'b00000_11      // lxx   rd,rs1,imm[11:0]
41
`define SCC     7'b01000_11      // sxx   rs1,rs2,imm[11:0]
42
`define MCC     7'b00100_11      // xxxi  rd,rs1,imm[11:0]
43
`define RCC     7'b01100_11      // xxx   rd,rs1,rs2 
44
`define MAC     7'b11111_11      // mac   rd,rs1,rs2
45
 
46
// not implemented opcodes:
47
 
48
`define FCC     7'b00011_11      // fencex
49
`define CCC     7'b11100_11      // exx, csrxx
50
 
51
// configuration file
52
 
53
`include "../rtl/config.vh"
54
 
55
module darkriscv
56
//#(
57
//    parameter [31:0] RESET_PC = 0,
58
//    parameter [31:0] RESET_SP = 4096
59
//) 
60
(
61
    input             CLK,   // clock
62
    input             RES,   // reset
63
    input             HLT,   // halt
64
 
65 4 marcelos
//`ifdef __THREADING__    
66
//    input             IREQ,  // irq req
67
//`endif    
68 2 marcelos
 
69
    input      [31:0] IDATA, // instruction data bus
70
    output     [31:0] IADDR, // instruction addr bus
71
 
72
    input      [31:0] DATAI, // data bus (input)
73
    output     [31:0] DATAO, // data bus (output)
74
    output     [31:0] DADDR, // addr bus
75
 
76
`ifdef __FLEXBUZZ__
77
    output     [ 2:0] DLEN, // data length
78
    output            RW,   // data read/write
79
`else
80
    output     [ 3:0] BE,   // byte enable
81
    output            WR,    // write enable
82
    output            RD,    // read enable 
83
`endif
84 4 marcelos
 
85
`ifdef SIMULATION
86
    input         FINISH_REQ,
87
`endif
88 2 marcelos
    output [3:0]  DEBUG      // old-school osciloscope based debug! :)
89
);
90
 
91
    // dummy 32-bit words w/ all-0s and all-1s: 
92
 
93
    wire [31:0] ALL0  = 0;
94
    wire [31:0] ALL1  = -1;
95
 
96
`ifdef __THREADING__
97 6 marcelos
    reg [$clog2(`NTHREADS)-1:0] XMODE = 0;     // thread ptr
98 2 marcelos
`endif
99
 
100
    // pre-decode: IDATA is break apart as described in the RV32I specification
101
 
102
    reg [31:0] XIDATA;
103
 
104
    reg XLUI, XAUIPC, XJAL, XJALR, XBCC, XLCC, XSCC, XMCC, XRCC, XMAC, XRES=1; //, XFCC, XCCC;
105
 
106
    reg [31:0] XSIMM;
107
    reg [31:0] XUIMM;
108
 
109
    always@(posedge CLK)
110
    begin
111
        XIDATA <= XRES ? 0 : HLT ? XIDATA : IDATA;
112
 
113
        XLUI   <= XRES ? 0 : HLT ? XLUI   : IDATA[6:0]==`LUI;
114
        XAUIPC <= XRES ? 0 : HLT ? XAUIPC : IDATA[6:0]==`AUIPC;
115
        XJAL   <= XRES ? 0 : HLT ? XJAL   : IDATA[6:0]==`JAL;
116
        XJALR  <= XRES ? 0 : HLT ? XJALR  : IDATA[6:0]==`JALR;
117
 
118
        XBCC   <= XRES ? 0 : HLT ? XBCC   : IDATA[6:0]==`BCC;
119
        XLCC   <= XRES ? 0 : HLT ? XLCC   : IDATA[6:0]==`LCC;
120
        XSCC   <= XRES ? 0 : HLT ? XSCC   : IDATA[6:0]==`SCC;
121
        XMCC   <= XRES ? 0 : HLT ? XMCC   : IDATA[6:0]==`MCC;
122
 
123
        XRCC   <= XRES ? 0 : HLT ? XRCC   : IDATA[6:0]==`RCC;
124
        XMAC   <= XRES ? 0 : HLT ? XRCC   : IDATA[6:0]==`MAC;
125
        //XFCC   <= XRES ? 0 : HLT ? XFCC   : IDATA[6:0]==`FCC;
126
        //XCCC   <= XRES ? 0 : HLT ? XCCC   : IDATA[6:0]==`CCC;
127
 
128
        // signal extended immediate, according to the instruction type:
129
 
130
        XSIMM  <= XRES ? 0 : HLT ? XSIMM :
131
                 IDATA[6:0]==`SCC ? { IDATA[31] ? ALL1[31:12]:ALL0[31:12], IDATA[31:25],IDATA[11:7] } : // s-type
132
                 IDATA[6:0]==`BCC ? { IDATA[31] ? ALL1[31:13]:ALL0[31:13], IDATA[31],IDATA[7],IDATA[30:25],IDATA[11:8],ALL0[0] } : // b-type
133
                 IDATA[6:0]==`JAL ? { IDATA[31] ? ALL1[31:21]:ALL0[31:21], IDATA[31], IDATA[19:12], IDATA[20], IDATA[30:21], ALL0[0] } : // j-type
134
                 IDATA[6:0]==`LUI||
135
                 IDATA[6:0]==`AUIPC ? { IDATA[31:12], ALL0[11:0] } : // u-type
136
                                      { IDATA[31] ? ALL1[31:12]:ALL0[31:12], IDATA[31:20] }; // i-type
137
        // non-signal extended immediate, according to the instruction type:
138
 
139
        XUIMM  <= XRES ? 0: HLT ? XUIMM :
140
                 IDATA[6:0]==`SCC ? { ALL0[31:12], IDATA[31:25],IDATA[11:7] } : // s-type
141
                 IDATA[6:0]==`BCC ? { ALL0[31:13], IDATA[31],IDATA[7],IDATA[30:25],IDATA[11:8],ALL0[0] } : // b-type
142
                 IDATA[6:0]==`JAL ? { ALL0[31:21], IDATA[31], IDATA[19:12], IDATA[20], IDATA[30:21], ALL0[0] } : // j-type
143
                 IDATA[6:0]==`LUI||
144
                 IDATA[6:0]==`AUIPC ? { IDATA[31:12], ALL0[11:0] } : // u-type
145
                                      { ALL0[31:12], IDATA[31:20] }; // i-type
146
    end
147
 
148
    // decode: after XIDATA
149
`ifdef __3STAGE__
150
    reg [1:0] FLUSH = -1;  // flush instruction pipeline
151
`else
152
    reg FLUSH = -1;  // flush instruction pipeline
153
`endif
154
 
155
`ifdef __THREADING__
156
    `ifdef __RV32E__
157
 
158 6 marcelos
        reg [$clog2(`NTHREADS)+3:0] RESMODE = -1;
159 2 marcelos
 
160 6 marcelos
        wire [$clog2(`NTHREADS)+3:0] DPTR   = XRES ? RESMODE : { XMODE, XIDATA[10: 7] }; // set SP_RESET when RES==1
161
        wire [$clog2(`NTHREADS)+3:0] S1PTR  = { XMODE, XIDATA[18:15] };
162
        wire [$clog2(`NTHREADS)+3:0] S2PTR  = { XMODE, XIDATA[23:20] };
163 2 marcelos
    `else
164 6 marcelos
        reg [$clog2(`NTHREADS)+4:0] RESMODE = -1;
165 2 marcelos
 
166 6 marcelos
        wire [$clog2(`NTHREADS)+4:0] DPTR   = XRES ? RESMODE : { XMODE, XIDATA[11: 7] }; // set SP_RESET when RES==1
167
        wire [$clog2(`NTHREADS)+4:0] S1PTR  = { XMODE, XIDATA[19:15] };
168
        wire [$clog2(`NTHREADS)+4:0] S2PTR  = { XMODE, XIDATA[24:20] };
169 2 marcelos
    `endif
170
`else
171
    `ifdef __RV32E__
172
 
173
        reg [3:0] RESMODE = -1;
174
 
175
        wire [3:0] DPTR   = XRES ? RESMODE : XIDATA[10: 7]; // set SP_RESET when RES==1
176
        wire [3:0] S1PTR  = XIDATA[18:15];
177
        wire [3:0] S2PTR  = XIDATA[23:20];
178
    `else
179
        reg [4:0] RESMODE = -1;
180
 
181
        wire [4:0] DPTR   = XRES ? RESMODE : XIDATA[11: 7]; // set SP_RESET when RES==1
182
        wire [4:0] S1PTR  = XIDATA[19:15];
183
        wire [4:0] S2PTR  = XIDATA[24:20];
184
    `endif
185 6 marcelos
`endif
186 2 marcelos
 
187
    wire [6:0] OPCODE = FLUSH ? 0 : XIDATA[6:0];
188
    wire [2:0] FCT3   = XIDATA[14:12];
189
    wire [6:0] FCT7   = XIDATA[31:25];
190
 
191
    wire [31:0] SIMM  = XSIMM;
192
    wire [31:0] UIMM  = XUIMM;
193
 
194
    // main opcode decoder:
195
 
196
    wire    LUI = FLUSH ? 0 : XLUI;   // OPCODE==7'b0110111;
197
    wire  AUIPC = FLUSH ? 0 : XAUIPC; // OPCODE==7'b0010111;
198
    wire    JAL = FLUSH ? 0 : XJAL;   // OPCODE==7'b1101111;
199
    wire   JALR = FLUSH ? 0 : XJALR;  // OPCODE==7'b1100111;
200
 
201
    wire    BCC = FLUSH ? 0 : XBCC; // OPCODE==7'b1100011; //FCT3
202
    wire    LCC = FLUSH ? 0 : XLCC; // OPCODE==7'b0000011; //FCT3
203
    wire    SCC = FLUSH ? 0 : XSCC; // OPCODE==7'b0100011; //FCT3
204
    wire    MCC = FLUSH ? 0 : XMCC; // OPCODE==7'b0010011; //FCT3
205
 
206
    wire    RCC = FLUSH ? 0 : XRCC; // OPCODE==7'b0110011; //FCT3
207
    wire    MAC = FLUSH ? 0 : XMAC; // OPCODE==7'b0110011; //FCT3
208
    //wire    FCC = FLUSH ? 0 : XFCC; // OPCODE==7'b0001111; //FCT3
209
    //wire    CCC = FLUSH ? 0 : XCCC; // OPCODE==7'b1110011; //FCT3
210
 
211
`ifdef __THREADING__
212 6 marcelos
    `ifdef __3STAGE__
213
        reg [31:0] NXPC2 [0:`NTHREADS-1];       // 32-bit program counter t+2
214
    `endif
215 2 marcelos
 
216
    `ifdef __RV32E__
217 6 marcelos
        reg [31:0] REG1 [0:16*`NTHREADS-1];       // general-purpose 16x32-bit registers (s1)
218
        reg [31:0] REG2 [0:16*`NTHREADS-1];       // general-purpose 16x32-bit registers (s2)
219 2 marcelos
    `else
220 6 marcelos
        reg [31:0] REG1 [0:32*`NTHREADS-1];       // general-purpose 32x32-bit registers (s1)
221
        reg [31:0] REG2 [0:32*`NTHREADS-1];       // general-purpose 32x32-bit registers (s2)    
222 2 marcelos
    `endif
223
`else
224 6 marcelos
    `ifdef __3STAGE__
225
        reg [31:0] NXPC2;       // 32-bit program counter t+2
226
    `endif
227 2 marcelos
 
228
    `ifdef __RV32E__
229
        reg [31:0] REG1 [0:15];   // general-purpose 16x32-bit registers (s1)
230
        reg [31:0] REG2 [0:15];   // general-purpose 16x32-bit registers (s2)
231
    `else
232
        reg [31:0] REG1 [0:31];   // general-purpose 32x32-bit registers (s1)
233
        reg [31:0] REG2 [0:31];   // general-purpose 32x32-bit registers (s2)
234
    `endif
235
`endif
236
 
237 6 marcelos
    reg [31:0] NXPC;        // 32-bit program counter t+1
238
    reg [31:0] PC;                   // 32-bit program counter t+0
239
 
240 2 marcelos
    // source-1 and source-1 register selection
241
 
242
    wire signed   [31:0] S1REG = REG1[S1PTR];
243
    wire signed   [31:0] S2REG = REG2[S2PTR];
244
 
245
    wire          [31:0] U1REG = REG1[S1PTR];
246
    wire          [31:0] U2REG = REG2[S2PTR];
247
 
248
    // L-group of instructions (OPCODE==7'b0000011)
249
 
250
`ifdef __FLEXBUZZ__
251
 
252
    wire [31:0] LDATA = FCT3[1:0]==0 ? { FCT3[2]==0&&DATAI[ 7] ? ALL1[31: 8]:ALL0[31: 8] , DATAI[ 7: 0] } :
253
                        FCT3[1:0]==1 ? { FCT3[2]==0&&DATAI[15] ? ALL1[31:16]:ALL0[31:16] , DATAI[15: 0] } :
254
                                        DATAI;
255
`else
256
    wire [31:0] LDATA = FCT3==0||FCT3==4 ? ( DADDR[1:0]==3 ? { FCT3==0&&DATAI[31] ? ALL1[31: 8]:ALL0[31: 8] , DATAI[31:24] } :
257
                                             DADDR[1:0]==2 ? { FCT3==0&&DATAI[23] ? ALL1[31: 8]:ALL0[31: 8] , DATAI[23:16] } :
258
                                             DADDR[1:0]==1 ? { FCT3==0&&DATAI[15] ? ALL1[31: 8]:ALL0[31: 8] , DATAI[15: 8] } :
259
                                                             { FCT3==0&&DATAI[ 7] ? ALL1[31: 8]:ALL0[31: 8] , DATAI[ 7: 0] } ):
260
                        FCT3==1||FCT3==5 ? ( DADDR[1]==1   ? { FCT3==1&&DATAI[31] ? ALL1[31:16]:ALL0[31:16] , DATAI[31:16] } :
261
                                                             { FCT3==1&&DATAI[15] ? ALL1[31:16]:ALL0[31:16] , DATAI[15: 0] } ) :
262
                                             DATAI;
263
`endif
264
 
265
    // S-group of instructions (OPCODE==7'b0100011)
266
 
267
`ifdef __FLEXBUZZ__
268
 
269
    wire [31:0] SDATA = U2REG; /* FCT3==0 ? { ALL0 [31: 8], U2REG[ 7:0] } :
270
                        FCT3==1 ? { ALL0 [31:16], U2REG[15:0] } :
271
                                    U2REG;*/
272
`else
273
    wire [31:0] SDATA = FCT3==0 ? ( DADDR[1:0]==3 ? { U2REG[ 7: 0], ALL0 [23:0] } :
274
                                    DADDR[1:0]==2 ? { ALL0 [31:24], U2REG[ 7:0], ALL0[15:0] } :
275
                                    DADDR[1:0]==1 ? { ALL0 [31:16], U2REG[ 7:0], ALL0[7:0] } :
276
                                                    { ALL0 [31: 8], U2REG[ 7:0] } ) :
277
                        FCT3==1 ? ( DADDR[1]==1   ? { U2REG[15: 0], ALL0 [15:0] } :
278
                                                    { ALL0 [31:16], U2REG[15:0] } ) :
279
                                    U2REG;
280
`endif
281
 
282
    // C-group not implemented yet!
283
 
284
    wire [31:0] CDATA = 0;        // status register istructions not implemented yet
285
 
286
    // RM-group of instructions (OPCODEs==7'b0010011/7'b0110011), merged! src=immediate(M)/register(R)
287
 
288
    wire signed [31:0] S2REGX = XMCC ? SIMM : S2REG;
289
    wire        [31:0] U2REGX = XMCC ? UIMM : U2REG;
290
 
291
    wire [31:0] RMDATA = FCT3==7 ? U1REG&S2REGX :
292
                         FCT3==6 ? U1REG|S2REGX :
293
                         FCT3==4 ? U1REG^S2REGX :
294
                         FCT3==3 ? U1REG<U2REGX?1:0 : // unsigned
295
                         FCT3==2 ? S1REG<S2REGX?1:0 : // signed
296
                         FCT3==0 ? (XRCC&&FCT7[5] ? U1REG-U2REGX : U1REG+S2REGX) :
297
                         FCT3==1 ? U1REG<<U2REGX[4:0] :
298
                         //FCT3==5 ? 
299
 
300
// maybe the $signed solves the problem for MODELSIM too! needs to be tested!
301
//`ifdef MODEL_TECH        
302
//                         FCT7[5] ? -((-U1REG)>>U2REGX[4:0]; // workaround for modelsim
303
//`else
304
                         FCT7[5] ? $signed(S1REG>>>U2REGX[4:0]) : // (FCT7[5] ? U1REG>>>U2REG[4:0] : 
305
//`endif                        
306
                                   U1REG>>U2REGX[4:0];
307
`ifdef __MAC16X16__
308
 
309
    // MAC instruction rd += s1*s2 (OPCODE==7'b1111111)
310
    // 
311
    // 0000000 01100 01011 100 01100 0110011 xor a2,a1,a2
312
    // 0000000 01010 01100 000 01010 0110011 add a0,a2,a0
313
    // 0000000 01100 01011 000 01010 1111111 mac a0,a1,a2
314
    // 
315
    // 0000 0000 1100 0101 1000 0101 0111 1111 = 00c5857F
316
 
317
    wire signed [15:0] K1TMP = S1REG[15:0];
318
    wire signed [15:0] K2TMP = S2REG[15:0];
319
    wire signed [31:0] KDATA = K1TMP*K2TMP;
320
 
321
`endif
322
 
323
    // J/B-group of instructions (OPCODE==7'b1100011)
324
 
325
    wire BMUX       = BCC==1 && (
326
                          FCT3==4 ? S1REG< S2REGX : // blt
327
                          FCT3==5 ? S1REG>=S2REG : // bge
328
                          FCT3==6 ? U1REG< U2REGX : // bltu
329
                          FCT3==7 ? U1REG>=U2REG : // bgeu
330
                          FCT3==0 ? !(U1REG^S2REGX) : //U1REG==U2REG : // beq
331
                          /*FCT3==1 ? */ U1REG^S2REGX); //U1REG!=U2REG); // bne
332
                                    //0);
333
 
334
    wire        JREQ = (JAL||JALR||BMUX);
335
    wire [31:0] JVAL = JALR ? DADDR : PC+SIMM; // SIMM + (JALR ? U1REG : PC);
336
 
337 4 marcelos
`ifdef SIMULATION
338 6 marcelos
    `ifdef __PERFMETER__
339 2 marcelos
 
340 6 marcelos
        integer clocks=0, running=0, load=0, store=0, flush=0, halt=0;
341
 
342
    `ifdef __THREADING__
343
        integer thread[0:`NTHREADS-1];
344
        integer i;
345
 
346
        initial for(i=0;i!=`NTHREADS;i=i+1) thread[i] = 0;
347
    `endif
348
 
349
        always@(posedge CLK)
350 2 marcelos
        begin
351 6 marcelos
            if(!XRES)
352
            begin
353
                clocks = clocks+1;
354 2 marcelos
 
355 6 marcelos
                if(HLT)
356 4 marcelos
                begin
357 6 marcelos
                         if(SCC)        store = store+1;
358
                    else if(LCC)        load  = load +1;
359
                    else                halt  = halt +1;
360 4 marcelos
                end
361
                else
362
                begin
363 6 marcelos
                    if(FLUSH)
364
                    begin
365
                        flush=flush+1;
366
                    end
367
                    else
368
                    begin
369
 
370
        `ifdef __THREADING__
371
 
372
                        for(i=0;i!=`NTHREADS;i=i+1)
373
                                thread[i] = thread[i]+(i==XMODE?1:0);
374
        `endif
375
                        running = running +1;
376
                    end
377 4 marcelos
                end
378
 
379 6 marcelos
                if(FINISH_REQ)
380
                begin
381
                    $display("****************************************************************************");
382
                    $display("DarkRISCV Pipeline Report:");
383
                    $display("core0  clocks: %0d",clocks);
384
 
385
                    $display("core0: running %0d%%",100.0*running/clocks);
386
 
387
         `ifdef __THREADING__
388
                    for(i=0;i!=`NTHREADS;i=i+1) $display("  thread%0d: running %0d%%",i,100.0*thread[i]/clocks);
389
         `endif
390
 
391
                    $display("core0:  halted %0d%% (%0d%% load, %0d%% store, %0d%% busy)",
392
                        100.0*(load+store)/clocks,
393
                        100.0*load/clocks,
394
                        100.0*store/clocks,
395
                        100.0*halt/clocks);
396
 
397
                    $display("core0: stalled %0d%%",100.0*flush/clocks);
398
 
399
 
400
 
401
                    $display("****************************************************************************");
402
                    $finish();
403
                end
404 2 marcelos
            end
405
        end
406 6 marcelos
    `else
407
        $finish();
408
    `endif
409 2 marcelos
`endif
410
 
411
    always@(posedge CLK)
412
    begin
413
        RESMODE <= RES ? -1 : RESMODE ? RESMODE-1 : 0;
414
 
415
        XRES <= |RESMODE;
416
 
417
`ifdef __3STAGE__
418
            FLUSH <= XRES ? 2 : HLT ? FLUSH :        // reset and halt                              
419
                               FLUSH ? FLUSH-1 :
420
                               (JAL||JALR||BMUX) ? 2 : 0;  // flush the pipeline!
421
`else
422
        FLUSH <= XRES ? 1 : HLT ? FLUSH :        // reset and halt
423
                       (JAL||JALR||BMUX);  // flush the pipeline!
424
`endif
425
 
426
`ifdef __RV32E__
427
        REG1[DPTR] <=   XRES ? (RESMODE[3:0]==2 ? `__RESETSP__ : 0)  :        // reset sp
428
`else
429
        REG1[DPTR] <=   XRES ? (RESMODE[4:0]==2 ? `__RESETSP__ : 0)  :        // reset sp
430
`endif
431
                       HLT ? REG1[DPTR] :        // halt
432
                     !DPTR ? 0 :                // x0 = 0, always!
433
                     AUIPC ? PC+SIMM :
434
                      JAL||
435
                      JALR ? NXPC :
436
                       LUI ? SIMM :
437
                       LCC ? LDATA :
438
                  MCC||RCC ? RMDATA:
439
`ifdef __MAC16X16__
440
                       MAC ? REG2[DPTR]+KDATA :
441
`endif
442
                       //CCC ? CDATA : 
443
                             REG1[DPTR];
444
`ifdef __RV32E__
445
        REG2[DPTR] <=   XRES ? (RESMODE[3:0]==2 ? `__RESETSP__ : 0) :        // reset sp
446
`else
447
        REG2[DPTR] <=   XRES ? (RESMODE[4:0]==2 ? `__RESETSP__ : 0) :        // reset sp
448
`endif
449
                       HLT ? REG2[DPTR] :        // halt
450
                     !DPTR ? 0 :                // x0 = 0, always!
451
                     AUIPC ? PC+SIMM :
452
                      JAL||
453
                      JALR ? NXPC :
454
                       LUI ? SIMM :
455
                       LCC ? LDATA :
456
                  MCC||RCC ? RMDATA:
457
`ifdef __MAC16X16__
458
                       MAC ? REG2[DPTR]+KDATA :
459
`endif
460
                       //CCC ? CDATA : 
461
                             REG2[DPTR];
462
 
463
`ifdef __3STAGE__
464
 
465 6 marcelos
    `ifdef __THREADING__
466 2 marcelos
 
467
        NXPC <= /*XRES ? `__RESETPC__ :*/ HLT ? NXPC : NXPC2[XMODE];
468
 
469 6 marcelos
        NXPC2[XRES ? RESMODE[$clog2(`NTHREADS)-1:0] : XMODE] <=  XRES ? `__RESETPC__ : HLT ? NXPC2[XMODE] :   // reset and halt
470 2 marcelos
                                      JREQ ? JVAL :                            // jmp/bra
471
                                                 NXPC2[XMODE]+4;                   // normal flow
472
 
473
        XMODE <= XRES ? 0 : HLT ? XMODE :        // reset and halt
474 6 marcelos
                            JAL ? XMODE+1 : XMODE;
475
                     //XMODE==0/*&& IREQ*/&&(JAL||JALR||BMUX) ? 1 :         // wait pipeflush to switch to irq
476
                 //XMODE==1/*&&!IREQ*/&&(JAL||JALR||BMUX) ? 0 : XMODE;  // wait pipeflush to return from irq
477 2 marcelos
 
478 6 marcelos
    `else
479 2 marcelos
        NXPC <= /*XRES ? `__RESETPC__ :*/ HLT ? NXPC : NXPC2;
480
 
481
            NXPC2 <=  XRES ? `__RESETPC__ : HLT ? NXPC2 :   // reset and halt
482
                         JREQ ? JVAL :                    // jmp/bra
483
                                NXPC2+4;                   // normal flow
484
 
485 6 marcelos
    `endif
486 2 marcelos
 
487
`else
488
        NXPC <= XRES ? `__RESETPC__ : HLT ? NXPC :   // reset and halt
489
              JREQ ? JVAL :                   // jmp/bra
490
                     NXPC+4;                   // normal flow
491
`endif
492
        PC   <= /*XRES ? `__RESETPC__ :*/ HLT ? PC : NXPC; // current program counter
493
    end
494
 
495
    // IO and memory interface
496
 
497
    assign DATAO = SDATA; // SCC ? SDATA : 0;
498
    assign DADDR = U1REG + SIMM; // (SCC||LCC) ? U1REG + SIMM : 0;
499
 
500
    // based in the Scc and Lcc   
501
 
502
`ifdef __FLEXBUZZ__
503
    assign RW      = !SCC;
504
    assign DLEN[0] = (SCC||LCC)&&FCT3[1:0]==0;
505
    assign DLEN[1] = (SCC||LCC)&&FCT3[1:0]==1;
506
    assign DLEN[2] = (SCC||LCC)&&FCT3[1:0]==2;
507
`else
508
    assign RD = LCC;
509
    assign WR = SCC;
510
    assign BE = FCT3==0||FCT3==4 ? ( DADDR[1:0]==3 ? 4'b1000 : // sb/lb
511
                                     DADDR[1:0]==2 ? 4'b0100 :
512
                                     DADDR[1:0]==1 ? 4'b0010 :
513
                                                     4'b0001 ) :
514
                FCT3==1||FCT3==5 ? ( DADDR[1]==1   ? 4'b1100 : // sh/lh
515
                                                     4'b0011 ) :
516
                                                     4'b1111; // sw/lw
517
`endif
518
 
519
`ifdef __3STAGE__
520 6 marcelos
    `ifdef __THREADING__
521
        assign IADDR = NXPC2[XMODE];
522
    `else
523
        assign IADDR = NXPC2;
524
    `endif
525 2 marcelos
`else
526
    assign IADDR = NXPC;
527
`endif
528
 
529
    assign DEBUG = { XRES, |FLUSH, SCC, LCC };
530
 
531
endmodule

powered by: WebSVN 2.1.0

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