31 #include <Simulator.h> 61 std::cout << std::endl <<
"Simulation interrupted. Wait for the current epoch to finish or press CTRL+C again to force quit." << std::endl;
77 int main(
int __attribute__((unused)) argc,
char** argv){
81 std::cout <<
"Usage: " << argv[0] <<
" <software-image>" << std::endl;
88 std::cout <<
"URSA/ORCA Platform " << std::endl;
91 Signal<uint8_t> *signal_stall, *signal_intr;
97 HFRiscV* cpu =
new HFRiscV(
"cpu", signal_intr, signal_stall, mem);
104 signal_stall->Write(0);
105 signal_intr->Write(0);
108 #ifdef MEMORY_ENABLE_COUNTERS 110 mem->GetSignalCounterStore()->MapTo(mem->GetMap(M0_COUNTER_STORE_ADDR), M0_COUNTER_STORE_ADDR);
111 mem->GetSignalCounterLoad()->MapTo(mem->GetMap(M0_COUNTER_LOAD_ADDR), M0_COUNTER_LOAD_ADDR);
114 #ifdef HFRISCV_ENABLE_COUNTERS 116 cpu->GetSignalCounterArith()->MapTo(mem->GetMap(CPU_COUNTER_ARITH_ADDR), CPU_COUNTER_ARITH_ADDR);
117 cpu->GetSignalCounterLogical()->MapTo(mem->GetMap(CPU_COUNTER_LOGICAL_ADDR), CPU_COUNTER_LOGICAL_ADDR);
118 cpu->GetSignalCounterShift()->MapTo(mem->GetMap(CPU_COUNTER_SHIFT_ADDR), CPU_COUNTER_SHIFT_ADDR);
119 cpu->GetSignalCounterBranches()->MapTo(mem->GetMap(CPU_COUNTER_BRANCHES_ADDR), CPU_COUNTER_BRANCHES_ADDR);
120 cpu->GetSignalCounterJumps()->MapTo(mem->GetMap(CPU_COUNTER_JUMPS_ADDR), CPU_COUNTER_JUMPS_ADDR);
121 cpu->GetSignalCounterLoadStore()->MapTo(mem->GetMap(CPU_COUNTER_LOADSTORE_ADDR), CPU_COUNTER_LOADSTORE_ADDR);
122 cpu->GetSignalCounterCyclesTotal()->MapTo(mem->GetMap(CPU_COUNTER_CYCLES_TOTAL_ADDR), CPU_COUNTER_CYCLES_TOTAL_ADDR);
123 cpu->GetSignalCounterCyclesStall()->MapTo(mem->GetMap(CPU_COUNTER_CYCLES_STALL_ADDR), CPU_COUNTER_CYCLES_STALL_ADDR);
124 cpu->GetSignalHostTime()->MapTo(mem->GetMap(CPU_COUNTER_HOSTTIME_ADDR), CPU_COUNTER_HOSTTIME_ADDR);
131 Simulator* s =
new Simulator();
134 s->Schedule(Event(3, cpu));
137 std::cout <<
"Please wait..." << std::endl;
141 std::chrono::high_resolution_clock::time_point t1, t2;
145 t1 = std::chrono::high_resolution_clock::now();
147 t2 = std::chrono::high_resolution_clock::now();
149 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>( t2 - t1 ).count();
153 double hertz = ((double)
ORCA_EPOCH_LENGTH) / ((double)((
double)duration / 1000.0));
156 std::cout <<
"notice: epoch #" << s->GetEpochs() <<
" took ~" 157 << duration <<
"ms (running @ " << (hertz / 1000000.0)
158 <<
" MHz)" << std::endl;
160 #ifdef ORCA_EPOCHS_TO_SIM 167 }
catch(std::runtime_error& e){
168 std::cout << e.what() << std::endl;
173 std::cout <<
"cpu: INTR=" << (int)(signal_intr->Read())
174 <<
", STALL=" << (
int)(signal_stall->Read()) << std::endl;
177 #ifdef HFRISCV_ENABLE_COUNTERS 179 "\tiarith\t\t" << (int)cpu->GetSignalCounterArith()->Read() << std::endl <<
180 "\tilogic\t\t" << (int)cpu->GetSignalCounterLogical()->Read() << std::endl <<
181 "\tishift\t\t" << (int)cpu->GetSignalCounterShift()->Read() << std::endl <<
182 "\tibranch\t\t" << (int)cpu->GetSignalCounterBranches()->Read() << std::endl <<
183 "\tijumps\t\t" << (int)cpu->GetSignalCounterJumps()->Read() << std::endl <<
184 "\timemop\t\t" << (int)cpu->GetSignalCounterLoadStore()->Read() << std::endl <<
185 "\ticycles\t\t" << (int)cpu->GetSignalCounterCyclesTotal()->Read() << std::endl <<
186 "\tistalls\t\t" << (int)cpu->GetSignalCounterCyclesStall()->Read() << std::endl <<
187 "\tihtime\t\t" << (int)cpu->GetSignalHostTime()->Read() << std::endl;
191 #ifdef MEMORY_ENABLE_COUNTERS 193 "\tloads\t\t" << (int)mem->GetSignalCounterStore()->Read() << std::endl <<
194 "\tstores\t\t" << (int)mem->GetSignalCounterLoad()->Read() << std::endl;
197 int exit_status = cpu->GetState()->terminated;
204 delete(signal_stall);
static void sig_handler(int _)
Signal handler.
#define ORCA_EPOCHS_TO_SIM
#define ORCA_EPOCH_LENGTH
int main(int __attribute__((unused)) argc, char **argv)
static volatile sig_atomic_t interruption
Implementation file for ORCA-SIM program.