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

Subversion Repositories zipcpu

[/] [zipcpu/] [trunk/] [bench/] [cpp/] [zippy_tb.cpp] - Blame information for rev 34

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

Line No. Rev Author Line
1 2 dgisselq
///////////////////////////////////////////////////////////////////////////////
2
//
3
// Filename:    zippy_tb.cpp
4
//
5
// Project:     Zip CPU -- a small, lightweight, RISC CPU soft core
6
//
7
// Purpose:     A bench simulator for the CPU.  Eventually, you should be
8
//              able to give this program the name of a piece of compiled
9
//              code to load into memory.  For now, we hand assemble with the
10
//              computers help.
11
//
12
//
13
// Creator:     Dan Gisselquist, Ph.D.
14
//              Gisselquist Tecnology, LLC
15
//
16
///////////////////////////////////////////////////////////////////////////////
17
//
18
// Copyright (C) 2015, Gisselquist Technology, LLC
19
//
20
// This program is free software (firmware): you can redistribute it and/or
21
// modify it under the terms of  the GNU General Public License as published
22
// by the Free Software Foundation, either version 3 of the License, or (at
23
// your option) any later version.
24
//
25
// This program is distributed in the hope that it will be useful, but WITHOUT
26
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
27
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
28
// for more details.
29
//
30
// License:     GPL, v3, as defined and found on www.gnu.org,
31
//              http://www.gnu.org/licenses/gpl.html
32
//
33
//
34
///////////////////////////////////////////////////////////////////////////////
35
//
36
//
37
#include <signal.h>
38
#include <time.h>
39 9 dgisselq
#include <unistd.h>
40 2 dgisselq
 
41
#include <ctype.h>
42
#include <ncurses.h>
43
 
44
#include "verilated.h"
45
#include "Vzipsystem.h"
46
 
47
#include "testb.h"
48
// #include "twoc.h"
49
// #include "qspiflashsim.h"
50
#include "memsim.h"
51
#include "zopcodes.h"
52
#include "zparser.h"
53
 
54
#define CMD_REG         0
55
#define CMD_DATA        1
56
#define CMD_HALT        (1<<10)
57
#define CMD_STALL       (1<<9)
58
#define CMD_STEP        (1<<8)
59
#define CMD_INT         (1<<7)
60
#define CMD_RESET       (1<<6)
61
 
62 34 dgisselq
#define KEY_ESCAPE      27
63
#define KEY_RETURN      10
64 2 dgisselq
 
65
// No particular "parameters" need definition or redefinition here.
66
class   ZIPPY_TB : public TESTB<Vzipsystem> {
67
public:
68 9 dgisselq
        unsigned long   m_mem_size;
69 2 dgisselq
        MEMSIM          m_mem;
70
        // QSPIFLASHSIM m_flash;
71
        FILE            *dbg_fp;
72
        bool            dbg_flag, bomb;
73 34 dgisselq
        int             m_cursor;
74 2 dgisselq
 
75 9 dgisselq
        ZIPPY_TB(void) : m_mem_size(1<<20), m_mem(m_mem_size) {
76 34 dgisselq
                // dbg_fp = fopen("dbg.txt", "w");
77 2 dgisselq
                dbg_fp = NULL;
78
                dbg_flag = false;
79
                bomb = false;
80 34 dgisselq
                m_cursor = 0;
81 2 dgisselq
        }
82
 
83
        void    reset(void) {
84
                // m_flash.debug(false);
85
                TESTB<Vzipsystem>::reset();
86
        }
87
 
88
        bool    on_tick(void) {
89
                tick();
90
                return true;
91
        }
92
 
93 34 dgisselq
        void    showval(int y, int x, const char *lbl, unsigned int v, bool c) {
94
                if (c)
95
                        mvprintw(y,x, ">%s> 0x%08x<", lbl, v);
96
                else
97
                        mvprintw(y,x, " %s: 0x%08x ", lbl, v);
98 2 dgisselq
        }
99
 
100 34 dgisselq
        void    dispreg(int y, int x, const char *n, unsigned int v, bool c) {
101 2 dgisselq
                // 4,4,8,1 = 17 of 20, +3 = 19
102 34 dgisselq
                if (c)
103
                        mvprintw(y, x, ">%s> 0x%08x<", n, v);
104
                else
105
                        mvprintw(y, x, " %s: 0x%08x ", n, v);
106 2 dgisselq
        }
107
 
108 34 dgisselq
        void    showreg(int y, int x, const char *n, int r, bool c) {
109 2 dgisselq
                // 4,4,8,1 = 17 of 20, +3 = 19
110 34 dgisselq
                if (c)
111
                        mvprintw(y, x, ">%s> 0x%08x", n, m_core->v__DOT__thecpu__DOT__regset[r]);
112
                else
113
                        mvprintw(y, x, " %s: 0x%08x", n, m_core->v__DOT__thecpu__DOT__regset[r]);
114 2 dgisselq
                addch( ((r == m_core->v__DOT__thecpu__DOT__dcdA)
115
                                &&(m_core->v__DOT__thecpu__DOT__dcdvalid)
116
                                &&(m_core->v__DOT__thecpu__DOT__dcdA_rd))
117 34 dgisselq
                        ?'a':((c)?'<':' '));
118 2 dgisselq
                addch( ((r == m_core->v__DOT__thecpu__DOT__dcdB)
119
                                &&(m_core->v__DOT__thecpu__DOT__dcdvalid)
120
                                &&(m_core->v__DOT__thecpu__DOT__dcdB_rd))
121 34 dgisselq
                        ?'b':((c)?'<':' '));
122 2 dgisselq
                addch( ((r == m_core->v__DOT__thecpu__DOT__wr_reg_id)
123
                                &&(m_core->v__DOT__thecpu__DOT__wr_reg_ce))
124 34 dgisselq
                        ?'W':((c)?'<':' '));
125 2 dgisselq
        }
126
 
127
        void    showins(int y, const char *lbl, const int ce, const int valid,
128
                        const int gie, const int stall, const unsigned int pc) {
129
                char    line[80];
130
 
131
                if (ce)
132
                        mvprintw(y, 0, "Ck ");
133
                else
134
                        mvprintw(y, 0, "   ");
135
                if (stall)
136
                        printw("Stl ");
137
                else
138
                        printw("    ");
139
                printw("%s: 0x%08x", lbl, pc);
140
 
141
                if (valid) {
142
                        if (gie) attroff(A_BOLD);
143
                        else    attron(A_BOLD);
144
                        zipi_to_string(m_mem[pc], line);
145 27 dgisselq
                        printw("  %-24s", &line[1]);
146 2 dgisselq
                } else {
147
                        attroff(A_BOLD);
148
                        printw("  (0x%08x)%28s", m_mem[pc],"");
149
                }
150
                attroff(A_BOLD);
151
        }
152
 
153
        void    dbgins(const char *lbl, const int ce, const int valid,
154
                        const int gie, const int stall, const unsigned int pc) {
155
                char    line[80];
156
 
157
                if (!dbg_fp)
158
                        return;
159
 
160
                if (ce)
161
                        fprintf(dbg_fp, "%s Ck ", lbl);
162
                else
163
                        fprintf(dbg_fp, "%s    ", lbl);
164
                if (stall)
165
                        fprintf(dbg_fp, "Stl ");
166
                else
167
                        fprintf(dbg_fp, "    ");
168
                fprintf(dbg_fp, "0x%08x:  ", pc);
169
 
170
                if (valid) {
171
                        zipi_to_string(m_mem[pc], line);
172
                        fprintf(dbg_fp, "  %-20s\n", &line[1]);
173
                } else {
174
                        fprintf(dbg_fp, "  (0x%08x)\n", m_mem[pc]);
175
                }
176
        }
177
 
178
        void    show_state(void) {
179
                int     ln= 0;
180
 
181
                mvprintw(ln,0, "Peripherals-SS"); ln++;
182
                /*
183
                showval(ln, 1, "TRAP", m_core->v__DOT__trap_data);
184
                        mvprintw(ln, 17, "%s%s",
185
                                ((m_core->v__DOT__sys_cyc)
186
                                &&(m_core->v__DOT__sys_we)
187
                                &&(m_core->v__DOT__sys_addr == 0))?"W":" ",
188
                                (m_core->v__DOT__trap_int)?"I":" ");
189
                */
190 34 dgisselq
                showval(ln, 0, "PIC ", m_core->v__DOT__pic_data, (m_cursor==0));
191
                showval(ln,20, "WDT ", m_core->v__DOT__watchdog__DOT__r_value, (m_cursor==1));
192
                showval(ln,40, "CACH", m_core->v__DOT__manualcache__DOT__cache_base, (m_cursor==2));
193
                showval(ln,60, "PIC2", m_core->v__DOT__ctri__DOT__r_int_state, (m_cursor==3));
194 2 dgisselq
 
195
                ln++;
196 34 dgisselq
                showval(ln, 0, "TMRA", m_core->v__DOT__timer_a__DOT__r_value, (m_cursor==4));
197
                showval(ln,20, "TMRB", m_core->v__DOT__timer_b__DOT__r_value, (m_cursor==5));
198
                showval(ln,40, "TMRB", m_core->v__DOT__timer_c__DOT__r_value, (m_cursor==6));
199
                showval(ln,60, "JIF ", m_core->v__DOT__jiffies__DOT__r_counter, (m_cursor==7));
200 2 dgisselq
 
201
                ln++;
202 34 dgisselq
                showval(ln, 0, "UTSK", m_core->v__DOT__utc_data, (m_cursor==8));
203
                showval(ln,20, "UOST", m_core->v__DOT__uoc_data, (m_cursor==9));
204
                showval(ln,40, "UPST", m_core->v__DOT__upc_data, (m_cursor==10));
205
                showval(ln,60, "UICT", m_core->v__DOT__uic_data, (m_cursor==11));
206 2 dgisselq
 
207
                ln++;
208
                mvprintw(ln, 40, "%s %s",
209
                        (m_core->v__DOT__cpu_halt)? "CPU-HALT": "        ",
210
                        (m_core->v__DOT__cpu_reset)?"CPU-RESET":"         "); ln++;
211
                mvprintw(ln, 40, "%s %s %s 0x%02x",
212
                        (m_core->v__DOT__cmd_halt)? "HALT": "    ",
213
                        (m_core->v__DOT__cmd_reset)?"RESET":"     ",
214
                        (m_core->v__DOT__cmd_step)? "STEP" :"    ",
215
                        (m_core->v__DOT__cmd_addr)&0x3f);
216
                if (m_core->v__DOT__thecpu__DOT__gie)
217
                        attroff(A_BOLD);
218
                else
219
                        attron(A_BOLD);
220
                mvprintw(ln, 0, "Supervisor Registers");
221
                ln++;
222
 
223 34 dgisselq
                showreg(ln, 0, "sR0 ", 0, (m_cursor==12));
224
                showreg(ln,20, "sR1 ", 1, (m_cursor==13));
225
                showreg(ln,40, "sR2 ", 2, (m_cursor==14));
226
                showreg(ln,60, "sR3 ", 3, (m_cursor==15)); ln++;
227 2 dgisselq
 
228 34 dgisselq
                showreg(ln, 0, "sR4 ", 4, (m_cursor==16));
229
                showreg(ln,20, "sR5 ", 5, (m_cursor==17));
230
                showreg(ln,40, "sR6 ", 6, (m_cursor==18));
231
                showreg(ln,60, "sR7 ", 7, (m_cursor==19)); ln++;
232 2 dgisselq
 
233 34 dgisselq
                showreg(ln, 0, "sR8 ",  8, (m_cursor==20));
234
                showreg(ln,20, "sR9 ",  9, (m_cursor==21));
235
                showreg(ln,40, "sR10", 10, (m_cursor==22));
236
                showreg(ln,60, "sR11", 11, (m_cursor==23)); ln++;
237 2 dgisselq
 
238 34 dgisselq
                showreg(ln, 0, "sR12", 12, (m_cursor==24));
239
                showreg(ln,20, "sSP ", 13, (m_cursor==25));
240
                mvprintw(ln,40, "sCC :%s%s%s%s%s%s%s%s",
241 27 dgisselq
                        (m_core->v__DOT__thecpu__DOT__trap)?"TRP":" ",
242
                        (m_core->v__DOT__thecpu__DOT__step)?"STP":" ",
243
                        (m_core->v__DOT__thecpu__DOT__sleep)?"SLP":" ",
244
                        (m_core->v__DOT__thecpu__DOT__gie)?"GIE":" ",
245 2 dgisselq
                        (m_core->v__DOT__thecpu__DOT__iflags&8)?"V":" ",
246
                        (m_core->v__DOT__thecpu__DOT__iflags&4)?"N":" ",
247
                        (m_core->v__DOT__thecpu__DOT__iflags&2)?"C":" ",
248
                        (m_core->v__DOT__thecpu__DOT__iflags&1)?"Z":" ");
249 34 dgisselq
                showval(ln,60, "sPC ", m_core->v__DOT__thecpu__DOT__ipc, (m_cursor==27));
250 2 dgisselq
                ln++;
251
 
252
                if (m_core->v__DOT__thecpu__DOT__gie)
253
                        attron(A_BOLD);
254
                else
255
                        attroff(A_BOLD);
256
                mvprintw(ln, 0, "User Registers"); ln++;
257 34 dgisselq
                showreg(ln, 0, "uR0 ", 16, (m_cursor==28));
258
                showreg(ln,20, "uR1 ", 17, (m_cursor==29));
259
                showreg(ln,40, "uR2 ", 18, (m_cursor==30));
260
                showreg(ln,60, "uR3 ", 19, (m_cursor==31)); ln++;
261 2 dgisselq
 
262 34 dgisselq
                showreg(ln, 0, "uR4 ", 20, (m_cursor==32));
263
                showreg(ln,20, "uR5 ", 21, (m_cursor==33));
264
                showreg(ln,40, "uR6 ", 22, (m_cursor==34));
265
                showreg(ln,60, "uR7 ", 23, (m_cursor==35)); ln++;
266 2 dgisselq
 
267 34 dgisselq
                showreg(ln, 0, "uR8 ", 24, (m_cursor==36));
268
                showreg(ln,20, "uR9 ", 25, (m_cursor==37));
269
                showreg(ln,40, "uR10", 26, (m_cursor==38));
270
                showreg(ln,60, "uR11", 27, (m_cursor==39)); ln++;
271 2 dgisselq
 
272 34 dgisselq
                showreg(ln, 0, "uR12", 28, (m_cursor==40));
273
                showreg(ln,20, "uSP ", 29, (m_cursor==41));
274
                mvprintw(ln,40, "uCC :%s%s%s%s%s%s%s%s",
275 27 dgisselq
                        (m_core->v__DOT__thecpu__DOT__trap)?"TRP":" ",
276
                        (m_core->v__DOT__thecpu__DOT__step)?"STP":" ",
277
                        (m_core->v__DOT__thecpu__DOT__sleep)?"SLP":" ",
278
                        (m_core->v__DOT__thecpu__DOT__gie)?"GIE":" ",
279 2 dgisselq
                        (m_core->v__DOT__thecpu__DOT__flags&8)?"V":" ",
280
                        (m_core->v__DOT__thecpu__DOT__flags&4)?"N":" ",
281
                        (m_core->v__DOT__thecpu__DOT__flags&2)?"C":" ",
282
                        (m_core->v__DOT__thecpu__DOT__flags&1)?"Z":" ");
283 34 dgisselq
                showval(ln,60, "uPC ", m_core->v__DOT__thecpu__DOT__upc, (m_cursor==43));
284 2 dgisselq
 
285
                attroff(A_BOLD);
286
                ln+=1;
287
 
288 4 dgisselq
                mvprintw(ln, 0, "PFPIPE: rda=%08x/%d, bas=%08x, off=%08x, nv=%03x, ackw=%d",
289 2 dgisselq
                        m_core->v__DOT__thecpu__DOT__pf__DOT__r_addr,
290
                        m_core->v__DOT__thecpu__DOT__pf__DOT__r_cv,
291
                        m_core->v__DOT__thecpu__DOT__pf__DOT__r_cache_base,
292
                        m_core->v__DOT__thecpu__DOT__pf__DOT__r_cache_offset,
293 4 dgisselq
                        m_core->v__DOT__thecpu__DOT__pf__DOT__r_nvalid,
294
                        m_core->v__DOT__thecpu__DOT__pf__DOT__r_acks_waiting);
295 2 dgisselq
                ln++;
296
                mvprintw(ln, 0, "PF BUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
297
                        (m_core->v__DOT__thecpu__DOT__pf_cyc)?"CYC":"   ",
298
                        (m_core->v__DOT__thecpu__DOT__pf_stb)?"STB":"   ",
299
                        "  ", // (m_core->v__DOT__thecpu__DOT__pf_we )?"WE":"  ",
300
                        (m_core->v__DOT__thecpu__DOT__pf_addr),
301
                        0, // (m_core->v__DOT__thecpu__DOT__pf_data),
302
                        (m_core->v__DOT__thecpu__DOT__pf_ack)?"ACK":"   ",
303
                        (m_core->v__DOT__cpu_stall)?"STL":"   ",
304
                        (m_core->v__DOT__wb_data)); ln++;
305
 
306
                mvprintw(ln, 0, "MEMBUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
307
                        (m_core->v__DOT__thecpu__DOT__mem_cyc)?"CYC":"   ",
308
                        (m_core->v__DOT__thecpu__DOT__mem_stb)?"STB":"   ",
309
                        (m_core->v__DOT__thecpu__DOT__mem_we )?"WE":"  ",
310
                        (m_core->v__DOT__thecpu__DOT__mem_addr),
311
                        (m_core->v__DOT__thecpu__DOT__mem_data),
312
                        (m_core->v__DOT__thecpu__DOT__mem_ack)?"ACK":"   ",
313
                        (m_core->v__DOT__cpu_stall)?"STL":"   ",
314
                        (m_core->v__DOT__thecpu__DOT__mem_result)); ln++;
315
 
316
                mvprintw(ln, 0, "SYSBUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
317
                        (m_core->o_wb_cyc)?"CYC":"   ",
318
                        (m_core->o_wb_stb)?"STB":"   ",
319
                        (m_core->o_wb_we )?"WE":"  ",
320
                        (m_core->o_wb_addr),
321
                        (m_core->o_wb_data),
322
                        (m_core->i_wb_ack)?"ACK":"   ",
323
                        (m_core->i_wb_stall)?"STL":"   ",
324
                        (m_core->i_wb_data)); ln+=2;
325
 
326
                showins(ln, "I ",
327
                        !m_core->v__DOT__thecpu__DOT__dcd_stalled,
328
                        m_core->v__DOT__thecpu__DOT__pf_valid,
329
                        //m_core->v__DOT__thecpu__DOT__instruction_gie,
330
                        m_core->v__DOT__thecpu__DOT__gie,
331
                        0,
332
                        // m_core->v__DOT__thecpu__DOT__instruction_pc); ln++;
333
                        m_core->v__DOT__thecpu__DOT__pf_pc); ln++;
334
 
335
                showins(ln, "Dc",
336
                        m_core->v__DOT__thecpu__DOT__dcd_ce,
337
                        m_core->v__DOT__thecpu__DOT__dcdvalid,
338
                        m_core->v__DOT__thecpu__DOT__dcd_gie,
339
                        m_core->v__DOT__thecpu__DOT__dcd_stalled,
340
                        m_core->v__DOT__thecpu__DOT__dcd_pc-1); ln++;
341
 
342
                showins(ln, "Op",
343
                        m_core->v__DOT__thecpu__DOT__op_ce,
344
                        m_core->v__DOT__thecpu__DOT__opvalid,
345
                        m_core->v__DOT__thecpu__DOT__op_gie,
346
                        m_core->v__DOT__thecpu__DOT__op_stall,
347
                        m_core->v__DOT__thecpu__DOT__op_pc-1); ln++;
348
 
349
                showins(ln, "Al",
350
                        m_core->v__DOT__thecpu__DOT__alu_ce,
351
                        m_core->v__DOT__thecpu__DOT__alu_pc_valid,
352
                        m_core->v__DOT__thecpu__DOT__alu_gie,
353
                        m_core->v__DOT__thecpu__DOT__alu_stall,
354
                        m_core->v__DOT__thecpu__DOT__alu_pc-1); ln++;
355
 
356 27 dgisselq
                mvprintw(ln-5, 48,"%s %s",
357
                        (m_core->v__DOT__thecpu__DOT__op_break)?"OB":"  ",
358
                        (m_core->v__DOT__thecpu__DOT__clear_pipeline)?"CLRP":"    ");
359 2 dgisselq
                mvprintw(ln-4, 48,
360
                        (m_core->v__DOT__thecpu__DOT__new_pc)?"new-pc":"      ");
361
                printw("(%s:%02x,%x)",
362
                        (m_core->v__DOT__thecpu__DOT__set_cond)?"SET":"   ",
363
                        (m_core->v__DOT__thecpu__DOT__opF&0x0ff),
364
                        (m_core->v__DOT__thecpu__DOT__op_gie)
365
                                ?  (m_core->v__DOT__thecpu__DOT__w_uflags)
366
                                : (m_core->v__DOT__thecpu__DOT__w_iflags));
367
 
368
                printw("(%s%s%s:%02x)",
369
                        (m_core->v__DOT__thecpu__DOT__opF_wr)?"OF":"  ",
370
                        (m_core->v__DOT__thecpu__DOT__alF_wr)?"FL":"  ",
371
                        (m_core->v__DOT__thecpu__DOT__wr_flags_ce)?"W":" ",
372
                        (m_core->v__DOT__thecpu__DOT__alu_flags));
373
                /*
374
                mvprintw(ln-3, 48, "dcdI : 0x%08x",
375
                        m_core->v__DOT__thecpu__DOT__dcdI);
376
                mvprintw(ln-2, 48, "r_opB: 0x%08x",
377
                        m_core->v__DOT__thecpu__DOT__opB);
378
                */
379 27 dgisselq
                mvprintw(ln-3, 48, "Op(%x)%8x,%8x->",
380 2 dgisselq
                        m_core->v__DOT__thecpu__DOT__opn,
381 27 dgisselq
                        m_core->v__DOT__thecpu__DOT__r_opA,
382
                        m_core->v__DOT__thecpu__DOT__r_opB);
383
                if (m_core->v__DOT__thecpu__DOT__alu_valid)
384
                        printw("%08x", m_core->v__DOT__thecpu__DOT__alu_result);
385
                else
386
                        printw("%8s","");
387 2 dgisselq
                mvprintw(ln-1, 48, "MEM: %s%s %s%s %s %-5s",
388 27 dgisselq
                        (m_core->v__DOT__thecpu__DOT__opvalid_mem)?"M":" ",
389 2 dgisselq
                        (m_core->v__DOT__thecpu__DOT__mem_ce)?"CE":"  ",
390
                        (m_core->v__DOT__thecpu__DOT__mem_we)?"Wr ":"Rd ",
391
                        (m_core->v__DOT__thecpu__DOT__mem_stalled)?"PIPE":"    ",
392
                        (m_core->v__DOT__thecpu__DOT__mem_valid)?"MEMV":"    ",
393
                        zop_regstr[(m_core->v__DOT__thecpu__DOT__mem_wreg&0x1f)^0x10]);
394
        }
395
 
396
        unsigned int    cmd_read(unsigned int a) {
397
                if (dbg_fp) {
398
                        dbg_flag= true;
399
                        fprintf(dbg_fp, "CMD-READ(%d)\n", a);
400
                }
401
                wb_write(CMD_REG, CMD_HALT|(a&0x3f));
402
                while((wb_read(CMD_REG) & CMD_STALL) == 0)
403
                        ;
404
                unsigned int v = wb_read(CMD_DATA);
405
 
406
                if (dbg_flag)
407
                        fprintf(dbg_fp, "CMD-READ(%d) = 0x%08x\n", a,
408
                                v);
409
                dbg_flag = false;
410
                return v;
411
        }
412
 
413 34 dgisselq
        void    cmd_write(unsigned int a, int v) {
414
                if ((a&0x0f)==0x0f)
415
                        dbg_flag = true;
416
                wb_write(CMD_REG, CMD_HALT|(a&0x3f));
417
                while((wb_read(CMD_REG) & CMD_STALL) == 0)
418
                        ;
419
                if (dbg_flag)
420
                        fprintf(dbg_fp, "CMD-WRITE(%d) <= 0x%08x\n", a, v);
421
                wb_write(CMD_DATA, v);
422
        }
423
 
424 27 dgisselq
        bool    halted(void) {
425
                return (m_core->v__DOT__cmd_halt != 0);
426
        }
427
 
428 2 dgisselq
        void    read_state(void) {
429
                int     ln= 0;
430 34 dgisselq
                bool    gie;
431 2 dgisselq
 
432 34 dgisselq
                if (m_cursor < 0)
433
                        m_cursor = 0;
434
                else if (m_cursor >= 44)
435
                        m_cursor = 43;
436
 
437
                mvprintw(ln,0, "Peripherals-RS");
438
                mvprintw(ln,40,"%-40s", "CPU State: ");
439
                {
440
                        unsigned int v = wb_read(CMD_REG);
441
                        mvprintw(ln,51, "");
442
                        if (v & 0x010000)
443
                                printw("EXT-INT ");
444
                        if ((v & 0x003000) == 0x03000)
445
                                printw("Halted ");
446
                        else if (v & 0x001000)
447
                                printw("Sleeping ");
448
                        else if (v & 0x002000)
449
                                printw("Supervisor Mod ");
450
                        if (v & 0x008000)
451
                                printw("Break-Enabled ");
452
                        if (v & 0x000080)
453
                                printw("PIC Enabled ");
454
                } ln++;
455
                showval(ln, 0, "PIC ", cmd_read(32+ 0), (m_cursor==0));
456
                showval(ln,20, "WDT ", cmd_read(32+ 1), (m_cursor==1));
457
                showval(ln,40, "CACH", cmd_read(32+ 2), (m_cursor==2));
458
                showval(ln,60, "PIC2", cmd_read(32+ 3), (m_cursor==3));
459 2 dgisselq
                ln++;
460 34 dgisselq
                showval(ln, 0, "TMRA", cmd_read(32+ 4), (m_cursor==4));
461
                showval(ln,20, "TMRB", cmd_read(32+ 5), (m_cursor==5));
462
                showval(ln,40, "TMRC", cmd_read(32+ 6), (m_cursor==6));
463
                showval(ln,60, "JIF ", cmd_read(32+ 7), (m_cursor==7));
464 2 dgisselq
 
465
                ln++;
466 34 dgisselq
                showval(ln, 0, "UTSK", cmd_read(32+12), (m_cursor==8));
467
                showval(ln,20, "UMST", cmd_read(32+13), (m_cursor==9));
468
                showval(ln,40, "UPST", cmd_read(32+14), (m_cursor==10));
469
                showval(ln,60, "UICT", cmd_read(32+15), (m_cursor==11));
470 2 dgisselq
 
471
                ln++;
472
                ln++;
473
                unsigned int cc = cmd_read(14);
474
                if (dbg_fp) fprintf(dbg_fp, "CC = %08x, gie = %d\n", cc,
475
                        m_core->v__DOT__thecpu__DOT__gie);
476 34 dgisselq
                gie = (cc & 0x020);
477
                if (gie)
478 2 dgisselq
                        attroff(A_BOLD);
479
                else
480
                        attron(A_BOLD);
481
                mvprintw(ln, 0, "Supervisor Registers");
482
                ln++;
483
 
484 34 dgisselq
                dispreg(ln, 0, "sR0 ", cmd_read(0), (m_cursor==12));
485
                dispreg(ln,20, "sR1 ", cmd_read(1), (m_cursor==13));
486
                dispreg(ln,40, "sR2 ", cmd_read(2), (m_cursor==14));
487
                dispreg(ln,60, "sR3 ", cmd_read(3), (m_cursor==15)); ln++;
488 2 dgisselq
 
489 34 dgisselq
                dispreg(ln, 0, "sR4 ", cmd_read(4), (m_cursor==16));
490
                dispreg(ln,20, "sR5 ", cmd_read(5), (m_cursor==17));
491
                dispreg(ln,40, "sR6 ", cmd_read(6), (m_cursor==18));
492
                dispreg(ln,60, "sR7 ", cmd_read(7), (m_cursor==19)); ln++;
493 2 dgisselq
 
494 34 dgisselq
                dispreg(ln, 0, "sR8 ", cmd_read( 8), (m_cursor==20));
495
                dispreg(ln,20, "sR9 ", cmd_read( 9), (m_cursor==21));
496
                dispreg(ln,40, "sR10", cmd_read(10), (m_cursor==22));
497
                dispreg(ln,60, "sR11", cmd_read(11), (m_cursor==23)); ln++;
498 2 dgisselq
 
499 34 dgisselq
                dispreg(ln, 0, "sR12", cmd_read(12), (m_cursor==24));
500
                dispreg(ln,20, "sSP ", cmd_read(13), (m_cursor==25));
501 2 dgisselq
 
502 34 dgisselq
                mvprintw(ln,40, "%ssCC :%s%s%s%s%s%s%s%s",
503
                        (m_cursor==26)?">":" ",
504
                        (cc & 0x100)?"TP":"  ",
505
                        (cc & 0x040)?"ST":"  ",
506
                        (cc & 0x020)?"IE":"  ",
507
                        (cc & 0x010)?"SL":"  ",
508 2 dgisselq
                        (cc&8)?"V":" ",
509
                        (cc&4)?"N":" ",
510
                        (cc&2)?"C":" ",
511
                        (cc&1)?"Z":" ");
512 34 dgisselq
                dispreg(ln,60, "sPC ", cmd_read(15), (m_cursor==27));
513 2 dgisselq
                ln++;
514
 
515 34 dgisselq
                if (gie)
516 2 dgisselq
                        attron(A_BOLD);
517
                else
518
                        attroff(A_BOLD);
519
                mvprintw(ln, 0, "User Registers"); ln++;
520 34 dgisselq
                dispreg(ln, 0, "uR0 ", cmd_read(16), (m_cursor==28));
521
                dispreg(ln,20, "uR1 ", cmd_read(17), (m_cursor==29));
522
                dispreg(ln,40, "uR2 ", cmd_read(18), (m_cursor==30));
523
                dispreg(ln,60, "uR3 ", cmd_read(19), (m_cursor==31)); ln++;
524 2 dgisselq
 
525 34 dgisselq
                dispreg(ln, 0, "uR4 ", cmd_read(20), (m_cursor==32));
526
                dispreg(ln,20, "uR5 ", cmd_read(21), (m_cursor==33));
527
                dispreg(ln,40, "uR6 ", cmd_read(22), (m_cursor==34));
528
                dispreg(ln,60, "uR7 ", cmd_read(23), (m_cursor==35)); ln++;
529 2 dgisselq
 
530 34 dgisselq
                dispreg(ln, 0, "uR8 ", cmd_read(24), (m_cursor==36));
531
                dispreg(ln,20, "uR9 ", cmd_read(25), (m_cursor==37));
532
                dispreg(ln,40, "uR10", cmd_read(26), (m_cursor==38));
533
                dispreg(ln,60, "uR11", cmd_read(27), (m_cursor==39)); ln++;
534 2 dgisselq
 
535 34 dgisselq
                dispreg(ln, 0, "uR12", cmd_read(28), (m_cursor==40));
536
                dispreg(ln,20, "uSP ", cmd_read(29), (m_cursor==41));
537 2 dgisselq
                cc = cmd_read(30);
538 34 dgisselq
                mvprintw(ln,40, "%cuCC :%s%s%s%s%s%s%s%s",
539
                        (m_cursor == 42)?">":" ",
540
                        (cc&0x100)?"TP":"  ",
541
                        (cc&0x040)?"ST":"  ",
542
                        (cc&0x020)?"IE":"  ",
543
                        (cc&0x010)?"SL":"  ",
544 2 dgisselq
                        (cc&8)?"V":" ",
545
                        (cc&4)?"N":" ",
546
                        (cc&2)?"C":" ",
547
                        (cc&1)?"Z":" ");
548 34 dgisselq
                dispreg(ln,60, "uPC ", cmd_read(31), (m_cursor==43));
549 2 dgisselq
 
550
                attroff(A_BOLD);
551
                ln+=2;
552
 
553
                ln+=3;
554
 
555
                showins(ln, "I ",
556
                        !m_core->v__DOT__thecpu__DOT__dcd_stalled,
557
                        m_core->v__DOT__thecpu__DOT__pf_valid,
558
                        m_core->v__DOT__thecpu__DOT__gie,
559
                        0,
560
                        // m_core->v__DOT__thecpu__DOT__instruction_pc); ln++;
561
                        m_core->v__DOT__thecpu__DOT__pf_pc); ln++;
562
 
563
                showins(ln, "Dc",
564
                        m_core->v__DOT__thecpu__DOT__dcd_ce,
565
                        m_core->v__DOT__thecpu__DOT__dcdvalid,
566
                        m_core->v__DOT__thecpu__DOT__dcd_gie,
567
                        m_core->v__DOT__thecpu__DOT__dcd_stalled,
568
                        m_core->v__DOT__thecpu__DOT__dcd_pc-1); ln++;
569
 
570
                showins(ln, "Op",
571
                        m_core->v__DOT__thecpu__DOT__op_ce,
572
                        m_core->v__DOT__thecpu__DOT__opvalid,
573
                        m_core->v__DOT__thecpu__DOT__op_gie,
574
                        m_core->v__DOT__thecpu__DOT__op_stall,
575
                        m_core->v__DOT__thecpu__DOT__op_pc-1); ln++;
576
 
577
                showins(ln, "Al",
578
                        m_core->v__DOT__thecpu__DOT__alu_ce,
579
                        m_core->v__DOT__thecpu__DOT__alu_pc_valid,
580
                        m_core->v__DOT__thecpu__DOT__alu_gie,
581
                        m_core->v__DOT__thecpu__DOT__alu_stall,
582
                        m_core->v__DOT__thecpu__DOT__alu_pc-1); ln++;
583
        }
584
        void    tick(void) {
585
                int gie = m_core->v__DOT__thecpu__DOT__gie;
586
                /*
587
                m_core->i_qspi_dat = m_flash(m_core->o_qspi_cs_n,
588
                                                m_core->o_qspi_sck,
589
                                                m_core->o_qspi_dat);
590
                */
591
 
592 11 dgisselq
                int stb = m_core->o_wb_stb;
593
                if ((m_core->o_wb_addr & (-1<<20))!=1)
594
                        stb = 0;
595 2 dgisselq
                m_mem(m_core->o_wb_cyc, m_core->o_wb_stb, m_core->o_wb_we,
596
                        m_core->o_wb_addr & ((1<<20)-1), m_core->o_wb_data,
597
                        m_core->i_wb_ack, m_core->i_wb_stall,m_core->i_wb_data);
598 11 dgisselq
                if ((m_core->o_wb_cyc)&&(m_core->o_wb_stb)&&(!stb))
599
                        m_core->i_wb_ack = 1;
600 2 dgisselq
 
601
                if ((dbg_flag)&&(dbg_fp)) {
602
                        fprintf(dbg_fp, "DBG  %s %s %s @0x%08x/%d[0x%08x] %s %s [0x%08x] %s %s %s%s%s%s%s%s%s%s\n",
603
                                (m_core->i_dbg_cyc)?"CYC":"   ",
604
                                (m_core->i_dbg_stb)?"STB":
605
                                        ((m_core->v__DOT__dbg_stb)?"DBG":"   "),
606
                                ((m_core->i_dbg_we)?"WE":"  "),
607
                                (m_core->i_dbg_addr),0,
608
                                m_core->i_dbg_data,
609
                                (m_core->o_dbg_ack)?"ACK":"   ",
610
                                (m_core->o_dbg_stall)?"STALL":"     ",
611
                                (m_core->o_dbg_data),
612
                                (m_core->v__DOT__cpu_halt)?"CPU-HALT ":"",
613
                                (m_core->v__DOT__cpu_dbg_stall)?"CPU-DBG_STALL":"",
614
                                (m_core->v__DOT__thecpu__DOT__dcdvalid)?"DCDV ":"",
615
                                (m_core->v__DOT__thecpu__DOT__opvalid)?"OPV ":"",
616
                                (m_core->v__DOT__thecpu__DOT__pf_cyc)?"PCYC ":"",
617
                                (m_core->v__DOT__thecpu__DOT__mem_cyc)?"MCYC ":"",
618
                                (m_core->v__DOT__thecpu__DOT__alu_wr)?"ALUW ":"",
619
                                (m_core->v__DOT__thecpu__DOT__alu_ce)?"ALCE ":"",
620
                                (m_core->v__DOT__thecpu__DOT__alu_valid)?"ALUV ":"",
621
                                (m_core->v__DOT__thecpu__DOT__mem_valid)?"MEMV ":"");
622
                        fprintf(dbg_fp, " SYS %s %s %s @0x%08x/%d[0x%08x] %s [0x%08x]\n",
623
                                (m_core->v__DOT__sys_cyc)?"CYC":"   ",
624
                                (m_core->v__DOT__sys_stb)?"STB":"   ",
625
                                (m_core->v__DOT__sys_we)?"WE":"  ",
626
                                (m_core->v__DOT__sys_addr),
627
                                (m_core->v__DOT__dbg_addr),
628
                                (m_core->v__DOT__sys_data),
629
                                (m_core->v__DOT__dbg_ack)?"ACK":"   ",
630
                                (m_core->v__DOT__wb_data));
631
                }
632
 
633
                if (dbg_fp)
634
                        fprintf(dbg_fp, "CEs %d/0x%08x,%d/0x%08x DCD: ->%02x, OP: ->%02x, ALU: halt=%d,%d ce=%d, valid=%d, wr=%d  Reg=%02x, IPC=%08x, UPC=%08x\n",
635
                                m_core->v__DOT__thecpu__DOT__dcd_ce,
636
                                m_core->v__DOT__thecpu__DOT__dcd_pc,
637
                                m_core->v__DOT__thecpu__DOT__op_ce,
638
                                m_core->v__DOT__thecpu__DOT__op_pc,
639
                                m_core->v__DOT__thecpu__DOT__dcdA,
640
                                m_core->v__DOT__thecpu__DOT__opR,
641
                                m_core->v__DOT__cmd_halt,
642
                                m_core->v__DOT__cpu_halt,
643
                                m_core->v__DOT__thecpu__DOT__alu_ce,
644
                                m_core->v__DOT__thecpu__DOT__alu_valid,
645
                                m_core->v__DOT__thecpu__DOT__alu_wr,
646
                                m_core->v__DOT__thecpu__DOT__alu_reg,
647
                                m_core->v__DOT__thecpu__DOT__ipc,
648
                                m_core->v__DOT__thecpu__DOT__upc);
649
 
650
                if ((dbg_fp)&&(!gie)&&(m_core->v__DOT__thecpu__DOT__w_release_from_interrupt)) {
651
                        fprintf(dbg_fp, "RELEASE: int=%d, %d/%02x[%08x] ?/%02x[0x%08x], ce=%d %d,%d,%d\n",
652
                                m_core->v__DOT__pic_interrupt,
653
                                m_core->v__DOT__thecpu__DOT__wr_reg_ce,
654
                                m_core->v__DOT__thecpu__DOT__wr_reg_id,
655
                                m_core->v__DOT__thecpu__DOT__wr_reg_vl,
656
                                m_core->v__DOT__cmd_addr,
657
                                m_core->v__DOT__dbg_idata,
658
                                m_core->v__DOT__thecpu__DOT__master_ce,
659
                                m_core->v__DOT__thecpu__DOT__alu_wr,
660
                                m_core->v__DOT__thecpu__DOT__alu_valid,
661
                                m_core->v__DOT__thecpu__DOT__mem_valid);
662
                } else if ((dbg_fp)&&(gie)&&(m_core->v__DOT__thecpu__DOT__w_switch_to_interrupt)) {
663
                        fprintf(dbg_fp, "SWITCH: %d/%02x[%08x] ?/%02x[0x%08x], ce=%d %d,%d,%d, F%02x,%02x\n",
664
                                m_core->v__DOT__thecpu__DOT__wr_reg_ce,
665
                                m_core->v__DOT__thecpu__DOT__wr_reg_id,
666
                                m_core->v__DOT__thecpu__DOT__wr_reg_vl,
667
                                m_core->v__DOT__cmd_addr,
668
                                m_core->v__DOT__dbg_idata,
669
                                m_core->v__DOT__thecpu__DOT__master_ce,
670
                                m_core->v__DOT__thecpu__DOT__alu_wr,
671
                                m_core->v__DOT__thecpu__DOT__alu_valid,
672
                                m_core->v__DOT__thecpu__DOT__mem_valid,
673
                                m_core->v__DOT__thecpu__DOT__w_iflags,
674
                                m_core->v__DOT__thecpu__DOT__w_uflags);
675
                        fprintf(dbg_fp, "\tbrk=%d,%d\n",
676
                                m_core->v__DOT__thecpu__DOT__break_en,
677
                                m_core->v__DOT__thecpu__DOT__op_break);
678
                }
679
 
680 34 dgisselq
                if (dbg_fp) {
681
                        if(m_core->v__DOT__thecpu__DOT__clear_pipeline)
682
                                fprintf(dbg_fp, "\tClear Pipeline\n");
683
                        if(m_core->v__DOT__thecpu__DOT__new_pc)
684
                                fprintf(dbg_fp, "\tNew PC\n");
685
                }
686
 
687 2 dgisselq
                TESTB<Vzipsystem>::tick();
688
                if ((dbg_fp)&&(gie != m_core->v__DOT__thecpu__DOT__gie)) {
689
                        fprintf(dbg_fp, "SWITCH FROM %s to %s: sPC = 0x%08x uPC = 0x%08x pf_pc = 0x%08x\n",
690
                                (gie)?"User":"Supervisor",
691
                                (gie)?"Supervisor":"User",
692
                                m_core->v__DOT__thecpu__DOT__ipc,
693
                                m_core->v__DOT__thecpu__DOT__upc,
694
                                m_core->v__DOT__thecpu__DOT__pf_pc);
695
                } if (dbg_fp) {
696
                        dbgins("Op - ", m_core->v__DOT__thecpu__DOT__op_ce,
697
                                m_core->v__DOT__thecpu__DOT__opvalid,
698
                                m_core->v__DOT__thecpu__DOT__op_gie,
699
                                m_core->v__DOT__thecpu__DOT__op_stall,
700
                                m_core->v__DOT__thecpu__DOT__op_pc-1);
701
                        dbgins("Al - ",
702
                                m_core->v__DOT__thecpu__DOT__alu_ce,
703
                                m_core->v__DOT__thecpu__DOT__alu_pc_valid,
704
                                m_core->v__DOT__thecpu__DOT__alu_gie,
705
                                m_core->v__DOT__thecpu__DOT__alu_stall,
706
                                m_core->v__DOT__thecpu__DOT__alu_pc-1);
707
 
708
                }
709
        }
710
 
711
        bool    test_success(void) {
712
                return ((!m_core->v__DOT__thecpu__DOT__gie)
713
                        &&(m_core->v__DOT__thecpu__DOT__sleep));
714
        }
715
 
716
        bool    test_failure(void) {
717
                return ((m_core->v__DOT__thecpu__DOT__alu_pc_valid)
718
                        &&(m_mem[m_core->v__DOT__thecpu__DOT__alu_pc-1]
719
                                == 0x2f0f7fff));
720
        }
721
 
722
        void    wb_write(unsigned a, unsigned int v) {
723
                mvprintw(0,35, "%40s", "");
724
                mvprintw(0,40, "wb_write(%d,%x)", a, v);
725
                m_core->i_dbg_cyc = 1;
726
                m_core->i_dbg_stb = 1;
727
                m_core->i_dbg_we  = 1;
728
                m_core->i_dbg_addr = a & 1;
729
                m_core->i_dbg_data = v;
730
 
731
                tick();
732
                while(m_core->o_dbg_stall)
733
                        tick();
734
 
735
                m_core->i_dbg_stb = 0;
736
                while(!m_core->o_dbg_ack)
737
                        tick();
738
 
739
                // Release the bus
740
                m_core->i_dbg_cyc = 0;
741
                m_core->i_dbg_stb = 0;
742
                tick();
743
                mvprintw(0,35, "%40s", "");
744
                mvprintw(0,40, "wb_write -- complete");
745
        }
746
 
747
        unsigned long   wb_read(unsigned a) {
748
                unsigned int    v;
749
                mvprintw(0,35, "%40s", "");
750
                mvprintw(0,40, "wb_read(0x%08x)", a);
751
                m_core->i_dbg_cyc = 1;
752
                m_core->i_dbg_stb = 1;
753
                m_core->i_dbg_we  = 0;
754
                m_core->i_dbg_addr = a & 1;
755
 
756
                tick();
757
                while(m_core->o_dbg_stall)
758
                        tick();
759
 
760
                m_core->i_dbg_stb = 0;
761
                while(!m_core->o_dbg_ack)
762
                        tick();
763
                v = m_core->o_dbg_data;
764
 
765
                // Release the bus
766
                m_core->i_dbg_cyc = 0;
767
                m_core->i_dbg_stb = 0;
768
                tick();
769
 
770
                mvprintw(0,35, "%40s", "");
771
                mvprintw(0,40, "wb_read = 0x%08x", v);
772
 
773
                return v;
774
        }
775
 
776 34 dgisselq
        void    cursor_up(void) {
777
                if (m_cursor > 3)
778
                        m_cursor -= 4;
779
        } void  cursor_down(void) {
780
                if (m_cursor < 40)
781
                        m_cursor += 4;
782
        } void  cursor_left(void) {
783
                if (m_cursor > 0)
784
                        m_cursor--;
785
                else    m_cursor = 43;
786
        } void  cursor_right(void) {
787
                if (m_cursor < 43)
788
                        m_cursor++;
789
                else    m_cursor = 0;
790
        }
791
 
792
        int     cursor(void) { return m_cursor; }
793 2 dgisselq
};
794
 
795 34 dgisselq
void    get_value(ZIPPY_TB *tb) {
796
        int     wy, wx, ra;
797
        int     c = tb->cursor();
798
 
799
        wx = (c & 0x03) * 20 + 9;
800
        wy = (c>>2);
801
        if (wy >= 3+4)
802
                wy++;
803
        if (wy > 3)
804
                wy += 2;
805
        wy++;
806
 
807
        if (c >= 12)
808
                ra = c - 12;
809
        else
810
                ra = c + 32;
811
 
812
        bool    done = false;
813
        char    str[16];
814
        int     pos = 0; str[pos] = '\0';
815
        while(!done) {
816
                int     chv = getch();
817
                switch(chv) {
818
                case KEY_ESCAPE:
819
                        pos = 0; str[pos] = '\0'; done = true;
820
                        break;
821
                case KEY_RETURN: case KEY_ENTER: case KEY_UP: case KEY_DOWN:
822
                        done = true;
823
                        break;
824
                case KEY_LEFT: case KEY_BACKSPACE:
825
                        if (pos > 0) pos--;
826
                        break;
827
                case KEY_CLEAR:
828
                        pos = 0;
829
                        break;
830
                case '0': case ' ': str[pos++] = '0'; break;
831
                case '1': str[pos++] = '1'; break;
832
                case '2': str[pos++] = '2'; break;
833
                case '3': str[pos++] = '3'; break;
834
                case '4': str[pos++] = '4'; break;
835
                case '5': str[pos++] = '5'; break;
836
                case '6': str[pos++] = '6'; break;
837
                case '7': str[pos++] = '7'; break;
838
                case '8': str[pos++] = '8'; break;
839
                case '9': str[pos++] = '9'; break;
840
                case 'A': case 'a': str[pos++] = 'A'; break;
841
                case 'B': case 'b': str[pos++] = 'B'; break;
842
                case 'C': case 'c': str[pos++] = 'C'; break;
843
                case 'D': case 'd': str[pos++] = 'D'; break;
844
                case 'E': case 'e': str[pos++] = 'E'; break;
845
                case 'F': case 'f': str[pos++] = 'F'; break;
846
                }
847
 
848
                if (pos > 8)
849
                        pos = 8;
850
                str[pos] = '\0';
851
 
852
                attron(A_NORMAL | A_UNDERLINE);
853
                mvprintw(wy, wx, "%-8s", str);
854
                if (pos > 0) {
855
                        attron(A_NORMAL | A_UNDERLINE | A_BLINK);
856
                        mvprintw(wy, wx+pos-1, "%c", str[pos-1]);
857
                }
858
                attrset(A_NORMAL);
859
        }
860
 
861
        if (pos > 0) {
862
                int     v;
863
                v = strtoul(str, NULL, 16);
864
                if (!tb->halted()) {
865
                        switch(ra) {
866
                        case 15:
867
                                tb->m_core->v__DOT__thecpu__DOT__ipc = v;
868
                                if (!tb->m_core->v__DOT__thecpu__DOT__gie) {
869
                                        tb->m_core->v__DOT__thecpu__DOT__pf_pc = v;
870
                                        tb->m_core->v__DOT__thecpu__DOT__new_pc = 1;
871
                                        tb->m_core->v__DOT__thecpu__DOT__clear_pipeline = 1;
872
                                        tb->m_core->v__DOT__thecpu__DOT__alu_pc_valid = 0;
873
                                        tb->m_core->v__DOT__thecpu__DOT__dcd_ce = 0;
874
                                        tb->m_core->v__DOT__thecpu__DOT__dcdvalid = 0;
875
                                        tb->m_core->v__DOT__thecpu__DOT__opvalid = 0;
876
                                }
877
                                break;
878
                        case 31:
879
                                tb->m_core->v__DOT__thecpu__DOT__upc = v;
880
                                if (tb->m_core->v__DOT__thecpu__DOT__gie) {
881
                                        tb->m_core->v__DOT__thecpu__DOT__pf_pc = v;
882
                                        tb->m_core->v__DOT__thecpu__DOT__new_pc = 1;
883
                                        tb->m_core->v__DOT__thecpu__DOT__clear_pipeline = 1;
884
                                        tb->m_core->v__DOT__thecpu__DOT__alu_pc_valid = 0;
885
                                        tb->m_core->v__DOT__thecpu__DOT__dcd_ce = 0;
886
                                        tb->m_core->v__DOT__thecpu__DOT__dcdvalid = 0;
887
                                        tb->m_core->v__DOT__thecpu__DOT__opvalid = 0;
888
                                }
889
                                break;
890
                        case 32: tb->m_core->v__DOT__pic_data = v; break;
891
                        case 33: tb->m_core->v__DOT__watchdog__DOT__r_value = v; break;
892
                        case 34: tb->m_core->v__DOT__manualcache__DOT__cache_base = v; break;
893
                        case 35: tb->m_core->v__DOT__ctri__DOT__r_int_state = v; break;
894
                        case 36: tb->m_core->v__DOT__timer_a__DOT__r_value = v; break;
895
                        case 37: tb->m_core->v__DOT__timer_b__DOT__r_value = v; break;
896
                        case 38: tb->m_core->v__DOT__timer_c__DOT__r_value = v; break;
897
                        case 39: tb->m_core->v__DOT__jiffies__DOT__r_counter = v; break;
898
                        case 44: tb->m_core->v__DOT__utc_data = v; break;
899
                        case 45: tb->m_core->v__DOT__uoc_data = v; break;
900
                        case 46: tb->m_core->v__DOT__upc_data = v; break;
901
                        case 47: tb->m_core->v__DOT__uic_data = v; break;
902
                        default:
903
                                tb->m_core->v__DOT__thecpu__DOT__regset[ra] = v;
904
                                break;
905
                        }
906
                } else
907
                        tb->cmd_write(ra, v);
908
        }
909
}
910
 
911 27 dgisselq
void    usage(void) {
912
        printf("USAGE: zippy_tb [-a] <testfile.out>\n");
913
        printf("\n");
914
        printf("\tWhere testfile.out is an output file from the assembler.\n");
915
        printf("\t-a\tSets the testbench to run automatically without any\n");
916
        printf("\t\tuser interaction.\n");
917
        printf("\n");
918
        printf("\tUser Commands:\n");
919
        printf("\t\tWhen the test bench is run interactively, the following\n");
920
        printf("\t\tkey strokes are recognized:\n");
921
        printf("\t\t\'h\'\tHalt the processor using the external interface.\n");
922
        printf("\t\t\'g\'\tLet the processor run at full throttle with no.\n");
923
        printf("\t\t\tuser intervention.\n");
924
        printf("\t\t\'q\'\tQuit the simulation.\n");
925
        printf("\t\t\'r\'\tReset the processor.\n");
926
        printf("\t\t\'s\'\tStep the CPU using the external stepping command\n");
927
        printf("\t\t\tThis may consume more than one tick.\n");
928
        printf("\t\t\'t\'\tClock a single tick through the system.\n");
929
}
930 2 dgisselq
 
931
int     main(int argc, char **argv) {
932
        Verilated::commandArgs(argc, argv);
933
        ZIPPY_TB        *tb = new ZIPPY_TB();
934 27 dgisselq
        bool            autorun = false, exit_on_done = false;
935 2 dgisselq
 
936
        // mem[0x00000] = 0xbe000010; // Halt instruction
937
        unsigned int mptr = 0;
938
 
939 9 dgisselq
        if (argc <= 1) {
940 27 dgisselq
                usage();
941
                exit(-1);
942 9 dgisselq
        } else {
943
                for(int argn=1; argn<argc; argn++) {
944 27 dgisselq
                        if (argv[argn][0] == '-') {
945
                                switch(argv[argn][1]) {
946
                                case 'a':
947
                                        autorun = true;
948
                                        break;
949
                                case 'e':
950
                                        exit_on_done = true;
951
                                        break;
952
                                case 'h':
953
                                        usage();
954
                                        exit(0);
955
                                        break;
956
                                default:
957
                                        usage();
958
                                        exit(-1);
959
                                        break;
960
                                }
961
                        } else if (access(argv[argn], R_OK)==0) {
962 9 dgisselq
                                FILE *fp = fopen(argv[argn], "r");
963
                                if (fp == NULL) {
964
                                        printf("Cannot open %s\n", argv[argn]);
965
                                        perror("O/S Err: ");
966
                                        exit(-1);
967
                                } mptr += fread(&tb->m_mem[mptr], sizeof(ZIPI), tb->m_mem_size - mptr, fp);
968
                                fclose(fp);
969
                        }
970
                }
971
        }
972
 
973 27 dgisselq
        if (autorun) {
974
                bool    done = false;
975 2 dgisselq
 
976 27 dgisselq
                printf("Running in non-interactive mode\n");
977
                tb->reset();
978
                for(int i=0; i<2; i++)
979
                        tb->tick();
980
                tb->m_core->v__DOT__cmd_halt = 0;
981
                while(!done) {
982
                        tb->tick();
983
 
984
                                // tb->m_core->v__DOT__thecpu__DOT__step = 0;
985
                                // tb->m_core->v__DOT__cmd_halt = 0;
986
                                // tb->m_core->v__DOT__cmd_step = 0;
987
 
988 34 dgisselq
                        /*
989 27 dgisselq
                        printf("PC = %08x:%08x (%08x)\n",
990
                                tb->m_core->v__DOT__thecpu__DOT__ipc,
991
                                tb->m_core->v__DOT__thecpu__DOT__upc,
992
                                tb->m_core->v__DOT__thecpu__DOT__alu_pc);
993 34 dgisselq
                        */
994 27 dgisselq
 
995
                        done = (tb->test_success())||(tb->test_failure());
996
                }
997
        } else { // Interactive
998
                initscr();
999
                raw();
1000
                noecho();
1001
                keypad(stdscr, true);
1002
 
1003
                tb->reset();
1004
                for(int i=0; i<2; i++)
1005
                        tb->tick();
1006
                tb->m_core->v__DOT__cmd_halt = 0;
1007
 
1008
                int     chv = 'q';
1009
 
1010 2 dgisselq
                bool    done = false, halted = true, manual = true;
1011
 
1012
                halfdelay(1);
1013 27 dgisselq
                // tb->wb_write(CMD_REG, CMD_HALT | CMD_RESET);
1014 2 dgisselq
                // while((tb->wb_read(CMD_REG) & (CMD_HALT|CMD_STALL))==(CMD_HALT|CMD_STALL))
1015
                        // tb->show_state();
1016
 
1017
                while(!done) {
1018
                        chv = getch();
1019
                        switch(chv) {
1020
                        case 'h': case 'H':
1021
                                tb->wb_write(CMD_REG, CMD_HALT);
1022
                                if (!halted)
1023
                                        erase();
1024
                                halted = true;
1025
                                break;
1026
                        case 'g': case 'G':
1027
                                tb->wb_write(CMD_REG, 0);
1028
                                if (halted)
1029
                                        erase();
1030
                                halted = false;
1031
                                manual = false;
1032
                                break;
1033
                        case 'q': case 'Q':
1034
                                done = true;
1035
                                break;
1036
                        case 'r': case 'R':
1037
                                tb->wb_write(CMD_REG, CMD_RESET|CMD_HALT);
1038
                                halted = true;
1039
                                erase();
1040
                                break;
1041
                        case 's': case 'S':
1042 34 dgisselq
                                if (!halted)
1043 27 dgisselq
                                        erase();
1044 2 dgisselq
                                tb->wb_write(CMD_REG, CMD_STEP);
1045
                                manual = false;
1046 34 dgisselq
                                halted = true;
1047 2 dgisselq
                                break;
1048
                        case 't': case 'T':
1049 34 dgisselq
                                if ((!manual)||(halted))
1050 27 dgisselq
                                        erase();
1051 2 dgisselq
                                manual = true;
1052 34 dgisselq
                                halted = false;
1053 27 dgisselq
                //              tb->m_core->v__DOT__thecpu__DOT__step = 0;
1054
                //              tb->m_core->v__DOT__cmd_halt = 0;
1055
                //              tb->m_core->v__DOT__cmd_step = 0;
1056 2 dgisselq
                                tb->tick();
1057
                                break;
1058 34 dgisselq
                        case    KEY_IC: case KEY_ENTER: case KEY_RETURN:
1059
                                get_value(tb);
1060
                                break;
1061
                        case    KEY_UP:         tb->cursor_up();        break;
1062
                        case    KEY_DOWN:       tb->cursor_down();      break;
1063
                        case    KEY_LEFT:       tb->cursor_left();      break;
1064
                        case    KEY_RIGHT:      tb->cursor_right();     break;
1065
                        case ERR: case KEY_CLEAR:
1066 2 dgisselq
                        default:
1067
                                if (!manual)
1068
                                        tb->tick();
1069
                        }
1070
 
1071
                        if (manual) {
1072
                                tb->show_state();
1073
                        } else if (halted) {
1074
                                if (tb->dbg_fp)
1075
                                        fprintf(tb->dbg_fp, "\n\nREAD-STATE ******\n");
1076
                                tb->read_state();
1077
                        } else
1078
                                tb->show_state();
1079
 
1080
                        if (tb->m_core->i_rst)
1081
                                done =true;
1082
                        if (tb->bomb)
1083
                                done = true;
1084 27 dgisselq
 
1085
                        if (exit_on_done) {
1086
                                if (tb->test_success())
1087
                                        done = true;
1088
                                if (tb->test_failure())
1089
                                        done = true;
1090
                        }
1091 2 dgisselq
                }
1092 27 dgisselq
                endwin();
1093
        }
1094
#ifdef  MANUAL_STEPPING_MODE
1095
         else { // Manual stepping mode
1096 2 dgisselq
                tb->show_state();
1097
 
1098
                while('q' != tolower(chv = getch())) {
1099
                        tb->tick();
1100
                        tb->show_state();
1101
 
1102
                        if (tb->test_success())
1103
                                break;
1104
                        else if (tb->test_failure())
1105
                                break;
1106
                }
1107
        }
1108 27 dgisselq
#endif
1109 2 dgisselq
 
1110 27 dgisselq
        printf("Clocks used         : %08x\n", tb->m_core->v__DOT__mtc_data);
1111
        printf("Instructions Issued : %08x\n", tb->m_core->v__DOT__mic_data);
1112
        if (tb->m_core->v__DOT__mtc_data != 0)
1113
                printf("Instructions / Clock: %.2f\n",
1114
                        (double)tb->m_core->v__DOT__mic_data
1115
                        / (double)tb->m_core->v__DOT__mtc_data);
1116 2 dgisselq
        if (tb->test_success())
1117
                printf("SUCCESS!\n");
1118
        else if (tb->test_failure())
1119
                printf("TEST FAILED!\n");
1120 27 dgisselq
        else
1121
                printf("User quit\n");
1122 2 dgisselq
        exit(0);
1123
}
1124
 

powered by: WebSVN 2.1.0

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