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

Subversion Repositories zipcpu

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /zipcpu/trunk/bench/cpp
    from Rev 34 to Rev 36
    Reverse comparison

Rev 34 → Rev 36

/zippy_tb.cpp
55,12 → 55,13
#define CMD_DATA 1
#define CMD_HALT (1<<10)
#define CMD_STALL (1<<9)
#define CMD_STEP (1<<8)
#define CMD_INT (1<<7)
#define CMD_RESET (1<<6)
#define CMD_STEP ((1<<8)|CMD_HALT)
 
#define KEY_ESCAPE 27
#define KEY_RETURN 10
#define CTRL(X) ((X)&0x01f)
 
// No particular "parameters" need definition or redefinition here.
class ZIPPY_TB : public TESTB<Vzipsystem> {
73,9 → 74,13
int m_cursor;
 
ZIPPY_TB(void) : m_mem_size(1<<20), m_mem(m_mem_size) {
// dbg_fp = fopen("dbg.txt", "w");
dbg_fp = NULL;
dbg_flag = false;
if (true) {
dbg_fp = fopen("dbg.txt", "w");
dbg_flag = true;
} else {
dbg_fp = NULL;
dbg_flag = false;
}
bomb = false;
m_cursor = 0;
}
179,7 → 184,20
int ln= 0;
 
mvprintw(ln,0, "Peripherals-SS"); ln++;
printw(" %s",
// (m_core->v__DOT__thecpu__DOT__pf_illegal)?"PI":" ",
(m_core->v__DOT__thecpu__DOT__dcd_illegal)?"DI":" "
);
/*
printw(" %s%s%s",
(m_core->v__DOT__thecpu__DOT__ill_err)?"IL":" ",
(m_core->v__DOT__thecpu__DOT__dcd_early_branch)?"EB":" ",
(m_core->v__DOT__thecpu__DOT__dcd_early_branch_stb)?"S":" ",
(m_core->v__DOT__thecpu__DOT__dcd_early_branch_stb)?"S":" ",
);
*/
/*
showval(ln, 1, "TRAP", m_core->v__DOT__trap_data);
mvprintw(ln, 17, "%s%s",
((m_core->v__DOT__sys_cyc)
189,7 → 207,7
*/
showval(ln, 0, "PIC ", m_core->v__DOT__pic_data, (m_cursor==0));
showval(ln,20, "WDT ", m_core->v__DOT__watchdog__DOT__r_value, (m_cursor==1));
showval(ln,40, "CACH", m_core->v__DOT__manualcache__DOT__cache_base, (m_cursor==2));
// showval(ln,40, "CACH", m_core->v__DOT__manualcache__DOT__cache_base, (m_cursor==2));
showval(ln,60, "PIC2", m_core->v__DOT__ctri__DOT__r_int_state, (m_cursor==3));
 
ln++;
237,11 → 255,13
 
showreg(ln, 0, "sR12", 12, (m_cursor==24));
showreg(ln,20, "sSP ", 13, (m_cursor==25));
mvprintw(ln,40, "sCC :%s%s%s%s%s%s%s%s",
(m_core->v__DOT__thecpu__DOT__trap)?"TRP":" ",
(m_core->v__DOT__thecpu__DOT__step)?"STP":" ",
(m_core->v__DOT__thecpu__DOT__sleep)?"SLP":" ",
(m_core->v__DOT__thecpu__DOT__gie)?"GIE":" ",
mvprintw(ln,40, "%ssCC :%s%s%s%s%s%s%s%s%s",
(m_cursor==26)?">":" ",
(m_core->v__DOT__thecpu__DOT__trap)?"TP":" ",
(m_core->v__DOT__thecpu__DOT__break_en)?"BK":" ",
(m_core->v__DOT__thecpu__DOT__step)?"ST":" ",
(m_core->v__DOT__thecpu__DOT__sleep)?"SL":" ",
(m_core->v__DOT__thecpu__DOT__gie)?"IE":" ",
(m_core->v__DOT__thecpu__DOT__iflags&8)?"V":" ",
(m_core->v__DOT__thecpu__DOT__iflags&4)?"N":" ",
(m_core->v__DOT__thecpu__DOT__iflags&2)?"C":" ",
285,13 → 305,16
attroff(A_BOLD);
ln+=1;
 
mvprintw(ln, 0, "PFPIPE: rda=%08x/%d, bas=%08x, off=%08x, nv=%03x, ackw=%d",
mvprintw(ln, 0, "PFPIPE: rda=%08x/%d, bas=%08x, off=%08x, nv=%03x, ackw=%d,%d%d,%04x",
m_core->v__DOT__thecpu__DOT__pf__DOT__r_addr,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cv,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cache_base,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cache_offset,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_nvalid,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_acks_waiting);
m_core->v__DOT__thecpu__DOT__pf__DOT__r_acks_waiting,
m_core->v__DOT__thecpu__DOT__pf__DOT__w_cv,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_cv,
m_core->v__DOT__thecpu__DOT__pf__DOT__r_addr&0x0ffff);
ln++;
mvprintw(ln, 0, "PF BUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
(m_core->v__DOT__thecpu__DOT__pf_cyc)?"CYC":" ",
300,20 → 323,23
(m_core->v__DOT__thecpu__DOT__pf_addr),
0, // (m_core->v__DOT__thecpu__DOT__pf_data),
(m_core->v__DOT__thecpu__DOT__pf_ack)?"ACK":" ",
(m_core->v__DOT__cpu_stall)?"STL":" ",
(m_core->v__DOT__thecpu__DOT__pf_stall)?"STL":" ",
(m_core->v__DOT__wb_data)); ln++;
 
mvprintw(ln, 0, "MEMBUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
(m_core->v__DOT__thecpu__DOT__mem_cyc)?"CYC":" ",
(m_core->v__DOT__thecpu__DOT__mem_stb)?"STB":" ",
(m_core->v__DOT__thecpu__DOT__mem_cyc_gbl)?"GCY"
:((m_core->v__DOT__thecpu__DOT__mem_cyc_lcl)?"LCY":" "),
(m_core->v__DOT__thecpu__DOT__mem_stb_gbl)?"GSB"
:((m_core->v__DOT__thecpu__DOT__mem_stb_lcl)?"LSB":" "),
(m_core->v__DOT__thecpu__DOT__mem_we )?"WE":" ",
(m_core->v__DOT__thecpu__DOT__mem_addr),
(m_core->v__DOT__thecpu__DOT__mem_data),
(m_core->v__DOT__thecpu__DOT__mem_ack)?"ACK":" ",
(m_core->v__DOT__cpu_stall)?"STL":" ",
(m_core->v__DOT__thecpu__DOT__mem_stall)?"STL":" ",
(m_core->v__DOT__thecpu__DOT__mem_result)); ln++;
 
mvprintw(ln, 0, "SYSBUS: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
mvprintw(ln, 0, "SYSBS%c: %3s %3s %s @0x%08x[0x%08x] -> %s %s %08x",
(m_core->v__DOT__thecpu__DOT__pformem__DOT__r_a_owner)?'M':'P',
(m_core->o_wb_cyc)?"CYC":" ",
(m_core->o_wb_stb)?"STB":" ",
(m_core->o_wb_we )?"WE":" ",
329,8 → 355,8
//m_core->v__DOT__thecpu__DOT__instruction_gie,
m_core->v__DOT__thecpu__DOT__gie,
0,
// m_core->v__DOT__thecpu__DOT__instruction_pc); ln++;
m_core->v__DOT__thecpu__DOT__pf_pc); ln++;
m_core->v__DOT__thecpu__DOT__instruction_pc); ln++;
// m_core->v__DOT__thecpu__DOT__pf_pc); ln++;
 
showins(ln, "Dc",
m_core->v__DOT__thecpu__DOT__dcd_ce,
454,7 → 480,7
} ln++;
showval(ln, 0, "PIC ", cmd_read(32+ 0), (m_cursor==0));
showval(ln,20, "WDT ", cmd_read(32+ 1), (m_cursor==1));
showval(ln,40, "CACH", cmd_read(32+ 2), (m_cursor==2));
// showval(ln,40, "CACH", cmd_read(32+ 2), (m_cursor==2));
showval(ln,60, "PIC2", cmd_read(32+ 3), (m_cursor==3));
ln++;
showval(ln, 0, "TMRA", cmd_read(32+ 4), (m_cursor==4));
499,9 → 525,10
dispreg(ln, 0, "sR12", cmd_read(12), (m_cursor==24));
dispreg(ln,20, "sSP ", cmd_read(13), (m_cursor==25));
 
mvprintw(ln,40, "%ssCC :%s%s%s%s%s%s%s%s",
mvprintw(ln,40, "%ssCC :%s%s%s%s%s%s%s%s%s",
(m_cursor==26)?">":" ",
(cc & 0x100)?"TP":" ",
(cc & 0x200)?"TP":" ",
(cc & 0x080)?"BK":" ",
(cc & 0x040)?"ST":" ",
(cc & 0x020)?"IE":" ",
(cc & 0x010)?"SL":" ",
536,7 → 563,7
dispreg(ln,20, "uSP ", cmd_read(29), (m_cursor==41));
cc = cmd_read(30);
mvprintw(ln,40, "%cuCC :%s%s%s%s%s%s%s%s",
(m_cursor == 42)?">":" ",
(m_cursor == 42)?'>':' ',
(cc&0x100)?"TP":" ",
(cc&0x040)?"ST":" ",
(cc&0x020)?"IE":" ",
592,14 → 619,11
int stb = m_core->o_wb_stb;
if ((m_core->o_wb_addr & (-1<<20))!=1)
stb = 0;
m_mem(m_core->o_wb_cyc, m_core->o_wb_stb, m_core->o_wb_we,
m_core->o_wb_addr & ((1<<20)-1), m_core->o_wb_data,
m_core->i_wb_ack, m_core->i_wb_stall,m_core->i_wb_data);
if ((m_core->o_wb_cyc)&&(m_core->o_wb_stb)&&(!stb))
m_core->i_wb_ack = 1;
 
if ((dbg_flag)&&(dbg_fp)) {
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",
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%s\n",
(m_core->i_dbg_cyc)?"CYC":" ",
(m_core->i_dbg_stb)?"STB":
((m_core->v__DOT__dbg_stb)?"DBG":" "),
614,7 → 638,8
(m_core->v__DOT__thecpu__DOT__dcdvalid)?"DCDV ":"",
(m_core->v__DOT__thecpu__DOT__opvalid)?"OPV ":"",
(m_core->v__DOT__thecpu__DOT__pf_cyc)?"PCYC ":"",
(m_core->v__DOT__thecpu__DOT__mem_cyc)?"MCYC ":"",
(m_core->v__DOT__thecpu__DOT__mem_cyc_gbl)?"GC":" ",
(m_core->v__DOT__thecpu__DOT__mem_cyc_lcl)?"LC":" ",
(m_core->v__DOT__thecpu__DOT__alu_wr)?"ALUW ":"",
(m_core->v__DOT__thecpu__DOT__alu_ce)?"ALCE ":"",
(m_core->v__DOT__thecpu__DOT__alu_valid)?"ALUV ":"",
672,9 → 697,19
m_core->v__DOT__thecpu__DOT__mem_valid,
m_core->v__DOT__thecpu__DOT__w_iflags,
m_core->v__DOT__thecpu__DOT__w_uflags);
fprintf(dbg_fp, "\tbrk=%d,%d\n",
fprintf(dbg_fp, "\tbrk=%s %d,%d\n",
(m_core->v__DOT__thecpu__DOT__master_ce)?"CE":" ",
m_core->v__DOT__thecpu__DOT__break_en,
m_core->v__DOT__thecpu__DOT__op_break);
} else if ((dbg_fp)&&
((m_core->v__DOT__thecpu__DOT__op_break)
||(m_core->v__DOT__thecpu__DOT__dcd_break))) {
fprintf(dbg_fp, "NOT SWITCHING TO GIE (gie = %d)\n", gie);
fprintf(dbg_fp, "\tbrk=%s breaken=%d,dcdbreak=%d,opbreak=%d\n",
(m_core->v__DOT__thecpu__DOT__master_ce)?"CE":" ",
m_core->v__DOT__thecpu__DOT__break_en,
m_core->v__DOT__thecpu__DOT__dcd_break,
m_core->v__DOT__thecpu__DOT__op_break);
}
 
if (dbg_fp) {
684,7 → 719,26
fprintf(dbg_fp, "\tNew PC\n");
}
 
TESTB<Vzipsystem>::tick();
if (dbg_fp)
fprintf(dbg_fp, "----------- TICK ----------\n");
if (false) {
m_core->i_clk = 1;
m_mem(m_core->i_clk, m_core->o_wb_cyc, m_core->o_wb_stb, m_core->o_wb_we,
m_core->o_wb_addr & ((1<<20)-1), m_core->o_wb_data,
m_core->i_wb_ack, m_core->i_wb_stall,m_core->i_wb_data);
eval();
m_core->i_clk = 0;
m_mem(m_core->i_clk, m_core->o_wb_cyc, m_core->o_wb_stb, m_core->o_wb_we,
m_core->o_wb_addr & ((1<<20)-1), m_core->o_wb_data,
m_core->i_wb_ack, m_core->i_wb_stall,m_core->i_wb_data);
eval();
m_tickcount++;
} else {
m_mem(1, m_core->o_wb_cyc, m_core->o_wb_stb, m_core->o_wb_we,
m_core->o_wb_addr & ((1<<20)-1), m_core->o_wb_data,
m_core->i_wb_ack, m_core->i_wb_stall,m_core->i_wb_data);
TESTB<Vzipsystem>::tick();
}
if ((dbg_fp)&&(gie != m_core->v__DOT__thecpu__DOT__gie)) {
fprintf(dbg_fp, "SWITCH FROM %s to %s: sPC = 0x%08x uPC = 0x%08x pf_pc = 0x%08x\n",
(gie)?"User":"Supervisor",
716,10 → 770,12
bool test_failure(void) {
return ((m_core->v__DOT__thecpu__DOT__alu_pc_valid)
&&(m_mem[m_core->v__DOT__thecpu__DOT__alu_pc-1]
== 0x2f0f7fff));
== 0x2f0f7fff)
&&(!m_core->v__DOT__thecpu__DOT__clear_pipeline));
}
 
void wb_write(unsigned a, unsigned int v) {
int errcount = 0;
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_write(%d,%x)", a, v);
m_core->i_dbg_cyc = 1;
729,11 → 785,11
m_core->i_dbg_data = v;
 
tick();
while(m_core->o_dbg_stall)
while((errcount++ < 100)&&(m_core->o_dbg_stall))
tick();
 
m_core->i_dbg_stb = 0;
while(!m_core->o_dbg_ack)
while((errcount++ < 100)&&(!m_core->o_dbg_ack))
tick();
 
// Release the bus
742,10 → 798,15
tick();
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_write -- complete");
 
 
if (errcount >= 100)
bomb = true;
}
 
unsigned long wb_read(unsigned a) {
unsigned int v;
int errcount = 0;
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_read(0x%08x)", a);
m_core->i_dbg_cyc = 1;
754,11 → 815,11
m_core->i_dbg_addr = a & 1;
 
tick();
while(m_core->o_dbg_stall)
while((errcount++<100)&&(m_core->o_dbg_stall))
tick();
 
m_core->i_dbg_stb = 0;
while(!m_core->o_dbg_ack)
while((errcount++<100)&&(!m_core->o_dbg_ack))
tick();
v = m_core->o_dbg_data;
 
770,6 → 831,8
mvprintw(0,35, "%40s", "");
mvprintw(0,40, "wb_read = 0x%08x", v);
 
if (errcount >= 100)
bomb = true;
return v;
}
 
824,6 → 887,7
case KEY_LEFT: case KEY_BACKSPACE:
if (pos > 0) pos--;
break;
case CTRL('L'): redrawwin(stdscr); break;
case KEY_CLEAR:
pos = 0;
break;
889,7 → 953,7
break;
case 32: tb->m_core->v__DOT__pic_data = v; break;
case 33: tb->m_core->v__DOT__watchdog__DOT__r_value = v; break;
case 34: tb->m_core->v__DOT__manualcache__DOT__cache_base = v; break;
// case 34: tb->m_core->v__DOT__manualcache__DOT__cache_base = v; break;
case 35: tb->m_core->v__DOT__ctri__DOT__r_int_state = v; break;
case 36: tb->m_core->v__DOT__timer_a__DOT__r_value = v; break;
case 37: tb->m_core->v__DOT__timer_b__DOT__r_value = v; break;
931,7 → 995,7
int main(int argc, char **argv) {
Verilated::commandArgs(argc, argv);
ZIPPY_TB *tb = new ZIPPY_TB();
bool autorun = false, exit_on_done = false;
bool autorun = false, exit_on_done = false, autostep=false;
 
// mem[0x00000] = 0xbe000010; // Halt instruction
unsigned int mptr = 0;
953,6 → 1017,9
usage();
exit(0);
break;
case 's':
autostep = true;
break;
default:
usage();
exit(-1);
994,6 → 1061,15
 
done = (tb->test_success())||(tb->test_failure());
}
} else if (autostep) {
bool done = false;
 
printf("Running in non-interactive mode, via step commands\n");
tb->wb_write(CMD_REG, CMD_HALT|CMD_RESET);
while(!done) {
tb->wb_write(CMD_REG, CMD_STEP);
done = (tb->test_success())||(tb->test_failure());
}
} else { // Interactive
initscr();
raw();
1034,7 → 1110,10
done = true;
break;
case 'r': case 'R':
tb->wb_write(CMD_REG, CMD_RESET|CMD_HALT);
if (manual)
tb->reset();
else
tb->wb_write(CMD_REG, CMD_RESET|CMD_HALT);
halted = true;
erase();
break;
1062,6 → 1141,7
case KEY_DOWN: tb->cursor_down(); break;
case KEY_LEFT: tb->cursor_left(); break;
case KEY_RIGHT: tb->cursor_right(); break;
case CTRL('L'): redrawwin(stdscr); break;
case ERR: case KEY_CLEAR:
default:
if (!manual)
1113,12 → 1193,18
printf("Instructions / Clock: %.2f\n",
(double)tb->m_core->v__DOT__mic_data
/ (double)tb->m_core->v__DOT__mtc_data);
if (tb->test_success())
 
int rcode = 0;
if (tb->bomb) {
printf("TEST BOMBED\n");
rcode = -1;
} else if (tb->test_success()) {
printf("SUCCESS!\n");
else if (tb->test_failure())
} else if (tb->test_failure()) {
rcode = -2;
printf("TEST FAILED!\n");
else
} else
printf("User quit\n");
exit(0);
exit(rcode);
}
 
/testb.h
50,10 → 50,10
}
 
virtual void tick(void) {
m_core->i_clk = 1;
eval();
m_core->i_clk = 0;
eval();
m_core->i_clk = 1;
eval();
 
m_tickcount++;
}
63,7 → 63,7
tick();
m_core->i_rst = 0;
m_tickcount = 0l;
printf("RESET\n");
// printf("RESET\n");
}
};
 
/memsim.cpp
79,11 → 79,11
m_mem[nr] = 0l;
}
 
void MEMSIM::apply(const unsigned char wb_cyc,
void MEMSIM::apply(const unsigned int clk, const unsigned char wb_cyc,
const unsigned char wb_stb, const unsigned char wb_we,
const BUSW wb_addr, const BUSW wb_data,
unsigned char &o_ack, unsigned char &o_stall, BUSW &o_data) {
if ((wb_cyc)&&(wb_stb)) {
if ((wb_cyc)&&(wb_stb)&&(clk)) {
if (wb_we)
m_mem[wb_addr & m_mask] = wb_data;
o_ack = 1;
95,7 → 95,7
(wb_we)?"WRITE":"READ",
wb_addr, o_data);
*/
} else {
} else if (clk) {
o_ack = 0;
o_stall = 0;
}
/Makefile
45,11 → 45,21
LIBS := $(RAWLIB) -lncurses
TESTF := ../../sw/zasm/z.out
 
zippy_tb: $(SOURCES) $(RAWLIB) $(ZASM)/zopcodes.h $(ZASM)/zparser.h
zippy_tb: $(SOURCES) $(RAWLIB) $(ZASM)/zopcodes.h $(ZASM)/zparser.h testb.h
$(CXX) $(FLAGS) $(INCS) $(SOURCES) $(LIBS) -o $@
 
.PHONY: stest
stest: zippy_tb
./zippy_tb -s $(TESTF)
 
.PHONY: itest
itest: zippy_tb
./zippy_tb $(TESTF)
 
test: zippy_tb
.PHONY: test
test: zippy_tb stest
./zippy_tb -a $(TESTF)
 
.PHONY: clean
clean:
rm ./zippy_tb
/memsim.h
51,13 → 51,14
MEMSIM(const unsigned int nwords);
~MEMSIM(void);
void load(const char *fname);
void apply(const uchar wb_cyc, const uchar wb_stb, const uchar wb_we,
void apply(const unsigned clk, const uchar wb_cyc, const uchar wb_stb,
const uchar wb_we,
const BUSW wb_addr, const BUSW wb_data,
uchar &o_ack, uchar &o_stall, BUSW &o_data);
void operator()(const uchar wb_cyc, const uchar wb_stb, const uchar wb_we,
void operator()(const unsigned clk, const uchar wb_cyc, const uchar wb_stb, const uchar wb_we,
const BUSW wb_addr, const BUSW wb_data,
uchar &o_ack, uchar &o_stall, BUSW &o_data) {
apply(wb_cyc, wb_stb, wb_we, wb_addr, wb_data, o_ack, o_stall, o_data);
apply(clk, wb_cyc, wb_stb, wb_we, wb_addr, wb_data, o_ack, o_stall, o_data);
}
BUSW &operator[](const BUSW addr) { return m_mem[addr&m_mask]; }
};

powered by: WebSVN 2.1.0

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