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

Subversion Repositories ae18

[/] [ae18/] [trunk/] [rtl/] [verilog/] [ae18_core.v] - Blame information for rev 17

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sybreon
/*
2 17 sybreon
 * $Id: ae18_core.v,v 1.7 2007-04-13 22:18:51 sybreon Exp $
3 3 sybreon
 *
4 15 sybreon
 * AE18 8-bit Microprocessor Core
5 2 sybreon
 * Copyright (C) 2006 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
6
 *
7
 * This library is free software; you can redistribute it and/or modify it
8
 * under the terms of the GNU Lesser General Public License as published by
9
 * the Free Software Foundation; either version 2.1 of the License,
10
 * or (at your option) any later version.
11
 *
12
 * This library is distributed in the hope that it will be useful, but
13 17 sybreon
 * WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
 * Lesser General Public License for more details.
16 2 sybreon
 *
17 17 sybreon
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with this library; if not, write to the Free Software
19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20
 * USA
21 2 sybreon
 *
22
 * DESCRIPTION
23
 * This core provides a PIC18 software compatible core. It does not provide
24
 * any of the additional functionality needed to form a full PIC18 micro-
25
 * controller system. Additional functionality such as I/O devices would
26
 * need to be integrated with the core. This core provides the necessary
27
 * signals to wire up WISHBONE compatible devices to it.
28
 *
29 10 sybreon
 * HISTORY
30
 * $Log: not supported by cvs2svn $
31 17 sybreon
 * Revision 1.6  2007/04/03 22:13:25  sybreon
32
 * Fixed various bugs:
33
 * - STATUS,C not correct for subtraction instructions
34
 * - Data memory indirect addressing mode bugs
35
 * - Other minor fixes
36
 *
37 15 sybreon
 * Revision 1.5  2007/03/04 23:26:37  sybreon
38
 * Rearranged code to make it synthesisable.
39
 *
40 12 sybreon
 * Revision 1.4  2006/12/29 18:08:56  sybreon
41
 * Minor code clean up
42 3 sybreon
 *
43 2 sybreon
 */
44
 
45
module ae18_core (/*AUTOARG*/
46
   // Outputs
47
   wb_clk_o, wb_rst_o, iwb_adr_o, iwb_dat_o, iwb_stb_o, iwb_we_o,
48
   iwb_sel_o, dwb_adr_o, dwb_dat_o, dwb_stb_o, dwb_we_o,
49
   // Inputs
50
   iwb_dat_i, iwb_ack_i, dwb_dat_i, dwb_ack_i, int_i, inte_i, clk_i,
51
   rst_i
52
   ) ;
53
   // Instruction address bit length
54
   parameter ISIZ = 20;
55
   // Data address bit length
56
   parameter DSIZ = 12;
57
   // WDT length
58
   parameter WSIZ = 16;
59
 
60
   // System WB
61
   output            wb_clk_o, wb_rst_o;
62
 
63
   // Instruction WB Bus
64 15 sybreon
   output [ISIZ-1:0] iwb_adr_o;
65 2 sybreon
   output [15:0]     iwb_dat_o;
66
   output            iwb_stb_o, iwb_we_o;
67
   output [1:0]      iwb_sel_o;
68
   input [15:0]      iwb_dat_i;
69
   input             iwb_ack_i;
70
 
71
   // Data WB Bus
72
   output [DSIZ-1:0] dwb_adr_o;
73
   output [7:0]      dwb_dat_o;
74
   output            dwb_stb_o, dwb_we_o;
75
   input [7:0]        dwb_dat_i;
76
   input             dwb_ack_i;
77
 
78
   // System
79
   input [1:0]        int_i;
80
   input [7:6]       inte_i;
81
   input             clk_i, rst_i;
82
 
83 17 sybreon
   /*
84
    * Parameters
85
    */
86 12 sybreon
   // State Registers
87
   parameter [2:0]
88
                FSM_RUN = 4'h0,
89
                FSM_ISRL = 4'h1,
90
                FSM_ISRH = 4'h2,
91
                FSM_SLEEP = 4'h3;
92
 
93
   parameter [1:0]
94
                FSM_Q0 = 2'h0,
95
                FSM_Q1 = 2'h1,
96
                FSM_Q2 = 2'h2,
97
                FSM_Q3 = 2'h3;
98
 
99
   // MX_SRC
100
   parameter [1:0]
101
                MXSRC_MASK = 2'h2,
102
                MXSRC_LIT = 2'h3,
103
                MXSRC_WREG = 2'h0,
104
                MXSRC_FILE = 2'h1;
105
   // MX_TGT
106
   parameter [1:0]
107
                MXTGT_MASK = 2'h2,
108
                MXTGT_LIT = 2'h3,
109
                MXTGT_WREG = 2'h0,
110
                MXTGT_FILE = 2'h1;
111
   // MX_DST
112
   parameter [1:0]
113
                MXDST_NULL = 2'h0,
114
                MXDST_EXT = 2'h1,
115
                MXDST_WREG = 2'h2,
116
                MXDST_FILE = 2'h3;
117
 
118
   // MX_ALU
119
   parameter [3:0]
120
                MXALU_XOR = 4'h0,
121
                MXALU_IOR = 4'h1,
122
                MXALU_AND = 4'h2,
123
                MXALU_SWAP = 4'h3,
124
                MXALU_ADD = 4'h4,
125
                MXALU_ADDC = 4'h5,
126
                MXALU_SUB = 4'h6,
127
                MXALU_SUBC = 4'h7,
128
                MXALU_RLNC = 4'h8,
129
                MXALU_RLC = 4'h9,
130
                MXALU_RRNC = 4'hA,
131
                MXALU_RRC = 4'hB,
132
                MXALU_NEG = 4'hC,
133
                // EXTRA
134
                MXALU_MOVLB = 4'hC,
135
                MXALU_DAW = 4'hD,
136
                MXALU_LFSR = 4'hE,
137
                MXALU_MUL = 4'hF;
138
 
139
        // MX_BSR   
140
   parameter [1:0]
141
                MXBSR_BSR = 2'o3,
142
                MXBSR_BSA = 2'o2,
143
                MXBSR_LIT = 2'o1,
144
                MXBSR_NUL = 2'o0;
145
 
146
        // MX_SKP
147
   parameter [2:0]
148
                MXSKP_SZ = 3'o1,
149
                MXSKP_SNZ = 3'o2,
150
                MXSKP_SNC = 3'o3,
151
                MXSKP_SU = 3'o4,
152
                MXSKP_SCC = 3'o7,
153
                MXSKP_NON = 3'o0;
154
 
155
   // NPC_MX
156
   parameter [2:0]
157
                MXNPC_FAR = 3'o3,
158
                MXNPC_NEAR = 3'o2,
159
                MXNPC_BCC = 3'o7,
160
                MXNPC_RET = 3'o1,
161
                MXNPC_RESET = 3'o4,
162
                MXNPC_ISRH = 3'o5,
163
                MXNPC_ISRL = 3'o6,
164
                MXNPC_INC = 3'o0;
165
 
166
   // MX_STA
167
   parameter [2:0]
168
                MXSTA_ALL = 3'o7,
169
                MXSTA_CZN = 3'o1,
170
                MXSTA_ZN = 3'o2,
171
                MXSTA_Z = 3'o3,
172
                MXSTA_C = 3'o4,
173
                MXSTA_NONE = 3'o0;
174
 
175
   // BCC_MX
176
   parameter [2:0]
177
                MXBCC_BZ = 3'o0,
178
                MXBCC_BNZ = 3'o1,
179
                MXBCC_BC = 3'o2,
180
                MXBCC_BNC = 3'o3,
181
                MXBCC_BOV = 3'o4,
182
                MXBCC_BNOV = 3'o5,
183
                MXBCC_BN = 3'o6,
184
                MXBCC_BNN = 3'o7;
185
 
186
   // STK_MX
187
   parameter [1:0]
188
                MXSTK_PUSH = 2'o2,
189
                MXSTK_POP = 2'o1,
190
                MXSTK_NONE = 2'o0;
191
 
192
   // SHADOW MX
193
   parameter [1:0]
194
                MXSHA_CALL = 2'o2,
195
                MXSHA_RET = 2'o1,
196
                MXSHA_NONE = 2'o0;
197
 
198
   // TBLRD/TBLWT MX
199
   parameter [3:0]
200
                MXTBL_RD = 4'h8,
201
                MXTBL_RDINC = 4'h9,
202
                MXTBL_RDDEC = 4'hA,
203
                MXTBL_RDPRE = 4'hB,
204
                MXTBL_WT = 4'hC,
205
                MXTBL_WTINC = 4'hD,
206
                MXTBL_WTDEC = 4'hE,
207
                MXTBL_WTPRE = 4'hF,
208
                MXTBL_NOP = 4'h0;
209
 
210 2 sybreon
   // Machine Status
211
   //output [3:0]      qena_o;
212
   //output [1:0]      qfsm_o;
213
   //output [1:0]      qmod_o;   
214
 
215
   // Special Function Registers
216
   reg [4:0]          rPCU;
217
   reg [7:0]          rPCH,rPCL, rTOSU, rTOSH, rTOSL,
218
                     rPCLATU, rPCLATH,
219
                     rTBLPTRU, rTBLPTRH, rTBLPTRL, rTABLAT,
220
                     rPRODH, rPRODL,
221
                     rFSR0H, rFSR0L, rFSR1H, rFSR1L, rFSR2H, rFSR2L;
222
 
223
   reg               rSWDTEN, rSTKFUL, rSTKUNF;
224 15 sybreon
   reg               rZ,rOV,rDC,rN,rC;
225
 
226 2 sybreon
   reg [5:0]          rSTKPTR, rSTKPTR_;
227
   reg [7:0]          rWREG, rWREG_;
228
   reg [7:0]          rBSR, rBSR_;
229
   reg [4:0]          rSTATUS_;
230 15 sybreon
 
231 2 sybreon
   // Control Word Registers
232
   reg [1:0]          rMXSRC, rMXTGT, rMXDST, rMXBSR, rMXSTK, rMXSHA;
233
   reg [2:0]          rMXSKP, rMXSTA, rMXNPC, rMXBCC;
234
   reg [3:0]          rMXALU, rMXFSR, rMXTBL;
235
   reg [15:0]         rEAPTR;
236
 
237
   // Control Path Registers
238
   reg               rCLRWDT, rRESET, rSLEEP;
239
   reg               rNSKP, rBCC, rSFRSTB;
240
   reg [7:0]          rSFRDAT;
241
 
242
 
243
   // Control flags
244
 
245
   /*
246
    * DESCRIPTION
247
    * AE18 PLL generator.
248
    * Clock and reset generation using on chip DCM/PLL.
249
    */
250
 
251
   wire              clk = clk_i;
252
   wire              xrst = rst_i;
253 12 sybreon
   wire              qrst = rRESET;
254 2 sybreon
   assign            wb_clk_o = clk_i;
255
   assign            wb_rst_o = ~rRESET;
256
 
257
   // WDT
258
   reg [WSIZ:0]      rWDT;
259
   always @(negedge clk or negedge qrst)
260
     if (!qrst) begin
261
        /*AUTORESET*/
262
        // Beginning of autoreset for uninitialized flops
263
        rWDT <= {(1+(WSIZ)){1'b0}};
264
        // End of automatics
265
     end else if (rCLRWDT|rSLEEP) begin
266 15 sybreon
        $display("\tWDT cleared.");
267 2 sybreon
        /*AUTORESET*/
268
        // Beginning of autoreset for uninitialized flops
269
        rWDT <= {(1+(WSIZ)){1'b0}};
270
        // End of automatics
271
     end else if (rSWDTEN)
272
        rWDT <= #1 rWDT + 1;
273
 
274
   // RAND
275
   reg [7:0] rPRNG;
276
   always @(negedge clk or negedge xrst)
277
     if (!xrst)
278
        /*AUTORESET*/
279
        // Beginning of autoreset for uninitialized flops
280
        rPRNG <= 8'h0;
281
        // End of automatics
282
     else
283
       rPRNG <= #1 {rPRNG[6:0], ^{rPRNG[7],rPRNG[5:3]}};
284
 
285
   /*
286
    * DESCRIPTION
287
    * AE18 MCU conductor.
288
    * Determines and generates the control signal for machine states.
289
    */
290
 
291
   reg [3:0]          rQCLK;
292
   reg [1:0]          rQCNT;
293
   reg [1:0]          rFSM, rNXT;
294
 
295
   //assign          qena_o = rQCLK;
296
   //assign          qfsm_o = rQCNT;
297
   //assign          qmod_o = rFSM;
298
 
299
   wire              xrun = !((iwb_stb_o ^ iwb_ack_i) | (dwb_stb_o ^ dwb_ack_i));
300
   wire              qrun = (rFSM != FSM_SLEEP);
301
   wire [3:0]         qena = rQCLK;
302
   wire [1:0]         qfsm = rQCNT;
303
 
304
   // Interrupt Debounce
305
   reg [2:0]          rINTH,rINTL;
306
   wire              fINTH = (rINTH == 3'o3);
307
   wire              fINTL = (rINTL == 3'o3);
308
   always @(negedge clk or negedge xrst)
309
     if (!xrst) begin
310
        /*AUTORESET*/
311
        // Beginning of autoreset for uninitialized flops
312
        rINTH <= 3'h0;
313
        rINTL <= 3'h0;
314
        // End of automatics
315
     end else begin
316
        rINTH <= #1 {rINTH[1:0],int_i[1]};
317
        rINTL <= #1 {rINTL[1:0],int_i[0]};
318
     end
319
 
320
   // Control Wires
321
   wire              inth = fINTH;
322
   wire              isrh = inte_i[7] & fINTH;
323
   wire              intl = ~isrh & fINTL;
324
   wire              isrl = intl & inte_i[6];
325
 
326
   // QCLK and QCNT sync
327
   always @(negedge clk or negedge qrst)
328
     if (!qrst) begin
329
        rQCLK <= 4'h8;
330
        rQCNT <= 2'h3;
331
     end else if (xrun & qrun) begin
332
        rQCLK <= #1 {rQCLK[2:0],rQCLK[3]};
333
        rQCNT <= #1 rQCNT + 2'd1;
334
     end
335
 
336
   // rINTF Latch
337
   reg [1:0] rINTF;
338
   always @(negedge clk or negedge xrst)
339
     if (!xrst) begin
340
       /*AUTORESET*/
341
       // Beginning of autoreset for uninitialized flops
342
       rINTF <= 2'h0;
343
       // End of automatics
344
     end else begin
345
        rINTF <= #1 (^rFSM) ? rFSM :
346
                 (qena[3]) ? 2'b00 :
347
                 rINTF;
348
     end
349
 
350
   // FSM Sync
351
   always @(negedge clk or negedge qrst)
352
     if (!qrst)
353
       /*AUTORESET*/
354
       // Beginning of autoreset for uninitialized flops
355
       rFSM <= 2'h0;
356
       // End of automatics
357
     else// if (qena[3])
358
       rFSM <= #1 rNXT;
359
 
360
   // FSM Logic
361
   always @(/*AUTOSENSE*/inth or intl or isrh or isrl or rFSM
362
            or rSLEEP)
363
     case (rFSM)
364
       //FSM_RESET: rNXT <= FSM_RUN;
365
       FSM_ISRH: rNXT <= FSM_RUN;
366
       FSM_ISRL: rNXT <= FSM_RUN;
367
       FSM_SLEEP: begin
368
          if (inth) rNXT <= FSM_ISRH;
369
          else if (intl) rNXT <= FSM_ISRL;
370
          //else if (rWDT[WSIZ]) rNXT <= FSM_RUN;         
371
          else rNXT <= FSM_SLEEP;
372
       end
373
       default: begin
374
          if (isrh) rNXT <= FSM_ISRH;
375
          else if (isrl) rNXT <= FSM_ISRL;
376
          else if (rSLEEP) rNXT <= FSM_SLEEP;
377
          else rNXT <= FSM_RUN;
378
       end
379
     endcase // case(rFSM)
380
 
381
 
382
   /*
383
    * DESCRIPTION
384
    * Instruction WB logic
385
    */
386
 
387
   // WB Registers
388 3 sybreon
   reg [23:0]    rIWBADR;
389 2 sybreon
   reg               rIWBSTB, rIWBWE;
390
   reg [1:0]          rIWBSEL;
391
   //reg [15:0]              rIDAT;
392
 
393 15 sybreon
   assign            iwb_adr_o = {rIWBADR,1'b0};
394 2 sybreon
   assign            iwb_stb_o = rIWBSTB;
395
   assign            iwb_we_o = rIWBWE;
396
   assign            iwb_dat_o = {rTABLAT,rTABLAT};
397
   assign            iwb_sel_o = rIWBSEL;
398
 
399
   reg [15:0]         rIREG, rROMLAT;
400
   reg [7:0]          rILAT;
401
 
402
   reg [ISIZ-2:0]    rPCNXT;
403
   wire [ISIZ-2:0]   wPCLAT = {rPCU,rPCH,rPCL[7:1]};
404
 
405
   // IWB ADDR signal
406
   always @(negedge clk or negedge qrst)
407
     if (!qrst) begin
408
       /*AUTORESET*/
409
       // Beginning of autoreset for uninitialized flops
410 3 sybreon
       rIWBADR <= 24'h0;
411 2 sybreon
       // End of automatics
412
     end else if (qrun)
413
       case (qfsm)
414
         FSM_Q3: begin
415
            case (rINTF)
416
              FSM_ISRH: rIWBADR <= #1 23'h000004;
417
              FSM_ISRL: rIWBADR <= #1 23'h00000C;
418 15 sybreon
              default: rIWBADR <= #1 rPCNXT;
419
            endcase // case(rINTF)
420 2 sybreon
         end
421
         FSM_Q1: begin
422
            rIWBADR <= #1 (rMXTBL == MXTBL_NOP) ? rIWBADR : {rTBLPTRU,rTBLPTRH,rTBLPTRL[7:1]};
423
         end
424
       endcase // case(qfsm)
425
 
426
   // PC next calculation
427 12 sybreon
   wire [ISIZ-2:0]   wPCINC = rIWBADR + 1;
428 2 sybreon
   wire [ISIZ-2:0]   wPCBCC = (!rNSKP) ? wPCINC :
429
                     (rBCC) ? rIWBADR + {{(ISIZ-8){rIREG[7]}},rIREG[7:0]} : wPCINC;
430
   wire [ISIZ-2:0]   wPCNEAR = (!rNSKP) ? wPCINC : rIWBADR + {{(ISIZ-11){rIREG[10]}},rIREG[10:0]};
431
   wire [ISIZ-2:0]   wPCFAR = (!rNSKP) ? wPCINC : {rROMLAT[11:0],rIREG[7:0]};
432
   wire [ISIZ-2:0]   wPCSTK = (!rNSKP) ? wPCINC : {rTOSU, rTOSH, rTOSL[7:1]};
433
 
434
   always @(negedge clk or negedge qrst)
435
     if (!qrst) begin
436
        /*AUTORESET*/
437
        // Beginning of autoreset for uninitialized flops
438
        rPCNXT <= {(1+(ISIZ-2)){1'b0}};
439
        // End of automatics
440
     end else if (qena[1]) begin
441
        case (rMXNPC)
442
          MXNPC_RET: rPCNXT <= #1 wPCSTK;
443
          MXNPC_RESET: rPCNXT <= #1 24'h00;
444
          MXNPC_ISRH: rPCNXT <= #1 24'h08;
445
          MXNPC_ISRL: rPCNXT <= #1 24'h18;
446
          MXNPC_NEAR: rPCNXT <= #1 wPCNEAR;
447
          MXNPC_FAR: rPCNXT <= #1 wPCFAR;
448
          MXNPC_BCC: rPCNXT <= #1 wPCBCC;
449
          default: rPCNXT <= #1 wPCINC;
450
        endcase // case(rMXNPC)
451
     end // if (qena[1])
452
 
453
   // ROMLAT + IREG
454
   always @(negedge clk or negedge qrst)
455
     if (!qrst) begin
456
        /*AUTORESET*/
457
        // Beginning of autoreset for uninitialized flops
458
        rILAT <= 8'h0;
459
        rIREG <= 16'h0;
460
        rROMLAT <= 16'h0;
461
        // End of automatics
462
     end else if (qrun) begin
463
        case (qfsm)
464
          FSM_Q0: rROMLAT <= #1 iwb_dat_i;
465
          FSM_Q3: rIREG <= #1 rROMLAT;
466 3 sybreon
          FSM_Q2: rILAT <= (rTBLPTRL[0]) ? iwb_dat_i[7:0] : iwb_dat_i[15:8];
467 2 sybreon
        endcase // case(qfsm)
468
     end
469
 
470
   // IWB STB signal
471
   wire wISTB = (rMXTBL != MXTBL_NOP);
472
   always @(negedge clk or negedge qrst)
473
     if (!qrst)
474
       /*AUTORESET*/
475
       // Beginning of autoreset for uninitialized flops
476
       rIWBSTB <= 1'h0;
477
       // End of automatics
478
     else if (qrun)
479
       case (qfsm)
480
         FSM_Q3: rIWBSTB <= #1 1'b1;
481
         FSM_Q1: rIWBSTB <= #1 wISTB & rNSKP;
482
         default: rIWBSTB <= #1 1'b0;
483
       endcase // case(qfsm)
484
 
485
   // IWB WE signal
486
   wire wIWE = (rMXTBL == MXTBL_WT) | (rMXTBL == MXTBL_WTINC) | (rMXTBL == MXTBL_WTDEC) | (rMXTBL == MXTBL_WTPRE);
487
   always @(negedge clk or negedge qrst)
488
     if (!qrst)
489
       /*AUTORESET*/
490
       // Beginning of autoreset for uninitialized flops
491
       rIWBWE <= 1'h0;
492
       // End of automatics
493
     else if (qrun)
494
       case (qfsm)
495
         FSM_Q1: rIWBWE <= #1 wIWE & rNSKP;
496
         default: rIWBWE <= #1 1'b0;
497
       endcase // case(qfsm)
498
 
499
   // IWB SEL signal
500
   always @(negedge clk or negedge qrst)
501
     if (!qrst)
502
       /*AUTORESET*/
503
       // Beginning of autoreset for uninitialized flops
504
       rIWBSEL <= 2'h0;
505
       // End of automatics
506
     else if (qrun)
507
       case (qfsm)
508
         FSM_Q3: rIWBSEL <= #1 2'h3;
509
         FSM_Q1: rIWBSEL <= {rTBLPTRL[0],~rTBLPTRL[0]};
510
         default: rIWBSEL <= #1 2'd0;
511
       endcase // case(qfsm)
512
 
513
   /*
514
    * DESCRIPTION
515
    * Instruction decode logic
516
    */
517
 
518
   wire [3:0] fOPCH = rROMLAT[15:12];
519
   wire [3:0] fOPCL = rROMLAT[11:8];
520
   wire [7:0] fOPCK = rROMLAT[7:0];
521
 
522
   // NIBBLE DECODER
523
   wire       fOPC0 = (fOPCH == 4'h0);
524
   wire       fOPC1 = (fOPCH == 4'h1);
525
   wire       fOPC2 = (fOPCH == 4'h2);
526
   wire       fOPC3 = (fOPCH == 4'h3);
527
   wire       fOPC4 = (fOPCH == 4'h4);
528
   wire       fOPC5 = (fOPCH == 4'h5);
529
   wire       fOPC6 = (fOPCH == 4'h6);
530
   wire       fOPC7 = (fOPCH == 4'h7);
531
   wire       fOPC8 = (fOPCH == 4'h8);
532
   wire       fOPC9 = (fOPCH == 4'h9);
533
   wire       fOPCA = (fOPCH == 4'hA);
534
   wire       fOPCB = (fOPCH == 4'hB);
535
   wire       fOPCC = (fOPCH == 4'hC);
536
   wire       fOPCD = (fOPCH == 4'hD);
537
   wire       fOPCE = (fOPCH == 4'hE);
538
   wire       fOPCF = (fOPCH == 4'hF);
539
   wire       fOP4G0 = (fOPCL == 4'h0);
540
   wire       fOP4G1 = (fOPCL == 4'h1);
541
   wire       fOP4G2 = (fOPCL == 4'h2);
542
   wire       fOP4G3 = (fOPCL == 4'h3);
543
   wire       fOP4G4 = (fOPCL == 4'h4);
544
   wire       fOP4G5 = (fOPCL == 4'h5);
545
   wire       fOP4G6 = (fOPCL == 4'h6);
546
   wire       fOP4G7 = (fOPCL == 4'h7);
547
   wire       fOP4G8 = (fOPCL == 4'h8);
548
   wire       fOP4G9 = (fOPCL == 4'h9);
549
   wire       fOP4GA = (fOPCL == 4'hA);
550
   wire       fOP4GB = (fOPCL == 4'hB);
551
   wire       fOP4GC = (fOPCL == 4'hC);
552
   wire       fOP4GD = (fOPCL == 4'hD);
553
   wire       fOP4GE = (fOPCL == 4'hE);
554
   wire       fOP4GF = (fOPCL == 4'hF);
555
   wire       fOP3G0 = (fOPCL[3:1] == 3'h0);
556
   wire       fOP3G1 = (fOPCL[3:1] == 3'h1);
557
   wire       fOP3G2 = (fOPCL[3:1] == 3'h2);
558
   wire       fOP3G3 = (fOPCL[3:1] == 3'h3);
559
   wire       fOP3G4 = (fOPCL[3:1] == 3'h4);
560
   wire       fOP3G5 = (fOPCL[3:1] == 3'h5);
561
   wire       fOP3G6 = (fOPCL[3:1] == 3'h6);
562
   wire       fOP3G7 = (fOPCL[3:1] == 3'h7);
563
   wire       fOP2G0 = (fOPCL[3:2] == 2'h0);
564
   wire       fOP2G1 = (fOPCL[3:2] == 2'h1);
565
   wire       fOP2G2 = (fOPCL[3:2] == 2'h2);
566
   wire       fOP2G3 = (fOPCL[3:2] == 2'h3);
567
   wire       fOP1G0 = (fOPCL[3] == 1'b0);
568
   wire       fOP1G1 = (fOPCL[3] == 1'b1);
569
 
570
   // GROUP F
571
   wire       fNOPF = fOPCF;
572
   // GROUP E
573
   wire       fBZ = fOPCE & fOP4G0;
574
   wire       fBNZ = fOPCE & fOP4G1;
575
   wire       fBC = fOPCE & fOP4G2;
576
   wire       fBNC = fOPCE & fOP4G3;
577
   wire       fBOV = fOPCE & fOP4G4;
578
   wire       fBNOV = fOPCE & fOP4G5;
579
   wire       fBN = fOPCE & fOP4G6;
580
   wire       fBNN = fOPCE & fOP4G7;
581
   wire       fCALL = fOPCE & fOP3G6;
582
   wire       fLFSR = fOPCE & fOP4GE;
583
   wire       fGOTO = fOPCE & fOP4GF;
584
   // GROUP D
585
   wire       fBRA = fOPCD & fOP1G0;
586
   wire       fRCALL = fOPCD & fOP1G1;
587
   // GROUP C
588
   wire       fMOVFF = fOPCC;
589
   // GROUP B/A/9/8/7
590
   wire       fBTFSC = fOPCB;
591
   wire       fBTFSS = fOPCA;
592
   wire       fBCF = fOPC9;
593
   wire       fBSF = fOPC8;
594
   wire       fBTG = fOPC7;
595
   // GROUP 6
596
   wire       fCPFSLT = fOPC6 & fOP3G0;
597
   wire       fCPFSEQ = fOPC6 & fOP3G1;
598
   wire       fCPFSGT = fOPC6 & fOP3G2;
599
   wire       fTSTFSZ = fOPC6 & fOP3G3;
600
   wire       fSETF = fOPC6 & fOP3G4;
601
   wire       fCLRF = fOPC6 & fOP3G5;
602
   wire       fNEGF = fOPC6 & fOP3G6;
603
   wire       fMOVWF = fOPC6 & fOP3G7;
604
   // GROUP 5
605
   wire       fMOVF = fOPC5 & fOP2G0;
606
   wire       fSUBFWB = fOPC5 & fOP2G1;
607
   wire       fSUBWFB = fOPC5 & fOP2G2;
608
   wire       fSUBWF = fOPC5 & fOP2G3;
609
   // GROUP 4
610
   wire       fRRNCF = fOPC4 & fOP2G0;
611
   wire       fRLNCF = fOPC4 & fOP2G1;
612
   wire       fINFSNZ = fOPC4 & fOP2G2;
613
   wire       fDCFSNZ = fOPC4 & fOP2G3;
614
   // GROUP 3
615
   wire       fRRCF = fOPC3 & fOP2G0;
616
   wire       fRLCF = fOPC3 & fOP2G1;
617
   wire       fSWAPF = fOPC3 & fOP2G2;
618
   wire       fINCFSZ = fOPC3 & fOP2G3;
619
   // GROUP 2
620
   wire       fADDWFC = fOPC2 & fOP2G0;
621
   wire       fADDWF = fOPC2 & fOP2G1;
622
   wire       fINCF = fOPC2 & fOP2G2;
623
   wire       fDECFSZ = fOPC2 & fOP2G3;
624
   // GROUP 1
625
   wire       fIORWF = fOPC1 & fOP2G0;
626
   wire       fANDWF = fOPC1 & fOP2G1;
627
   wire       fXORWF = fOPC1 & fOP2G2;
628
   wire       fCOMF = fOPC1 & fOP2G3;
629
   // GROUP 0
630
   wire       fMISC = fOPC0 & fOP4G0;
631
   wire       fMOVLB = fOPC0 & fOP4G1;
632
   wire       fMULWF = fOPC0 & fOP3G1;
633
   wire       fDECF = fOPC0 & fOP2G1;
634
   wire       fSUBLW = fOPC0 & fOP4G8;
635
   wire       fIORLW = fOPC0 & fOP4G9;
636
   wire       fXORLW = fOPC0 & fOP4GA;
637
   wire       fANDLW = fOPC0 & fOP4GB;
638
   wire       fRETLW = fOPC0 & fOP4GC;
639
   wire       fMULLW = fOPC0 & fOP4GD;
640
   wire       fMOVLW = fOPC0 & fOP4GE;
641
   wire       fADDLW = fOPC0 & fOP4GF;
642
   // GROUP MISC
643
   wire       fNOP0 = fMISC & (fOPCK == 8'h00);
644
   wire       fRESET = fMISC & (fOPCK == 8'hFF);
645
   wire       fSLEEP = fMISC & (fOPCK == 8'h03);
646
   wire       fCLRWDT = fMISC & (fOPCK == 8'h04);
647
   wire       fPUSH = fMISC & (fOPCK == 8'h05);
648
   wire       fPOP = fMISC & (fOPCK == 8'h06);
649
   wire       fDAW = fMISC & (fOPCK == 8'h07);
650
   wire       fRETFIE = fMISC & (fOPCK == 8'h10 | fOPCK == 8'h11);
651
   wire       fRETURN = fMISC & (fOPCK == 8'h12 | fOPCK == 8'h13);
652
   wire       fNOP = fNOP0 | fNOPF;
653
   wire       fTBLRDWT = fMISC & (fOPCK[7:3] == 5'h01);
654
 
655
   // MX INT
656
   wire       fINT = ^rINTF;
657
 
658
   // MX_SRC
659
   wire [1:0]      wMXSRC =
660
                  (fMOVLW|fRETLW|fCOMF|
661
                   fDECF|fDECFSZ|fDCFSNZ|
662
                   fINCF|fINCFSZ|fINFSNZ|
663
                   fMOVF|fMOVFF|fMOVWF|
664
                   fSETF|fTSTFSZ) ? MXSRC_LIT :
665
                  (fBSF|fBTG|fBTFSC|fBTFSS) ? MXSRC_MASK :
666
                  (fBCF|fCPFSLT|fSUBFWB) ? MXSRC_FILE :
667
                  MXSRC_WREG;
668
 
669
   // MX_TGT
670
   wire [1:0]      wMXTGT =
671
                  (fBCF) ? MXTGT_MASK :
672
                  (fRETLW|fMOVLW|
673
                   fMULLW|
674
                   fADDLW|fSUBLW|
675
                   fANDLW|fXORLW|fIORLW) ? MXTGT_LIT :
676
                  (fBSF|fBTFSC|fBTFSS|fBTG|
677
                   fADDWF|fADDWFC|fSUBWF|fSUBWFB|fMULWF|
678
                   fMULWF|fSWAPF|
679
                   fANDWF|fIORWF|fXORWF|
680
                   fCOMF|fMOVF|fMOVFF|
681
                   fCPFSEQ|fCPFSGT|fNEGF|
682
                   fDECF|fDECFSZ|fDCFSNZ|
683
                   fINCF|fINCFSZ|fINFSNZ|
684
                   fRLCF|fRLNCF|fRRCF|fRRNCF|
685
                   fTSTFSZ) ? MXTGT_FILE :
686
                  MXTGT_WREG;
687
 
688
   // MX_DST
689
   wire [1:0]      wMXDST =
690
                  (fMULWF|fMULLW|fMOVLB|fLFSR|fDAW) ? MXDST_EXT :
691
                  (fBCF|fBSF|fBTG|
692
                   fCLRF|
693
                   fMOVFF|fMOVWF|
694
                   fNEGF|fSETF) ? MXDST_FILE :
695
                  (fADDLW|fSUBLW|
696
                   fANDLW|fIORLW|fXORLW|
697
                   fMOVLW|fRETLW) ? MXDST_WREG :
698
                  (fADDWF|fADDWFC|
699
                   fANDWF|fIORWF|fXORWF|
700
                   fMOVF|fSWAPF|fCOMF|
701
                   fSUBFWB|fSUBWF|fSUBWFB|
702
                   fDECF|fDECFSZ|fDCFSNZ|
703
                   fINCF|fINCFSZ|fINFSNZ|
704
                   fRLCF|fRLNCF|fRRCF|fRRNCF) ? {1'b1,fOPCL[1]} :
705
                  MXDST_NULL;
706
 
707
   // MX_ALU
708
   wire [3:0]      wMXALU =
709
                  (fDAW) ? MXALU_DAW :
710
                  (fMOVLB) ? MXALU_MOVLB :
711
                  (fLFSR) ? MXALU_LFSR :
712
                  (fMULLW|fMULWF) ? MXALU_MUL :
713
                  (fNEGF) ? MXALU_NEG :
714
                  (fADDLW|fADDWF|
715
                   fDECF|fDECFSZ|fDCFSNZ) ? MXALU_ADD :
716
                  (fSUBLW|fSUBWF|
717
                   fCPFSEQ|fCPFSGT|fCPFSLT|
718
                   fINCF|fINCFSZ|fINFSNZ) ? MXALU_SUB :
719
                  (fSUBWFB|fSUBFWB) ? MXALU_SUBC :
720
                  (fADDWFC) ? MXALU_ADDC :
721
                  (fRRCF) ? MXALU_RRC :
722
                  (fRRNCF) ? MXALU_RRNC :
723
                  (fRLCF) ? MXALU_RLC :
724
                  (fRLNCF) ? MXALU_RLNC :
725
                  (fSWAPF) ? MXALU_SWAP :
726
                  (fSETF|fIORWF|fIORLW|fBSF) ? MXALU_IOR :
727
                  (fBCF|fANDWF|fANDLW|
728
                   fRETLW|fBTFSS|fBTFSC|fTSTFSZ|
729
                   fMOVF|fMOVFF|fMOVWF|fMOVLW) ? MXALU_AND :
730
                  MXALU_XOR;
731
 
732
   // MX_BSR   
733
   wire [1:0]      wMXBSR =
734
                  (fMOVFF) ? MXBSR_LIT :
735
                  (fBCF|fBSF|fBTG|fBTFSS|fBTFSC|
736
                   fANDWF|fIORWF|fXORWF|fCOMF|
737
                   fADDWF|fADDWFC|fSUBWF|fSUBWFB|fSUBFWB|fMULWF|
738
                   fCLRF|fMOVF|fMOVWF|fSETF|fSWAPF|
739
                   fCPFSEQ|fCPFSGT|fCPFSLT|fTSTFSZ|
740
                   fINCF|fINCFSZ|fINFSNZ|fDECF|fDECFSZ|fDCFSNZ|
741
                   fRLCF|fRLNCF|fRRCF|fRRNCF) ? {1'b1, fOPCL[0]} :
742
                  MXBSR_NUL;
743
 
744
   // MX_SKP
745
   wire [2:0]      wMXSKP =
746
                  (fTSTFSZ|fINCFSZ|fDECFSZ|fCPFSEQ|fBTFSC) ? MXSKP_SZ :
747
                  (fINFSNZ|fDCFSNZ|fBTFSS) ? MXSKP_SNZ :
748
                  (fCPFSGT|fCPFSLT) ? MXSKP_SNC :
749
                  (fBC|fBNC|fBZ|fBNZ|fBN|fBNN|fBOV|fBNOV) ? MXSKP_SCC :
750
                  (fBRA|fCALL|fRCALL|fGOTO|fRETFIE|fRETURN|fRETLW) ? MXSKP_SU :
751
                  MXSKP_NON;
752
 
753
   // NPC_MX
754
   wire [2:0]      wMXNPC =
755
                  (fBC|fBNC|fBN|fBNN|fBOV|fBNOV|fBZ|fBNZ) ? MXNPC_BCC :
756
                  (fBRA|fRCALL) ? MXNPC_NEAR :
757
                  (fCALL|fGOTO) ? MXNPC_FAR :
758
                  (fRETFIE|fRETURN|fRETLW) ? MXNPC_RET :
759
                  MXNPC_INC;
760
 
761
   // MX_STA
762
   wire [2:0]      wMXSTA =
763
                  (fADDLW|fADDWF|fADDWFC|
764
                   fSUBLW|fSUBWF|fSUBWFB|fSUBFWB|
765
                   fDECF|fINCF|fNEGF) ? MXSTA_ALL :
766
                  (fRRCF|fRLCF) ? MXSTA_CZN :
767
                  (fRRNCF|fRLNCF|
768
                   fMOVF|fCOMF|
769
                   fIORWF|fANDWF|fXORWF|fIORLW|fANDLW|fXORLW) ? MXSTA_ZN :
770
                  (fDAW) ? MXSTA_C :
771
                  (fCLRF) ? MXSTA_Z :
772
                  MXSTA_NONE;
773
 
774
   // BCC_MX
775
   wire [2:0]      wMXBCC = fOPCL[2:0];
776
 
777
   // STK_MX
778
   wire [1:0]      wMXSTK =
779
                  (fRETFIE|fRETLW|fRETURN|fPOP) ? MXSTK_POP :
780
                  (fCALL|fRCALL|fPUSH|fINT) ? MXSTK_PUSH :
781
                  MXSTK_NONE;
782
 
783
   // SHADOW MX
784
   wire [1:0]      wMXSHA =
785
                  (fCALL) ? {fOPCL[0] ,1'b0} :
786
                  (fINT) ? {MXSHA_CALL} :
787
                  (fRETURN|fRETFIE) ? {1'b0,fOPCK[0]} :
788
                  1'b0;
789
 
790
   // TBLRD/TBLWT MX
791
   wire [3:0]      wMXTBL =
792
                  (fTBLRDWT) ? fOPCK[3:0] :
793
                  MXTBL_NOP;
794
 
795
   // FSR DECODER   
796
   parameter [15:0]
797
                aPLUSW2 = 16'hFFDB,
798
                aPREINC2 = 16'hFFDC,
799
                aPOSTDEC2 = 16'hFFDD,
800
                aPOSTINC2 = 16'hFFDE,
801
                aINDF2 = 16'hFFDF,
802
                aPLUSW1 = 16'hFFE3,
803
                aPREINC1 = 16'hFFE4,
804
                aPOSTDEC1 = 16'hFFE5,
805
                aPOSTINC1 = 16'hFFE6,
806
                aINDF1 = 16'hFFE7,
807
                aPLUSW0 = 16'hFFEB,
808
                aPREINC0 = 16'hFFEC,
809
                aPOSTDEC0 = 16'hFFED,
810
                aPOSTINC0 = 16'hFFEE,
811
                aINDF0 = 16'hFFEF;
812
 
813 15 sybreon
   wire            fGFF = (rEAPTR[15:6] == 10'h03F) | (rEAPTR[15:6] == 10'h3FF);
814 2 sybreon
   wire            fGFSR0 = (rEAPTR[5:3] == 3'o5);
815
   wire            fGFSR1 = (rEAPTR[5:3] == 3'o4);
816
   wire            fGFSR2 = (rEAPTR[5:3] == 3'o3);
817
   wire            fGPLUSW = (rEAPTR[2:0] == 3'o3);
818
   wire            fGPREINC = (rEAPTR[2:0] == 3'o4);
819
   wire            fGPOSTDEC = (rEAPTR[2:0] == 3'o5);
820
   wire            fGPOSTINC = (rEAPTR[2:0] == 3'o6);
821
   wire            fGINDF = (rEAPTR[2:0] == 3'o7);
822
 
823
   wire            fPLUSW2 = fGFF & fGFSR2 & fGPLUSW;
824
   wire            fPREINC2 = fGFF & fGFSR2 & fGPREINC;
825
   wire            fPOSTDEC2 = fGFF & fGFSR2 & fGPOSTDEC;
826
   wire            fPOSTINC2 = fGFF & fGFSR2 & fGPOSTINC;
827
   wire            fINDF2 = fGFF & fGFSR2 & fGINDF;
828
   wire            fPLUSW1 = fGFF & fGFSR1 & fGPLUSW;
829
   wire            fPREINC1 = fGFF & fGFSR1 & fGPREINC;
830
   wire            fPOSTDEC1 = fGFF & fGFSR1 & fGPOSTDEC;
831
   wire            fPOSTINC1 = fGFF & fGFSR1 & fGPOSTINC;
832
   wire            fINDF1 = fGFF & fGFSR1 & fGINDF;
833
   wire            fPLUSW0 = fGFF & fGFSR0 & fGPLUSW;
834
   wire            fPREINC0 = fGFF & fGFSR0 & fGPREINC;
835
   wire            fPOSTDEC0 = fGFF & fGFSR0 & fGPOSTDEC;
836
   wire            fPOSTINC0 = fGFF & fGFSR0 & fGPOSTINC;
837
   wire            fINDF0 = fGFF & fGFSR0 & fGINDF;
838
 
839
   parameter [3:0]
840
                MXFSR_INDF2 = 4'hF,
841
                MXFSR_POSTINC2 = 4'hE,
842
                MXFSR_POSTDEC2 = 4'hD,
843
                MXFSR_PREINC2 = 4'hC,
844
                MXFSR_PLUSW2 = 4'hB,
845
                MXFSR_INDF1 = 4'hA,
846
                MXFSR_POSTINC1 = 4'h9,
847
                MXFSR_POSTDEC1 = 4'h8,
848
                MXFSR_PREINC1 = 4'h7,
849
                MXFSR_PLUSW1 = 4'h6,
850
                MXFSR_INDF0 = 4'h5,
851
                MXFSR_POSTINC0 = 4'h4,
852
                MXFSR_POSTDEC0 = 4'h3,
853
                MXFSR_PREINC0 = 4'h2,
854
                MXFSR_PLUSW0 = 4'h1,
855
                MXFSR_NORM = 4'h0;
856
 
857
   wire [3:0] wMXFSR =
858
              (fINDF0) ? MXFSR_INDF0 :
859
              (fPLUSW0) ? MXFSR_PLUSW0 :
860
              (fPREINC0) ? MXFSR_PREINC0 :
861
              (fPOSTINC0) ? MXFSR_POSTINC0 :
862
              (fPOSTDEC0) ? MXFSR_POSTDEC0 :
863
              (fINDF1) ? MXFSR_INDF1 :
864
              (fPLUSW1) ? MXFSR_PLUSW1 :
865
              (fPREINC1) ? MXFSR_PREINC1 :
866
              (fPOSTINC1) ? MXFSR_POSTINC1 :
867
              (fPOSTDEC1) ? MXFSR_POSTDEC1 :
868
              (fINDF2) ? MXFSR_INDF2 :
869
              (fPLUSW2) ? MXFSR_PLUSW2 :
870
              (fPREINC2) ? MXFSR_PREINC2 :
871
              (fPOSTINC2) ? MXFSR_POSTINC2 :
872
              (fPOSTDEC2) ? MXFSR_POSTDEC2 :
873
              MXFSR_NORM;
874
 
875
   always @(negedge clk or negedge qrst)
876
     if (!qrst)
877
       /*AUTORESET*/
878
       // Beginning of autoreset for uninitialized flops
879
       rMXBSR <= 2'h0;
880
       // End of automatics
881
     else if (qena[1])
882
       rMXBSR <= #1 wMXBSR;
883
 
884
   // Control Word
885
   always @(negedge clk or negedge qrst)
886
     if (!qrst) begin
887
        /*AUTORESET*/
888
        // Beginning of autoreset for uninitialized flops
889
        rMXALU <= 4'h0;
890
        rMXBCC <= 3'h0;
891
        rMXDST <= 2'h0;
892
        rMXFSR <= 4'h0;
893
        rMXNPC <= 3'h0;
894
        rMXSHA <= 2'h0;
895
        rMXSKP <= 3'h0;
896
        rMXSRC <= 2'h0;
897
        rMXSTA <= 3'h0;
898
        rMXSTK <= 2'h0;
899
        rMXTBL <= 4'h0;
900
        rMXTGT <= 2'h0;
901
        // End of automatics
902
     end else if (qena[3]) begin // if (!qrst)
903
        rMXTGT <= #1 wMXTGT;
904
        rMXSRC <= #1 wMXSRC;
905
        rMXALU <= #1 wMXALU;
906
        rMXNPC <= #1 wMXNPC;
907
        rMXDST <= #1 wMXDST;
908
        rMXSTA <= #1 wMXSTA;
909
        rMXSKP <= #1 wMXSKP;
910
        rMXBCC <= #1 wMXBCC;
911
        rMXSTK <= #1 wMXSTK;
912
        rMXFSR <= #1 wMXFSR;
913
        rMXSHA <= #1 wMXSHA;
914
        rMXTBL <= #1 wMXTBL;
915
     end // if (qena[3])
916
 
917
   /*
918
    * DESCRIPTION
919
    * EA pre calculation
920
    */
921
 
922
   wire [15:0]   wFILEBSR = {rBSR, rROMLAT[7:0]};
923
   wire [15:0]   wFILEBSA = { {(8){rROMLAT[7]}}, rROMLAT[7:0]};
924
   wire [15:0]   wFILELIT = {rBSR[7:4],rROMLAT[11:0]};
925
   //wire [DSIZ-1:0]   wFILEBSR = {rBSR, rROMLAT[7:0]};
926
   //wire [DSIZ-1:0]   wFILEBSA = { {(8){rROMLAT[7]}}, rROMLAT[7:0]};
927
   //wire [DSIZ-1:0]   wFILELIT = {rROMLAT[11:0]};   
928
   always @(negedge clk or negedge qrst)
929
     if (!qrst) begin
930
        /*AUTORESET*/
931
        // Beginning of autoreset for uninitialized flops
932
        rEAPTR <= 16'h0;
933
        // End of automatics
934
     end else if (qena[2]) begin
935
       case (rMXBSR)
936
         MXBSR_BSR: rEAPTR <= #1 wFILEBSR;
937
         MXBSR_BSA: rEAPTR <= #1 wFILEBSA;
938
         MXBSR_LIT: rEAPTR <= #1 wFILELIT;
939
         default: rEAPTR <= #1 rEAPTR;
940
       endcase // case(rMXBSR)
941
     end
942
 
943
   /*
944
    * DESCRIPTION
945
    * Arithmetic Shift Logic Unit
946
    */
947
 
948
   // BITMASK
949
   reg [7:0]       rMASK;
950
   wire [7:0]      wMASK =
951
                  (fOP3G0) ? 8'h01 :
952
                  (fOP3G1) ? 8'h02 :
953
                  (fOP3G2) ? 8'h04 :
954
                  (fOP3G3) ? 8'h08 :
955
                  (fOP3G4) ? 8'h10 :
956
                  (fOP3G5) ? 8'h20 :
957
                  (fOP3G6) ? 8'h40 :
958
                  8'h80;
959
   always @(negedge clk or negedge qrst)
960
     if (!qrst)
961
       /*AUTORESET*/
962
       // Beginning of autoreset for uninitialized flops
963
       rMASK <= 8'h0;
964
       // End of automatics
965
     else if (qena[2] & rNSKP)
966
       rMASK <= #1 wMASK;
967
 
968
 
969
   // SRC and TGT
970
   reg [7:0]          rSRC, rTGT;
971
   always @(negedge clk or negedge qrst)
972
     if (!qrst) begin
973
        /*AUTORESET*/
974
        // Beginning of autoreset for uninitialized flops
975
        rSRC <= 8'h0;
976
        rTGT <= 8'h0;
977
        // End of automatics
978
     end else if (qena[1] & rNSKP) begin
979
        case (rMXSRC)
980
          MXSRC_FILE: rSRC <= #1 (rSFRSTB) ? rSFRDAT : dwb_dat_i;
981
          //MXSRC_FILE: rSRC <= #1 dwb_dat_i;
982
          MXSRC_MASK: rSRC <= #1 rMASK;
983
          MXSRC_LIT: rSRC <= #1 8'hFF;
984
          default: rSRC <= #1 rWREG;
985
        endcase // case(rMXSRC)
986
 
987
        case (rMXTGT)
988
          MXTGT_MASK: rTGT <= #1 ~rMASK;
989
          MXTGT_FILE: rTGT <= #1 (rSFRSTB) ? rSFRDAT : dwb_dat_i;
990
          //MXTGT_FILE: rTGT <= #1 dwb_dat_i;
991
          MXTGT_LIT: rTGT <= #1 rIREG[7:0];
992
          default: rTGT <= #1 rWREG;
993
        endcase // case(rMXTGT)
994
     end // if (qena[1] & rNSKP)
995
 
996
   // ALU Operations
997
   wire [8:0]      wADD = (rSRC + rTGT);
998
   wire [8:0]      wADDC = wADD + rC;
999
   wire [8:0]      wSUB = (rTGT - rSRC);
1000
   wire [8:0]      wSUBC = wSUB - ~rC;
1001
 
1002
   wire [8:0]      wNEG = (0 - rTGT);
1003
 
1004
   wire [8:0]      wRRC = {rTGT[0],rC,rTGT[7:1]};
1005
   wire [8:0]      wRLC = {rTGT[7:0],rC};
1006
   wire [8:0]      wRRNC = {1'b0,rTGT[0],rTGT[7:1]};
1007
   wire [8:0]      wRLNC = {1'b0,rTGT[6:0],rTGT[7]};
1008
 
1009
   wire [8:0]      wAND = {1'b0, rSRC & rTGT};
1010
   wire [8:0]      wIOR = {1'b0, rSRC | rTGT};
1011
   wire [8:0]      wXOR = {1'b0, rSRC ^ rTGT};
1012
   wire [8:0]      wSWAP = {1'b0, rTGT[3:0], rTGT[7:4]};
1013
 
1014
   // RESULT register
1015
   reg [7:0]       rRESULT;
1016
   always @(negedge clk or negedge qrst)
1017
     if (!qrst) begin
1018
        /*AUTORESET*/
1019
        // Beginning of autoreset for uninitialized flops
1020
        rRESULT <= 8'h0;
1021
        // End of automatics
1022
     end else if (qena[2] & rNSKP) begin
1023
        case (rMXALU)
1024
          default: rRESULT <= #1 wXOR;
1025
          MXALU_AND: rRESULT <= #1 wAND;
1026
          MXALU_IOR: rRESULT <= #1 wIOR;
1027
          MXALU_SWAP: rRESULT <= #1 wSWAP;
1028
          MXALU_RRC: rRESULT <= #1 wRRC;
1029
          MXALU_RLC: rRESULT <= #1 wRLC;
1030
          MXALU_RRNC: rRESULT <= #1 wRRNC;
1031
          MXALU_RLNC: rRESULT <= #1 wRLNC;
1032
          MXALU_ADD: rRESULT <= #1 wADD;
1033
          MXALU_ADDC: rRESULT <= #1 wADDC;
1034
          MXALU_SUB: rRESULT <= #1 wSUB;
1035
          MXALU_SUBC: rRESULT <= #1 wSUBC;
1036
          MXALU_NEG: rRESULT <= #1 wNEG;
1037
        endcase // case(rMXALU)
1038
     end // if (qena[2] & rNSKP)
1039
 
1040
   // C register
1041
   reg rC_;
1042
   always @(negedge clk or negedge qrst)
1043
     if (!qrst)
1044
       /*AUTORESET*/
1045
       // Beginning of autoreset for uninitialized flops
1046
       rC_ <= 1'h0;
1047
       // End of automatics
1048
     else if (qena[2] & rNSKP)
1049
       case (rMXALU)
1050
         MXALU_ADD: rC_ <= #1 wADD[8];
1051
         MXALU_ADDC: rC_ <= #1 wADDC[8];
1052 15 sybreon
         MXALU_SUB: rC_ <= #1 ~wSUB[8];
1053
         MXALU_SUBC: rC_ <= #1 ~wSUBC[8];
1054 2 sybreon
         MXALU_RRC: rC_ <= #1 wRRC[8];
1055
         MXALU_RLC: rC_ <= #1 wRLC[8];
1056
         MXALU_NEG: rC_ <= #1 wNEG[8];
1057
         default: rC_ <= #1 rC;
1058
       endcase // case(rMXALU)
1059
 
1060
   wire           wC, wZ, wN, wOV, wDC;
1061
   assign         wN = rRESULT[7];
1062
   assign         wOV = ~(rSRC[7] ^ rTGT[7]) & (rRESULT[7] ^ rSRC[7]);
1063 15 sybreon
   assign         wZ = (rRESULT[7:0] == 8'h00);
1064 2 sybreon
   assign         wDC = rRESULT[4];
1065
   assign         wC = rC_;
1066
 
1067
   /*
1068
    * DESCRIPTION
1069
    * Other Execution Units
1070
    */
1071
 
1072
   // SPECIAL OPERATION
1073
   reg rCLRWDT_, rSLEEP_;
1074
   always @(negedge clk or negedge qrst)
1075
     if (!qrst) begin
1076
        /*AUTORESET*/
1077
        // Beginning of autoreset for uninitialized flops
1078
        rCLRWDT <= 1'h0;
1079
        rCLRWDT_ <= 1'h0;
1080
        rSLEEP <= 1'h0;
1081
        rSLEEP_ <= 1'h0;
1082
        // End of automatics
1083
     end else begin
1084
        //rCLRWDT <= #1 (rCLRWDT_ & rNSKP);
1085
        //rSLEEP <= #1 (rSLEEP_ & rNSKP);
1086
        rCLRWDT <= #1 (rCLRWDT_ & rNSKP & qena[3]);
1087
        rSLEEP <= #1 (rSLEEP_ & rNSKP & qena[3]);
1088
 
1089
        rCLRWDT_ <= #1 (qena[3]) ? fCLRWDT : rCLRWDT_;
1090
        rSLEEP_ <= #1 (qena[3]) ? fSLEEP : rSLEEP_;
1091
     end
1092
 
1093
   reg rRESET_;
1094
   always @(negedge clk or negedge xrst)
1095
     if (!xrst) begin
1096
        /*AUTORESET*/
1097
        // Beginning of autoreset for uninitialized flops
1098
        rRESET <= 1'h0;
1099
        rRESET_ <= 1'h0;
1100
        // End of automatics
1101
     end else begin
1102
        rRESET_ <= #1 ~(fRESET | rWDT[WSIZ]);
1103
        rRESET <= #1 rRESET_;
1104
     end
1105
 
1106
   // BCC Checker
1107
   always @(negedge clk or negedge qrst)
1108
     if (!qrst) begin
1109
        /*AUTORESET*/
1110
        // Beginning of autoreset for uninitialized flops
1111
        rBCC <= 1'h0;
1112
        // End of automatics
1113 3 sybreon
     end else if (qena[0]) begin
1114 2 sybreon
        case (rMXBCC)
1115 3 sybreon
          MXBCC_BZ: rBCC <= #1 rZ;
1116 2 sybreon
          MXBCC_BNZ: rBCC <= #1 ~rZ;
1117
          MXBCC_BC: rBCC <= #1 rC;
1118
          MXBCC_BNC: rBCC <= #1 ~rC;
1119
          MXBCC_BOV: rBCC <= #1 rOV;
1120
          MXBCC_BNOV: rBCC <= #1 ~rOV;
1121
          MXBCC_BN: rBCC <= #1 rN;
1122
          MXBCC_BNN: rBCC <= #1 ~rN;
1123 3 sybreon
        endcase // case(rMXBCC) 
1124
     end
1125 2 sybreon
 
1126
   /*
1127
    * DESCRIPTION
1128
    * Data WB logic
1129
    */
1130
 
1131
   reg [15:0]       rDWBADR;
1132
   reg             rDWBSTB, rDWBWE;
1133
 
1134
   assign          dwb_adr_o = rDWBADR;
1135
   assign          dwb_stb_o = rDWBSTB;
1136
   assign          dwb_we_o = rDWBWE;
1137
   assign          dwb_dat_o = rRESULT;
1138
 
1139
   // DWB ADR signal
1140
   wire [DSIZ-1:0] wFSRINC0 = {rFSR0H,rFSR0L} + 1;
1141
   wire [DSIZ-1:0] wFSRINC1 = {rFSR1H,rFSR1L} + 1;
1142
   wire [DSIZ-1:0] wFSRINC2 = {rFSR2H,rFSR2L} + 1;
1143
   wire [DSIZ-1:0] wFSRPLUSW0 = {rFSR0H,rFSR0L} + rWREG;
1144
   wire [DSIZ-1:0] wFSRPLUSW1 = {rFSR1H,rFSR1L} + rWREG;
1145
   wire [DSIZ-1:0] wFSRPLUSW2 = {rFSR2H,rFSR2L} + rWREG;
1146
   always @(negedge clk or negedge qrst)
1147
     if (!qrst) begin
1148
        /*AUTORESET*/
1149
        // Beginning of autoreset for uninitialized flops
1150
        rDWBADR <= 16'h0;
1151
        // End of automatics
1152
     end else if (qrun & rNSKP)
1153
       case (qfsm)
1154
         FSM_Q0:
1155
           case (rMXFSR)
1156
             MXFSR_INDF0,MXFSR_POSTINC0,MXFSR_POSTDEC0: rDWBADR <= #1 {rFSR0H,rFSR0L};
1157
             MXFSR_INDF1,MXFSR_POSTINC1,MXFSR_POSTDEC1: rDWBADR <= #1 {rFSR1H,rFSR1L};
1158
             MXFSR_INDF2,MXFSR_POSTINC2,MXFSR_POSTDEC2: rDWBADR <= #1 {rFSR2H,rFSR2L};
1159
             MXFSR_PREINC0: rDWBADR <= #1 wFSRINC0;
1160
             MXFSR_PREINC1: rDWBADR <= #1 wFSRINC1;
1161
             MXFSR_PREINC2: rDWBADR <= #1 wFSRINC2;
1162
             MXFSR_PLUSW2: rDWBADR <= #1 wFSRPLUSW2;
1163
             MXFSR_PLUSW1: rDWBADR <= #1 wFSRPLUSW1;
1164
             MXFSR_PLUSW0: rDWBADR <= #1 wFSRPLUSW0;
1165
             default: rDWBADR <= #1 rEAPTR;
1166
           endcase // case(rMXFSR)       
1167
         FSM_Q1: rDWBADR <= #1 (rMXBSR == MXBSR_LIT) ? {rROMLAT[11:0]} : rDWBADR;
1168
         default: rDWBADR <= #1 rDWBADR;
1169
       endcase // case(qfsm)
1170
 
1171
   // DWB WE signal
1172
   always @(negedge clk or negedge qrst)
1173
     if (!qrst) begin
1174
        /*AUTORESET*/
1175
        // Beginning of autoreset for uninitialized flops
1176
        rDWBWE <= 1'h0;
1177
        // End of automatics
1178
     end else if (qrun & rNSKP)
1179
       case (qfsm)
1180
         FSM_Q2: rDWBWE <= #1 (rMXDST == MXDST_FILE);
1181
         default: rDWBWE <= #1 1'b0;
1182
       endcase // case(qfsm)
1183
 
1184
   // DWB STB signal
1185
   always @(negedge clk or negedge qrst)
1186
     if (!qrst) begin
1187
        /*AUTORESET*/
1188
        // Beginning of autoreset for uninitialized flops
1189
        rDWBSTB <= 1'h0;
1190
        // End of automatics
1191
     end else if (qrun & rNSKP)
1192
       case (qfsm)
1193
         FSM_Q2: rDWBSTB <= #1 (rMXDST == MXDST_FILE);
1194
         FSM_Q0: rDWBSTB <= #1 ((rMXSRC == MXSRC_FILE) | (rMXTGT == MXTGT_FILE));
1195
         default: rDWBSTB <= #1 1'b0;
1196
       endcase // case(qfsm)
1197
 
1198 12 sybreon
   // STACK
1199
   wire [ISIZ-1:0] wSTKW = {rTOSU,rTOSH,rTOSL};
1200
   wire [ISIZ-1:0] wSTKR;
1201
   wire            wSTKE = (qena[1]);
1202 17 sybreon
 
1203
   reg [ISIZ-1:0]  rSTKRAM [0:31];
1204 12 sybreon
 
1205 17 sybreon
   assign          wSTKR = rSTKRAM[rSTKPTR[4:0]];
1206
   always @(posedge clk)
1207
     if (wSTKE)
1208
       rSTKRAM[rSTKPTR_[4:0]] <= wSTKW;
1209 12 sybreon
 
1210 2 sybreon
   /*
1211
    * SFR Bank
1212
    */
1213
   parameter [15:0]
1214
                //aRCON = 16'hFFD0,
1215
                aWDTCON = 16'hFFD1,
1216
                aSTATUS = 16'hFFD8,//
1217
                aFSR2L = 16'hFFD9,//
1218
                aFSR2H = 16'hFFDA,//
1219
                aBSR = 16'hFFE0,//
1220
                aFSR1L = 16'hFFE1,//
1221
                aFSR1H = 16'hFFE2,//
1222
                aWREG = 16'hFFE8,//
1223
                aFSR0L = 16'hFFE9,//
1224
                aFSR0H = 16'hFFEA,//
1225
                aPRODL = 16'hFFF3,//
1226
                aPRODH = 16'hFFF4,//
1227
                aPRNG = 16'hFFD4,//
1228
                aTABLAT = 16'hFFF5,//
1229
                aTBLPTRL = 16'hFFF6,//
1230
                aTBLPTRH = 16'hFFF7,//
1231
                aTBLPTRU = 16'hFFF8,//
1232
                aPCL = 16'hFFF9,//
1233
                aPCLATH = 16'hFFFA,//
1234
                aPCLATU = 16'hFFFB,//
1235
                aSTKPTR = 16'hFFFC,//
1236
                aTOSL = 16'hFFFD,//
1237
                aTOSH = 16'hFFFE,//
1238
                aTOSU = 16'hFFFF;//   
1239
 
1240
   // Read SFR
1241
   always @(posedge clk or negedge qrst)
1242
     if (!qrst) begin
1243
        /*AUTORESET*/
1244
        // Beginning of autoreset for uninitialized flops
1245
        rSFRDAT <= 8'h0;
1246
        // End of automatics
1247
     end else if (rDWBSTB & rNSKP) begin
1248
        case (rDWBADR[5:0])
1249
          aWDTCON[5:0]: rSFRDAT <= #1 {7'd0,rSWDTEN};
1250
          aSTATUS[5:0]: rSFRDAT <= #1 {3'd0,rN,rOV,rZ,rDC,rC};
1251
          aFSR2L[5:0]: rSFRDAT <= #1 rFSR2L;
1252
          aFSR2H[5:0]: rSFRDAT <= #1 rFSR2H;
1253
          aBSR[5:0]: rSFRDAT <= #1 rBSR;
1254
          aFSR1L[5:0]: rSFRDAT <= #1 rFSR1L;
1255
          aFSR1H[5:0]: rSFRDAT <= #1 rFSR1H;
1256
          aWREG[5:0]: rSFRDAT <= #1 rWREG;
1257
          aFSR0L[5:0]: rSFRDAT <= #1 rFSR0L;
1258
          aFSR0H[5:0]: rSFRDAT <= #1 rFSR0H;
1259
          aPRODL[5:0]: rSFRDAT <= #1 rPRODL;
1260
          aPRODH[5:0]: rSFRDAT <= #1 rPRODH;
1261
          aPRNG[5:0]: rSFRDAT <= #1 rPRNG;
1262
          aTABLAT[5:0]: rSFRDAT <= #1 rTABLAT;
1263
          aTBLPTRL[5:0]: rSFRDAT <= #1 rTBLPTRL;
1264
          aTBLPTRH[5:0]: rSFRDAT <= #1 rTBLPTRH;
1265
          aTBLPTRU[5:0]: rSFRDAT <= #1 rTBLPTRU;
1266
          aPCL[5:0]: rSFRDAT <= #1 rPCL;
1267
          aPCLATH[5:0]: rSFRDAT <= #1 rPCLATH;
1268
          aPCLATU[5:0]: rSFRDAT <= #1 rPCLATU;
1269
          aSTKPTR[5:0]: rSFRDAT <= #1 {rSTKFUL,rSTKUNF,1'b0,rSTKPTR[4:0]};
1270
          aTOSU[5:0]: rSFRDAT <= #1 rTOSU;
1271
          aTOSH[5:0]: rSFRDAT <= #1 rTOSH;
1272
          aTOSL[5:0]: rSFRDAT <= #1 rTOSL;
1273
          default rSFRDAT <= #1 rSFRDAT;
1274 15 sybreon
        endcase // case(rDWBADR)
1275 2 sybreon
     end
1276
 
1277
   wire wSFRSTB = (rDWBADR[15:6] == 10'h3FF);
1278
   always @(posedge clk or negedge qrst)
1279
     if (!qrst) begin
1280
        // Beginning of autoreset for uninitialized flops
1281
        rSFRSTB <= 1'h0;
1282
        // End of automatics
1283
     end else if (rDWBSTB & rNSKP) begin
1284
        case (rDWBADR[5:0])
1285
          aFSR2L[5:0],aFSR2H[5:0],aFSR1L[5:0],aFSR1H[5:0],aFSR0H[5:0],aFSR0L[5:0],
1286
            aWDTCON[5:0],aBSR[5:0],aWREG[5:0],aSTATUS[5:0],
1287
            aPRODL[5:0],aPRODH[5:0],aPRNG[5:0],
1288
            aTABLAT[5:0],aTBLPTRH[5:0],aTBLPTRU[5:0],aTBLPTRL[5:0],
1289
            aPCL[5:0],aPCLATH[5:0],aPCLATU[5:0],
1290
            aSTKPTR[5:0],aTOSU[5:0],aTOSH[5:0],aTOSL[5:0]: rSFRSTB <= #1 wSFRSTB;
1291
          default rSFRSTB <= #1 1'b0;
1292
        endcase // case(rDWBADR)        
1293
     end
1294
 
1295
   // WDTCON
1296
   always @(posedge clk or negedge qrst)
1297
     if (!qrst)
1298
       rSWDTEN <= 1;
1299
     else if (qena[3] & rNSKP)
1300
       rSWDTEN <= #1 ((rDWBADR == aWDTCON) & rDWBWE) ? rRESULT[0] : rSWDTEN;
1301
 
1302
   // TOSH, TOSU, TOSL, STKPTR
1303
   wire [5:0]   wSTKINC = rSTKPTR + 1;
1304
   wire [5:0]   wSTKDEC = rSTKPTR - 1;
1305
 
1306
   always @(posedge clk or negedge qrst)
1307
     if (!qrst) begin
1308
        /*AUTORESET*/
1309
        // Beginning of autoreset for uninitialized flops
1310
        rSTKPTR_ <= 6'h0;
1311
        // End of automatics
1312
     end else if (qena[0]) begin
1313
       rSTKPTR_ <= #1 wSTKINC;
1314
     end
1315
 
1316
   always @(posedge clk or negedge qrst)
1317
     if (!qrst) begin
1318
        /*AUTORESET*/
1319
        // Beginning of autoreset for uninitialized flops
1320
        rSTKFUL <= 1'h0;
1321
        rSTKPTR <= 6'h0;
1322
        rSTKUNF <= 1'h0;
1323
        // End of automatics
1324
     end else if (qrun & rNSKP) begin
1325
        rSTKFUL <= #1 (wSTKINC == 6'h20);
1326
        rSTKUNF <= #1 (wSTKDEC == 6'h3F);
1327
       case (qfsm)
1328
         FSM_Q3: begin
1329
            rSTKPTR <= #1 ((rDWBADR == aSTKPTR) & rDWBWE) ? rRESULT : rSTKPTR;
1330
         end
1331
         FSM_Q2: begin
1332
            case (rMXSTK)
1333
              MXSTK_PUSH: begin
1334
                 rSTKPTR <= #1 (rSTKFUL) ? rSTKPTR : wSTKINC;
1335
              end
1336
              MXSTK_POP: begin
1337
                 rSTKPTR <= #1 (rSTKUNF) ? rSTKPTR : wSTKDEC;
1338
              end
1339
              default: begin
1340
                 rSTKPTR <= #1 rSTKPTR;
1341
              end
1342
            endcase // case(rMXSTK)
1343
         end // case: FSM_Q2
1344
         default: begin
1345
            rSTKPTR <= #1 rSTKPTR;
1346
         end
1347
       endcase // case(qfsm)
1348
     end // if (qrun & rNSKP)
1349
 
1350
   always @(posedge clk or negedge qrst)
1351
     if (!qrst) begin
1352
        /*AUTORESET*/
1353
        // Beginning of autoreset for uninitialized flops
1354
        rTOSH <= 8'h0;
1355
        rTOSL <= 8'h0;
1356
        rTOSU <= 8'h0;
1357
        // End of automatics
1358
     end else if (qrun & rNSKP)
1359
       case (qfsm)
1360
         FSM_Q3: begin
1361
            rTOSU <= #1 ((rDWBADR == aTOSU) & rDWBWE) ? rRESULT : rTOSU;
1362
            rTOSH <= #1 ((rDWBADR == aTOSH) & rDWBWE) ? rRESULT : rTOSH;
1363
            rTOSL <= #1 ((rDWBADR == aTOSL) & rDWBWE) ? rRESULT : rTOSL;
1364
         end
1365
         FSM_Q2: begin
1366
            case (rMXSTK)
1367
              MXSTK_PUSH: begin
1368
                 {rTOSU,rTOSH,rTOSL} <= #1 {wPCLAT,1'b0};
1369
              end
1370
              MXSTK_POP: begin
1371
                 {rTOSU,rTOSH,rTOSL} <= #1 wSTKR;
1372
              end
1373
              default: begin
1374
                 rTOSU <= #1 rTOSU;
1375
                 rTOSH <= #1 rTOSH;
1376
                 rTOSL <= #1 rTOSL;
1377
              end
1378
            endcase // case(rMXSTK)
1379
         end // case: FSM_Q2
1380
         default: begin
1381
            rTOSU <= #1 rTOSU;
1382
            rTOSH <= #1 rTOSH;
1383
            rTOSL <= #1 rTOSL;
1384
         end
1385
       endcase // case(qfsm)
1386
 
1387
 
1388
   // SHADOW REGISTERS
1389
   always @(posedge clk or negedge qrst)
1390
     if (!qrst) begin
1391
        /*AUTORESET*/
1392
        // Beginning of autoreset for uninitialized flops
1393
        rBSR_ <= 8'h0;
1394
        rSTATUS_ <= 5'h0;
1395
        rWREG_ <= 8'h0;
1396
        // End of automatics
1397
     end else if (qena[3] & rNSKP) begin
1398
        rWREG_ <= #1 (rMXSHA == MXSHA_CALL) ? rWREG : rWREG_;
1399
        rBSR_ <= #1 (rMXSHA == MXSHA_CALL) ? rBSR : rBSR_;
1400
        rSTATUS_ <= #1 (rMXSHA == MXSHA_CALL) ? {rN,rOV,rZ,rDC,rC} : rSTATUS_;
1401
     end
1402
 
1403
   // STATUS
1404
   reg [2:0] rMXSTAL;
1405
   always @(negedge clk or negedge qrst)
1406
     if (!qrst)
1407
       /*AUTORESET*/
1408
       // Beginning of autoreset for uninitialized flops
1409
       rMXSTAL <= 3'h0;
1410
       // End of automatics
1411
     else if (qena[3])
1412
       rMXSTAL <= #1 rMXSTA;
1413
 
1414
   always @(posedge clk or negedge qrst)
1415
     if (!qrst) begin
1416
        /*AUTORESET*/
1417
        // Beginning of autoreset for uninitialized flops
1418
        rC <= 1'h0;
1419
        rDC <= 1'h0;
1420
        rN <= 1'h0;
1421
        rOV <= 1'h0;
1422
        rZ <= 1'h0;
1423
        // End of automatics
1424
     end else if (qrun & rNSKP) begin
1425
        case (qfsm)
1426
          default: {rN,rOV,rZ,rDC,rC} <= #1 ((rDWBADR == aSTATUS) & rDWBWE) ? rRESULT : {rN,rOV,rZ,rDC,rC};
1427
          FSM_Q2: {rN,rOV,rZ,rDC,rC} <= #1 (rMXSHA == MXSHA_RET) ? rSTATUS_ : {rN,rOV,rZ,rDC,rC};
1428
          FSM_Q0: case (rMXSTAL)
1429
                    MXSTA_ALL: {rN,rOV,rZ,rDC,rC} <= #1 {wN,wOV,wZ,wDC,wC};
1430
                    MXSTA_CZN: {rN,rOV,rZ,rDC,rC} <= #1 {wN,rOV,wZ,rDC,wC};
1431
                    MXSTA_ZN:  {rN,rOV,rZ,rDC,rC} <= #1 {wN,rOV,wZ,rDC,rC};
1432
                    MXSTA_Z:  {rN,rOV,rZ,rDC,rC} <= #1 {rN,rOV,wZ,rDC,rC};
1433
                    MXSTA_C:  {rN,rOV,rZ,rDC,rC} <= #1 {rN,rOV,rZ,rDC,wC};
1434
                    default:  {rN,rOV,rZ,rDC,rC} <= #1 {rN,rOV,rZ,rDC,rC};
1435
                  endcase // case(rMXSTA)
1436
        endcase // case(qfsm)   
1437
     end // if (qena[3] & rNSKP)
1438
 
1439
   // WREG
1440
   // TODO: DAW
1441
   wire [7:0] wDAW = ((rMXALU == MXALU_DAW) & (rMXDST == MXDST_EXT)) ? 8'h00 : rWREG;
1442
   always @(posedge clk or negedge qrst)
1443
     if (!qrst) begin
1444
        /*AUTORESET*/
1445
        // Beginning of autoreset for uninitialized flops
1446
        rWREG <= 8'h0;
1447
        // End of automatics
1448
     end else if (qena[3] & rNSKP) begin
1449
        rWREG <= #1 (((rDWBADR == aWREG) & rDWBWE) | (rMXDST == MXDST_WREG)) ? rRESULT :
1450
                 (rMXSHA == MXSHA_RET) ? rWREG_ :
1451
                 rWREG;
1452
     end
1453
 
1454
   // BSR
1455
   always @(posedge clk or negedge qrst)
1456
     if (!qrst) begin
1457
        /*AUTORESET*/
1458
        // Beginning of autoreset for uninitialized flops
1459
        rBSR <= 8'h0;
1460
        // End of automatics
1461
     end else if (qrun & rNSKP)
1462
       case (qfsm)
1463
         FSM_Q3: rBSR <= #1 (((rDWBADR == aBSR) & rDWBWE)) ? rRESULT :
1464
                         (rMXSHA == MXSHA_RET) ? rBSR_ :
1465
                         rBSR;
1466
         default: rBSR <= #1 ((rMXALU == MXALU_MOVLB) & (rMXDST == MXDST_EXT)) ? rIREG[7:0] : rBSR;
1467
       endcase // case(qfsm)
1468
 
1469
   // FSRXH/FSRXL
1470
   wire [DSIZ-1:0] wFSRDEC0 = {rFSR0H,rFSR0L} - 1;
1471
   wire [DSIZ-1:0] wFSRDEC1 = {rFSR1H,rFSR1L} - 1;
1472
   wire [DSIZ-1:0] wFSRDEC2 = {rFSR2H,rFSR2L} - 1;
1473
 
1474
   always @(posedge clk or negedge qrst)
1475
     if (!qrst) begin
1476
        /*AUTORESET*/
1477
        // Beginning of autoreset for uninitialized flops
1478
        rFSR0H <= 8'h0;
1479
        rFSR0L <= 8'h0;
1480
        rFSR1H <= 8'h0;
1481
        rFSR1L <= 8'h0;
1482
        rFSR2H <= 8'h0;
1483
        rFSR2L <= 8'h0;
1484
        // End of automatics
1485
     end else if (qrun & rNSKP) // if (!qrst)
1486
       case (qfsm)
1487
         FSM_Q3: begin
1488
            rFSR0H <= #1 (((rDWBADR == aFSR0H) & rDWBWE)) ? rRESULT : rFSR0H;
1489
            rFSR0L <= #1 (((rDWBADR == aFSR0L) & rDWBWE)) ? rRESULT : rFSR0L;
1490
            rFSR1H <= #1 (((rDWBADR == aFSR1H) & rDWBWE)) ? rRESULT : rFSR1H;
1491
            rFSR1L <= #1 (((rDWBADR == aFSR1L) & rDWBWE)) ? rRESULT : rFSR1L;
1492
            rFSR2H <= #1 (((rDWBADR == aFSR2H) & rDWBWE)) ? rRESULT : rFSR2H;
1493
            rFSR2L <= #1 (((rDWBADR == aFSR2L) & rDWBWE)) ? rRESULT : rFSR2L;
1494
         end
1495
         FSM_Q2: begin
1496
            // Post Inc/Dec
1497
            case (rMXFSR)
1498
              MXFSR_POSTINC0: {rFSR0H,rFSR0L} <= #1 wFSRINC0;
1499
              MXFSR_POSTINC1: {rFSR1H,rFSR1L} <= #1 wFSRINC1;
1500
              MXFSR_POSTINC2: {rFSR2H,rFSR2L} <= #1 wFSRINC2;
1501
              MXFSR_POSTDEC0: {rFSR0H,rFSR0L} <= #1 wFSRDEC0;
1502
              MXFSR_POSTDEC1: {rFSR1H,rFSR1L} <= #1 wFSRDEC1;
1503
              MXFSR_POSTDEC2: {rFSR2H,rFSR2L} <= #1 wFSRDEC2;
1504
            endcase // case(rMXFSR)
1505
         end // case: FSM_Q2     
1506
         FSM_Q1: begin
1507
            // Load Literals
1508
            if ((rMXALU == MXALU_LFSR) & (rMXDST == MXDST_EXT))
1509
              case (rIREG[5:4])
1510
                2'o0: {rFSR0H,rFSR0L} <= #1 {rIREG[3:0],rROMLAT[7:0]};
1511
                2'o1: {rFSR1H,rFSR1L} <= #1 {rIREG[3:0],rROMLAT[7:0]};
1512
                2'o2: {rFSR2H,rFSR2L} <= #1 {rIREG[3:0],rROMLAT[7:0]};
1513
              endcase // case(rIREG[5:4])
1514
         end // case: FSM_Q1
1515
 
1516
         FSM_Q0: begin
1517
            // Pre inc
1518
            case (rMXFSR)
1519
              MXFSR_PREINC0: {rFSR0H,rFSR0L} <= #1 wFSRINC0;
1520
              MXFSR_PREINC1: {rFSR1H,rFSR1L} <= #1 wFSRINC1;
1521
              MXFSR_PREINC2: {rFSR2H,rFSR2L} <= #1 wFSRINC2;
1522
            endcase // case(rMXFSR)
1523
         end
1524
 
1525
       endcase // case(qfsm)
1526
 
1527
 
1528
   // PRODH/PRODL
1529
   wire [15:0] wPRODUCT = ((rMXALU == MXALU_MUL) & (rMXDST == MXDST_EXT)) ? (rSRC * rTGT) : {rPRODH,rPRODL};
1530
   always @(posedge clk or negedge qrst)
1531
     if (!qrst) begin
1532
        /*AUTORESET*/
1533
        // Beginning of autoreset for uninitialized flops
1534
        rPRODH <= 8'h0;
1535
        rPRODL <= 8'h0;
1536
        // End of automatics
1537
     end else if (qena[3] & rNSKP) begin
1538
        rPRODH <= #1 (((rDWBADR == aPRODH) & rDWBWE)) ? rRESULT : wPRODUCT[15:8];
1539
        rPRODL <= #1 (((rDWBADR == aPRODL) & rDWBWE)) ? rRESULT : wPRODUCT[7:0];
1540
     end
1541
 
1542
   // TBLATU/TBLATH/TBLATL
1543
   wire [ISIZ-1:0] wTBLINC = {rTBLPTRU,rTBLPTRH,rTBLPTRL} + 1;
1544
   wire [ISIZ-1:0] wTBLAT =  {rTBLPTRU,rTBLPTRH,rTBLPTRL};
1545
   wire [ISIZ-1:0] wTBLDEC = {rTBLPTRU,rTBLPTRH,rTBLPTRL} - 1;
1546
   always @(posedge clk or negedge qrst)
1547
     if (!qrst) begin
1548
        /*AUTORESET*/
1549
        // Beginning of autoreset for uninitialized flops
1550
        rTBLPTRH <= 8'h0;
1551
        rTBLPTRL <= 8'h0;
1552
        rTBLPTRU <= 8'h0;
1553
        // End of automatics
1554
     end else if (qrun & rNSKP)
1555
       case (qfsm)
1556
         FSM_Q0: {rTBLPTRU,rTBLPTRH,rTBLPTRL} <= #1 ((rMXTBL == MXTBL_WTPRE) | (rMXTBL == MXTBL_RDPRE)) ? wTBLINC : wTBLAT;
1557
         FSM_Q2: {rTBLPTRU,rTBLPTRH,rTBLPTRL} <= #1 ((rMXTBL == MXTBL_WTINC) | (rMXTBL == MXTBL_RDINC)) ? wTBLINC :
1558
                                              ((rMXTBL == MXTBL_WTDEC) | (rMXTBL == MXTBL_RDDEC)) ? wTBLDEC : wTBLAT;
1559
         default: begin
1560
            rTBLPTRU <= #1 ((rDWBADR == aTBLPTRU) & rDWBWE) ? rRESULT : rTBLPTRU;
1561
            rTBLPTRH <= #1 ((rDWBADR == aTBLPTRH) & rDWBWE) ? rRESULT : rTBLPTRH;
1562
            rTBLPTRL <= #1 ((rDWBADR == aTBLPTRL) & rDWBWE) ? rRESULT : rTBLPTRL;
1563
         end
1564
       endcase // case(qfsm)
1565
 
1566
   // TABLAT
1567
   always @(posedge clk or negedge qrst)
1568
     if (!qrst) begin
1569
        /*AUTORESET*/
1570
        // Beginning of autoreset for uninitialized flops
1571
        rTABLAT <= 8'h0;
1572
        // End of automatics
1573
     end else if (qena[3] & rNSKP)
1574
       case (rMXTBL)
1575
         MXTBL_RD,MXTBL_RDINC,MXTBL_RDDEC,MXTBL_RDPRE:
1576
           rTABLAT <= #1 rILAT;
1577
         default: rTABLAT <= #1 (rDWBWE & (rDWBADR == aTABLAT)) ? rRESULT : rTABLAT;
1578
       endcase // case(rMXTBL)
1579
 
1580
   // PCLATU/PCLATH
1581
   always @(posedge clk or negedge qrst)
1582
     if (!qrst) begin
1583
        /*AUTORESET*/
1584
        // Beginning of autoreset for uninitialized flops
1585
        rPCLATH <= 8'h0;
1586
        rPCLATU <= 8'h0;
1587
        // End of automatics
1588
     end else if (qena[3] & rNSKP) begin
1589
        rPCLATU <= #1 ((rDWBADR == aPCLATU) & rDWBWE) ? rRESULT :
1590
                   ((rDWBADR == aPCL) & ~rDWBWE) ? rPCU :
1591
                   rPCLATU;
1592
        rPCLATH <= #1 ((rDWBADR == aPCLATH) & rDWBWE) ? rRESULT :
1593
                   ((rDWBADR == aPCL) & ~rDWBWE) ? rPCH :
1594
                   rPCLATH;
1595
     end
1596
 
1597
   // PCU/PCH/PCL
1598
   always @(negedge clk or negedge qrst)
1599
     if (!qrst) begin
1600
        /*AUTORESET*/
1601
        // Beginning of autoreset for uninitialized flops
1602
        rPCH <= 8'h0;
1603
        rPCL <= 8'h0;
1604
        rPCU <= 5'h0;
1605
        // End of automatics
1606
     end else if (qena[3]) begin
1607
        {rPCU,rPCH,rPCL} <= #1 ((rDWBADR == aPCL) & rDWBWE) ? {rPCLATU,rPCLATH,rRESULT} :
1608
                            {rPCNXT,1'b0};
1609
     end
1610 4 sybreon
 
1611
   // SKIP register
1612
   wire           wSKP =
1613
                  (rMXSKP == MXSKP_SZ) ? wZ :
1614
                  (rMXSKP == MXSKP_SNZ) ? ~wZ :
1615
                  (rMXSKP == MXSKP_SNC) ? ~wC :
1616
                  (rMXSKP == MXSKP_SCC) ? rBCC :
1617
                  (rMXSKP == MXSKP_SU) ? (1'b1) :
1618
                  1'b0;
1619
   always @(negedge clk or negedge qrst)
1620
     if (!qrst)
1621
       rNSKP <= 1'h1;
1622
     else if (qena[3])
1623
       rNSKP <= #1 ((rDWBADR == aPCL) & rDWBWE) ? 1'b0 : ~(wSKP & rNSKP);
1624
 
1625 2 sybreon
endmodule // ae18_core

powered by: WebSVN 2.1.0

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