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

Subversion Repositories ae18

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

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

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