📄 main.cpp
字号:
sc_signal<int> add1("ADD1") ; sc_signal<bool> shift_sel("SHIFT_SEL") ; // EXEC dina = src_A // EXEC dinb = src_B // EXEC dest = alu_src sc_signal<bool> c("C") ; sc_signal<bool> v("V") ; sc_signal<bool> z("Z") ; sc_signal<signed> dout("DOUT") ; sc_signal<bool> out_valid("OUTPUT_VALID") ; sc_signal<unsigned> destout("DESTOUT") ; // ************************ Floating point ****************************** // FPU in_valid = float_valid // FPU opcode = alu_op // FPU floata = src_A // FPU floatb = src_B // FPU dest = alu_src sc_signal<signed> fdout("FDOUT") ; sc_signal<bool> fout_valid("FOUT_VALID") ; sc_signal<unsigned> fdestout("FDESTOUT") ; // ************************ PIC ***************************************** sc_signal<bool> ireq0("IREQ0") ; sc_signal<bool> ireq1("IREQ1") ; sc_signal<bool> ireq2("IREQ2") ; sc_signal<bool> ireq3("IREQ3") ; // PIC cs = interrupt_ack // PIC intack_cpu = interrupt_ack sc_signal<bool> rd_wr("RD_WR") ; sc_signal<bool> intreq("INTREQ") ; sc_signal<unsigned> vectno("VECTNO") ; sc_signal<bool> intack("INTACK") ; sc_signal<bool> intack_cpu("INTACK_CPU") ; // ************************ MMX *********************************** // MMX mmx_valid = mmx_valid // MMX opcode = alu_op // MMX mmxa = src_A // MMX mmxb = src_B // MMX dest = dest // MMX mmxdout = fdout // MMX mmxout_valid = fpu_valid // MMX mmxdestout = fpu_destout // ************************ DSP ***************************************** sc_signal<int> dsp_in1("DPS_IN1"); sc_signal<int> dsp_out1("DSP_OUT1"); sc_signal<bool> dsp_data_valid("DSP_DATA_VALID"); sc_signal<bool> dsp_input_valid("DSP_INPUT_VALID"); sc_signal<bool> dsp_data_requested("DSP_DATA_REQUESTED"); //////////////////////////////////////////////////////////////////////////// // MAIN PROGRAM //////////////////////////////////////////////////////////////////////////// sc_clock clk("Clock", 1, SC_NS, 0.5, 0.0, SC_NS); printf("/////////////////////////////////////////////////////////////////////////\n"); printf("// This code is written at SYNOPSYS, Inc.\n"); printf("/////////////////////////////////////////////////////////////////////////\n"); printf("// Module : main of CPU Model\n"); printf("// Author : Martin Wang\n"); printf("// Company : SYNOPSYS, Inc.\n"); printf("// Purpose : This is a simple CPU modeling using SystemC.\n"); printf("// Instruction Set Architecure defined by Martin Wang.\n"); printf("// \n"); printf("// SystemC (TM) Copyright (c) 1988-2001 by Synopsys, Inc. \n"); printf("// \n"); printf("/////////////////////////////////////////////////////////////////////////\n"); cout << "// IN THIS MACHINE Integer is " << sizeof (int) << " bytes.\n"; cout << "// IN THIS MACHINE Floating is " << sizeof (float) << " bytes.\n"; cout << "// IN THIS MACHINE Double is " << sizeof (double) << " bytes.\n"; printf("// \n"); printf("// \n"); printf("// .,,uod8B8bou,,.\n"); printf("// ..,uod8BBBBBBBBBBBBBBBBRPFT?l!i:.\n"); printf("// ,=m8BBBBBBBBBBBBBBBRPFT?!||||||||||||||\n"); printf("// !...:!TVBBBRPFT||||||||||!!^^\"\" ||||\n"); printf("// !.......:!?|||||!!^^\"\"' ||||\n"); printf("// !.........|||| ### # # ||||\n"); printf("// !.........|||| ### # # # # ||||\n"); printf("// !.........|||| # # # # # ||||\n"); printf("// !.........|||| # # # # # ||||\n"); printf("// !.........|||| # ## # # ||||\n"); printf("// !.........|||| # # ### ||||\n"); printf("// `.........|||| # # # ,||||\n"); printf("// .;.......|||| ### _.-!!|||||\n"); printf("// .,uodWBBBBb.....|||| _.-!!|||||||||!:'\n"); printf("// !YBBBBBBBBBBBBBBb..!|||:..-!!|||||||!iof68BBBBBb....\n"); printf("// !..YBBBBBBBBBBBBBBb!!||||||||!iof68BBBBBBRPFT?!:: `.\n"); printf("// !....YBBBBBBBBBBBBBBbaaitf68BBBBBBRPFT?!::::::::: `.\n"); printf("// !......YBBBBBBBBBBBBBBBBBBBRPFT?!::::::;:!^\"`;::: `.\n"); printf("// !........YBBBBBBBBBBRPFT?!::::::::::^''...::::::; iBBbo.\n"); printf("// `..........YBRPFT?!::::::::::::::::::::::::;iof68bo. WBBBBbo.\n"); printf("// `..........:::::::::::::::::::::::;iof688888888888b. `YBBBP^'\n"); printf("// `........::88::::::::::::;iof688888888888888888888b. `\n"); printf("// `......::81:::::;iof688888888888888888888888888888b.\n"); printf("// `....:::;iof688888888888888888888888888888888899fT!\n"); printf("// `..::!8888888888888888888888888888888899fT|!^\"'\n"); printf("// `' !!988888888888888888888888899fT|!^\"'\n"); printf("// `!!8888888888888888899fT|!^\"'\n"); printf("// `!988888888899fT|!^\"'\n"); printf("// `!9899fT|!^\"'\n"); printf("// `!^\"'\n"); printf("// \n"); printf("// \n"); printf("/////////////////////////////////////////////////////////////////////////\n\n\n"); fetch IFU("FETCH_BLOCK"); IFU.init_param(delay_cycles); IFU << ram_dataout << branch_target_address << next_pc << branch_valid << stall_fetch << intreq << vectno << bios_valid << icache_valid << pred_fetch << pred_branch_address << pred_branch_valid << ram_cs << ram_we << addr << ram_datain << instruction << instruction_valid << program_counter << intack_cpu << branch_clear << pred_fetch_valid << reset << clk; decode IDU("DECODE_BLOCK"); IDU << reset << instruction << pred_instruction << instruction_valid << pred_inst_valid << out_valid << destout << dout << dram_dataout << dram_rd_valid << destout << fdout << fout_valid << fdestout << branch_clear << dsp_data_valid << program_counter << pred_on << branch_instruction_address << next_pc << branch_valid << branch_target_address << mem_access << mem_address << alu_op << mem_write << alu_src << reg_write << src_A << src_B << forward_A << forward_B << stall_fetch << decode_valid << float_valid << mmx_valid << pid_valid << pid_data << clk; exec IEU("EXEC_BLOCK"); IEU << reset << decode_valid << alu_op << negate << add1 << shift_sel << src_A << src_B << forward_A << forward_B << alu_src << c << v << z << dout << out_valid << destout << clk; floating FPU("FLOAT_BLOCK"); // order dependent FPU << float_valid << alu_op << src_A << src_B << alu_src << fdout << fout_valid << fdestout << clk; mmxu MMXU("MMX_BLOCK"); MMXU << mmx_valid << alu_op << src_A << src_B << alu_src << fdout << fout_valid << fdestout << clk; bios BIOS("BIOS_BLOCK"); BIOS.init_param(delay_cycles); BIOS.datain(ram_datain); // order independent BIOS.cs(ram_cs); BIOS.we(ram_we); BIOS.addr(addr); BIOS.dataout(ram_dataout); BIOS.bios_valid(bios_valid); BIOS.stall_fetch(stall_fetch); BIOS.CLK(clk); paging PAGING("PAGING_BLOCK"); PAGING << ram_datain << ram_cs << ram_we << addr << icache_din << icache_validin << icache_stall << paging_dout << paging_csout << paging_weout << physical_address << ram_dataout << icache_valid << stall_fetch << clk ; icache ICACHE("ICACHE_BLOCK"); ICACHE.init_param(delay_cycles); ICACHE << paging_dout << paging_csout << paging_weout << physical_address << pid_valid << pid_data << icache_din << icache_validin << icache_stall << clk; dcache DCACHE("DCACHE_BLOCK"); DCACHE.init_param(delay_cycles); DCACHE << mmic_datain << mmic_statein << mmic_cs << mmic_we << mmic_addr << mmic_dest << mmic_destout << mmic_dataout << mmic_out_valid << mmic_stateout << clk; pic APIC("PIC_BLOCK"); APIC << ireq0 << ireq1 << ireq2 << ireq3 <<intack_cpu << rd_wr << intack_cpu << intreq << intack << vectno; time_t tbuffer = time(NULL); sc_start(); cout << "Time for simulation = " << (time(NULL) - tbuffer) << endl; return 0; /* this is necessary */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -