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

Subversion Repositories ae18

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

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

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

powered by: WebSVN 2.1.0

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