📄 main_spy.cpp
字号:
/* * TU Eindhoven * Eindhoven, The Netherlands * * Name : * * Author : Sander Stuijk (sander@ics.ele.tue.nl) * * Date : November 18, 2002 * * Function : Pipelined mMIPS * * History : * 18-11-02 : Initial version. * - lw, sw, beq, add, addu, subu, * - and, or, slt * 19-11-02 : - xor, sltu * - addiu, andi, ori, xori, slti, sltiu * - lui, bne * - sll, srl, sra (1, 2, 8 bits) * - sb, lb * 21-11-02 : - j, jal, jalr, jr * 13-12-02 : Synthesizable version A.S.Slusarczyk@tue.nl */ #include "top.h"#define NOVCD 1#define NOMEMVCD 1// global signalssc_signal<bool> clk;unsigned sim_time = 0, period = 20;sc_signal< sc_lv<5> > commin;sc_signal< sc_lv<4> > commo;sc_signal< sc_lv<4> > commi;// helper routines to communicate with SPYvoid READ( unsigned _addr, int w = 64 );void WRITE( unsigned _addr );void SEND( unsigned v );unsigned RCV( );void TICK( int t );// it is advisable to only read/write resolved signals from within// a process, therefore the following modules are created:// a module to write to bidirectional resolved signalSC_MODULE(W){ sc_in< sc_lv<4> > nrvi; sc_inout_rv<4> rv; SC_CTOR(W){ SC_METHOD(w); sensitive << nrvi; } void w(){ // cout << sc_time_stamp() << " W " << nrvi.read() << endl; rv.write(nrvi.read()); }};// a module to read from bidirectional resolved signalSC_MODULE(R){ sc_in_rv<4> rv; sc_out< sc_lv<4> > nrvo; SC_CTOR(R){ SC_METHOD(r); sensitive << rv; } void r(){ // cout << sc_time_stamp() << " R " << rv.read() << endl; nrvo.write(rv.read()); }};// // MAIN//int sc_main(int argc, char *argv[]){ char stbuf[32]; // the processor mMIPS mips("mips"); sc_signal< bool > rst, en; mips.clock(clk); mips.reset(rst); mips.enable(en); // PC for display sc_signal< sc_bv<DWORD> > bus_pc; mips.bus_pc(bus_pc); #ifdef SPYING // control input to SPY_COMM mips.commin(commin); // SPY control signals mips.spy_reset(rst); mips.spy_clock(clk); // some signals to display the state of communication sc_signal<CTL_STATE> ctl_state; sc_signal< sc_uint<4> > sr_nibble; mips.ctl_state(ctl_state); mips.sr_nibble(sr_nibble); // setup the bidirectional connection sc_signal_rv<4> _comminout; R r("r"); W w("w"); // write to bidir by writing commi w.nrvi( commi ); // read from bidir by reading commo r.nrvo( commo ); r.rv( _comminout ); w.rv( _comminout ); mips.comminout(_comminout);#endif /* * Initialization */ mips.imem->rom_init("mips_rom.bin"); mips.imem->rom_dump("mips_rom.0.dump"); mips.dmem->ram_init("mips_ram.bin"); mips.dmem->ram_dump("mips_ram.0.dump");#ifndef NOVCD /* * Tracing */ sc_trace_file *tf; tf = sc_create_vcd_trace_file("mips"); // Signals sc_trace(tf, clk, "clock"); sc_trace(tf, rst, "reset"); sc_trace(tf, en, "enable"); sc_trace(tf, mips.bus_add1, "bus_add1"); sc_trace(tf, mips.bus_add2, "bus_add2"); sc_trace(tf, mips.bus_aluctrl, "bus_aluctrl"); sc_trace(tf, mips.bus_alu_result, "bus_alu_result"); sc_trace(tf, mips.bus_alu_zero, "bus_alu_zero"); sc_trace(tf, mips.bus_branch, "bus_branch"); sc_trace(tf, mips.bus_ctrl2hazard_aluop, "bus_ctrl2hazard_aluop"); sc_trace(tf, mips.bus_ctrl2hazard_alusrc, "bus_ctrl2hazard_alusrc"); sc_trace(tf, mips.bus_ctrl2hazard_branch, "bus_ctrl2hazard_branch"); sc_trace(tf, mips.bus_ctrl2hazard_memread, "bus_ctrl2hazard_memread"); sc_trace(tf, mips.bus_ctrl2hazard_memtoreg, "bus_ctrl2hazard_memtoreg"); sc_trace(tf, mips.bus_ctrl2hazard_memwrite, "bus_ctrl2hazard_memwrite"); sc_trace(tf, mips.bus_ctrl2hazard_regdst, "bus_ctrl2hazard_regdst"); sc_trace(tf, mips.bus_ctrl2hazard_regvalue, "bus_ctrl2hazard_regvalue"); sc_trace(tf, mips.bus_ctrl2hazard_regwrite, "bus_ctrl2hazard_regwrite"); sc_trace(tf, mips.bus_ctrl2hazard_target, "bus_ctrl2hazard_target"); sc_trace(tf, mips.bus_ctrl_aluop, "bus_ctrl_aluop"); sc_trace(tf, mips.bus_ctrl_alusrc, "bus_ctrl_alusrc"); sc_trace(tf, mips.bus_ctrl_branch, "bus_ctrl_branch"); sc_trace(tf, mips.bus_ctrl_c1, "bus_ctrl_c1"); sc_trace(tf, mips.bus_ctrl_c31, "bus_ctrl_c31"); sc_trace(tf, mips.bus_ctrl_c4, "bus_ctrl_c4"); sc_trace(tf, mips.bus_ctrl_memread, "bus_ctrl_memread"); sc_trace(tf, mips.bus_ctrl_memtoreg, "bus_ctrl_memtoreg"); sc_trace(tf, mips.bus_ctrl_memwrite, "bus_ctrl_memwrite"); sc_trace(tf, mips.bus_ctrl_regdst, "bus_ctrl_regdst"); sc_trace(tf, mips.bus_ctrl_regvalue, "bus_ctrl_regvalue"); sc_trace(tf, mips.bus_ctrl_regwrite, "bus_ctrl_regwrite"); sc_trace(tf, mips.bus_ctrl_target, "bus_ctrl_target"); sc_trace(tf, mips.bus_ctrl_enable, "bus_ctrl_enable"); sc_trace(tf, mips.bus_decoder_instr_10_6, "bus_decoder_instr_10_6"); sc_trace(tf, mips.bus_decoder_instr_15_0, "bus_decoder_instr_15_0"); sc_trace(tf, mips.bus_decoder_instr_15_11, "bus_decoder_instr_15_11"); sc_trace(tf, mips.bus_decoder_instr_20_16, "bus_decoder_instr_20_16"); sc_trace(tf, mips.bus_decoder_instr_25_0, "bus_decoder_instr_25_0"); sc_trace(tf, mips.bus_decoder_instr_25_21, "bus_decoder_instr_25_21"); sc_trace(tf, mips.bus_decoder_instr_31_26, "bus_decoder_instr_31_26"); sc_trace(tf, mips.bus_decoder_instr_5_0, "bus_decoder_instr_5_0"); sc_trace(tf, mips.bus_dmem_1, "bus_dmem_1"); sc_trace(tf, mips.bus_ex_add_result, "bus_ex_add_result"); sc_trace(tf, mips.bus_ex_alu_result, "bus_ex_alu_result"); sc_trace(tf, mips.bus_ex_alu_zero, "bus_ex_alu_zero"); sc_trace(tf, mips.bus_ex_ctrl_mem_branch, "bus_ex_ctrl_mem_branch"); #ifndef BRAM sc_trace(tf, mips.bus_ex_ctrl_mem_memread, "bus_ex_ctrl_mem_memread"); sc_trace(tf, mips.bus_ex_ctrl_mem_memwrite, "bus_ex_ctrl_mem_memwrite"); #endif sc_trace(tf, mips.bus_ex_ctrl_wb_memtoreg, "bus_ex_ctrl_wb_memtoreg"); sc_trace(tf, mips.bus_ex_ctrl_wb_regwrite, "bus_ex_ctrl_wb_regwrite"); #ifndef BRAM sc_trace(tf, mips.bus_ex_data_reg2, "bus_ex_data_reg2"); #endif sc_trace(tf, mips.bus_ex_regdst_addr, "bus_ex_regdst_addr"); sc_trace(tf, mips.bus_hazard_hazard, "bus_hazard_hazard"); sc_trace(tf, mips.bus_hazard_ifidwrite, "bus_hazard_ifidwrite"); sc_trace(tf, mips.bus_hazard_pcwrite, "bus_hazard_pcwrite"); sc_trace(tf, mips.bus_id_ctrl_ex_aluop, "bus_id_ctrl_ex_aluop"); sc_trace(tf, mips.bus_id_ctrl_ex_alusrc, "bus_id_ctrl_ex_alusrc"); sc_trace(tf, mips.bus_id_ctrl_ex_regdst, "bus_id_ctrl_ex_regdst"); sc_trace(tf, mips.bus_id_ctrl_ex_regvalue, "bus_id_ctrl_ex_regvalue"); sc_trace(tf, mips.bus_id_ctrl_ex_target, "bus_id_ctrl_ex_target"); sc_trace(tf, mips.bus_id_ctrl_mem_branch, "bus_id_ctrl_mem_branch"); sc_trace(tf, mips.bus_id_ctrl_mem_memread, "bus_id_ctrl_mem_memread"); sc_trace(tf, mips.bus_id_ctrl_mem_memwrite, "bus_id_ctrl_mem_memwrite"); sc_trace(tf, mips.bus_id_ctrl_wb_memtoreg, "bus_id_ctrl_wb_memtoreg"); sc_trace(tf, mips.bus_id_ctrl_wb_regwrite, "bus_id_ctrl_wb_regwrite"); sc_trace(tf, mips.bus_id_data_reg1, "bus_id_data_reg1"); sc_trace(tf, mips.bus_id_data_reg2, "bus_id_data_reg2"); sc_trace(tf, mips.bus_id_instr_15_11, "bus_id_instr_15_11"); sc_trace(tf, mips.bus_id_instr_20_16, "bus_id_instr_20_16"); sc_trace(tf, mips.bus_id_instr_25_0, "bus_id_instr_25_0"); sc_trace(tf, mips.bus_id_instr_5_0, "bus_id_instr_5_0"); sc_trace(tf, mips.bus_id_pc, "bus_id_pc"); sc_trace(tf, mips.bus_id_signextend, "bus_id_signextend"); sc_trace(tf, mips.bus_if_instr, "bus_if_instr"); sc_trace(tf, mips.bus_if_pc, "bus_if_pc"); sc_trace(tf, mips.bus_imem_1, "bus_imem_1"); sc_trace(tf, mips.bus_mem_alu_result, "bus_mem_alu_result"); sc_trace(tf, mips.bus_mem_ctrl_wb_memtoreg, "bus_mem_ctrl_wb_memtoreg"); sc_trace(tf, mips.bus_mem_ctrl_wb_regwrite, "bus_mem_ctrl_wb_regwrite"); sc_trace(tf, mips.bus_mem_dmem_data, "bus_mem_dmem_data"); sc_trace(tf, mips.bus_mem_regdst_addr, "bus_mem_regdst_addr"); sc_trace(tf, mips.bus_mux1, "bus_mux1"); sc_trace(tf, mips.bus_mux2, "bus_mux2"); sc_trace(tf, mips.bus_mux3, "bus_mux3"); sc_trace(tf, mips.bus_mux4, "bus_mux4"); sc_trace(tf, mips.bus_mux5, "bus_mux5"); sc_trace(tf, mips.bus_mux6, "bus_mux6"); sc_trace(tf, mips.bus_pc, "bus_pc"); sc_trace(tf, mips.bus_registers_1, "bus_registers_1"); sc_trace(tf, mips.bus_registers_2, "bus_registers_2"); sc_trace(tf, mips.bus_shiftleft, "bus_shiftleft"); sc_trace(tf, mips.bus_shiftleft_jmp, "bus_shiftleft_jmp"); sc_trace(tf, mips.bus_signextend, "bus_signextend"); sc_trace(tf, mips.bus_signextendbyte, "bus_signextendbyte");#ifndef BREG for (int i = 0; i < REGSIZE; i++) { sprintf(stbuf, "registers.reg(%d)", i); sc_trace(tf, mips.registers->rfile[i], stbuf); }#else sc_trace(tf, mips.bus_decoder_nb_instr_20_16, "bus_decoder_nb_instr_20_16"); sc_trace(tf, mips.bus_decoder_nb_instr_25_21, "bus_decoder_nb_instr_25_21");#ifndef NOMEMVCD for (int i = 0; i < REGSIZE; i++) { sprintf(stbuf, "registers.reg(%d_1h)", i); sc_trace(tf, mips.registers->regs1->bramh->memory[i], stbuf); sprintf(stbuf, "registers.reg(%d_1l)", i); sc_trace(tf, mips.registers->regs1->braml->memory[i], stbuf); sprintf(stbuf, "registers.reg(%d_2h)", i); sc_trace(tf, mips.registers->regs2->bramh->memory[i], stbuf); sprintf(stbuf, "registers.reg(%d_2l)", i); sc_trace(tf, mips.registers->regs2->braml->memory[i], stbuf); } sc_trace(tf, mips.registers->regs1->DOAH,"registers1.DOAH");sc_trace(tf, mips.registers->regs1->DOAL,"registers1.DOAL"); sc_trace(tf, mips.registers->regs1->ADDRAH,"registers1.ADDRAH");sc_trace(tf, mips.registers->regs1->ADDRAL,"registers1.ADDRAL"); sc_trace(tf, mips.registers->regs1->DIAH,"registers1.DIAH");sc_trace(tf, mips.registers->regs1->DIAL,"registers1.DIAL"); sc_trace(tf, mips.registers->regs1->ENAH,"registers1.ENAH");sc_trace(tf, mips.registers->regs1->ENAL,"registers1.ENAL"); sc_trace(tf, mips.registers->regs1->WEAH,"registers1.WEAH");sc_trace(tf, mips.registers->regs1->WEAL,"registers1.WEAL"); sc_trace(tf, mips.registers->regs1->CLKAH,"registers1.CLKAH");sc_trace(tf, mips.registers->regs1->CLKAL,"registers1.CALKAL"); sc_trace(tf, mips.registers->regs1->RSTAH,"registers1.RSTAH");sc_trace(tf, mips.registers->regs1->RSTAL,"registers1.RSTAL"); sc_trace(tf, mips.registers->regs1->DOBH,"registers1.DOBH");sc_trace(tf, mips.registers->regs1->DOBL,"registers1.DOBL"); sc_trace(tf, mips.registers->regs1->ADDRBH,"registers1.ADDRBH");sc_trace(tf, mips.registers->regs1->ADDRBL,"registers1.ADDRBL"); sc_trace(tf, mips.registers->regs1->DIBH,"registers1.DIBH");sc_trace(tf, mips.registers->regs1->DIBL,"registers1.DIBL"); sc_trace(tf, mips.registers->regs1->ENBH,"registers1.ENBH");sc_trace(tf, mips.registers->regs1->ENBL,"registers1.ENBL"); sc_trace(tf, mips.registers->regs1->WEBH,"registers1.WEBH");sc_trace(tf, mips.registers->regs1->WEBL,"registers1.WEBL"); sc_trace(tf, mips.registers->regs1->CLKBH,"registers1.CLKBH");sc_trace(tf, mips.registers->regs1->CLKBL,"registers1.CBLKBL"); sc_trace(tf, mips.registers->regs1->RSTBH,"registers1.RSTBH");sc_trace(tf, mips.registers->regs1->RSTBL,"registers1.RSTBL"); sc_trace(tf, mips.registers->regs2->DOAH,"registers2.DOAH");sc_trace(tf, mips.registers->regs2->DOAL,"registers2.DOAL"); sc_trace(tf, mips.registers->regs2->ADDRAH,"registers2.ADDRAH");sc_trace(tf, mips.registers->regs2->ADDRAL,"registers2.ADDRAL"); sc_trace(tf, mips.registers->regs2->DIAH,"registers2.DIAH");sc_trace(tf, mips.registers->regs2->DIAL,"registers2.DIAL"); sc_trace(tf, mips.registers->regs2->ENAH,"registers2.ENAH");sc_trace(tf, mips.registers->regs2->ENAL,"registers2.ENAL"); sc_trace(tf, mips.registers->regs2->WEAH,"registers2.WEAH");sc_trace(tf, mips.registers->regs2->WEAL,"registers2.WEAL"); sc_trace(tf, mips.registers->regs2->CLKAH,"registers2.CLKAH");sc_trace(tf, mips.registers->regs2->CLKAL,"registers2.CALKAL"); sc_trace(tf, mips.registers->regs2->RSTAH,"registers2.RSTAH");sc_trace(tf, mips.registers->regs2->RSTAL,"registers2.RSTAL"); sc_trace(tf, mips.registers->regs2->DOBH,"registers2.DOBH");sc_trace(tf, mips.registers->regs2->DOBL,"registers2.DOBL"); sc_trace(tf, mips.registers->regs2->ADDRBH,"registers2.ADDRBH");sc_trace(tf, mips.registers->regs2->ADDRBL,"registers2.ADDRBL"); sc_trace(tf, mips.registers->regs2->DIBH,"registers2.DIBH");sc_trace(tf, mips.registers->regs2->DIBL,"registers2.DIBL"); sc_trace(tf, mips.registers->regs2->ENBH,"registers2.ENBH");sc_trace(tf, mips.registers->regs2->ENBL,"registers2.ENBL"); sc_trace(tf, mips.registers->regs2->WEBH,"registers2.WEBH");sc_trace(tf, mips.registers->regs2->WEBL,"registers2.WEBL"); sc_trace(tf, mips.registers->regs2->CLKBH,"registers2.CLKBH");sc_trace(tf, mips.registers->regs2->CLKBL,"registers2.CBLKBL"); sc_trace(tf, mips.registers->regs2->RSTBH,"registers2.RSTBH");sc_trace(tf, mips.registers->regs2->RSTBL,"registers2.RSTBL");#endif #endif#ifndef BRAM for (int i = 0; i < RAMSIZE; i++) { sprintf(stbuf, "memory.dmem(%d)", i); sc_trace(tf, mips.dmem->ramfile[i], stbuf); }#else#ifndef NOMEMVCD for (int i = 0; i < RAMSIZE ; i+=4) { sprintf(stbuf, "memory.dmem(%d)", i); sc_trace(tf, mips.dmem->bram0->memory[i/4], stbuf); sprintf(stbuf, "memory.dmem(%d)", i+1); sc_trace(tf, mips.dmem->bram1->memory[i/4], stbuf); sprintf(stbuf, "memory.dmem(%d)", i+2); sc_trace(tf, mips.dmem->bram2->memory[i/4], stbuf); sprintf(stbuf, "memory.dmem(%d)", i+3); sc_trace(tf, mips.dmem->bram3->memory[i/4], stbuf); } sc_trace(tf, mips.dmem->DO1,"dmem.DO1");sc_trace(tf, mips.dmem->DO0,"dmem.DO0"); sc_trace(tf, mips.dmem->ADDR1,"dmem.ADDR1");sc_trace(tf, mips.dmem->ADDR0,"dmem.ADDR0"); sc_trace(tf, mips.dmem->DI1,"dmem.DI1");sc_trace(tf, mips.dmem->DI0,"dmem.DI0"); sc_trace(tf, mips.dmem->EN1,"dmem.EN1");sc_trace(tf, mips.dmem->EN0,"dmem.EN0"); sc_trace(tf, mips.dmem->WE1,"dmem.WE1");sc_trace(tf, mips.dmem->WE0,"dmem.WE0"); sc_trace(tf, mips.dmem->CLK1,"dmem.CLK1");sc_trace(tf, mips.dmem->CLK0,"dmem.CLK0"); sc_trace(tf, mips.dmem->RST1,"dmem.RST1");sc_trace(tf, mips.dmem->RST0,"dmem.RST0"); sc_trace(tf, mips.dmem->DO3,"dmem.DO3");sc_trace(tf, mips.dmem->DO2,"dmem.DO2"); sc_trace(tf, mips.dmem->ADDR3,"dmem.ADDR3");sc_trace(tf, mips.dmem->ADDR2,"dmem.ADDR2"); sc_trace(tf, mips.dmem->DI3,"dmem.DI3");sc_trace(tf, mips.dmem->DI2,"dmem.DI2");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -