int sc_main( int, char*[] ) { sc_set_default_time_unit( 10, SC_FS ); return 0; }
int sc_main (int argc, char *argv[]) { sc_signal<bool> clk, reset, clear; wait(); wait (clk.posedge_event()); wait (reset.negedge_event()); // negedge_event() and posedge_event() methods can // be applied to a signal or a port to identify the // specific event. wait (clk.posedge_event() | reset.negedge_event() | clear.value_changed_event()); // A value_changed_event() method is true when any // value change occu sc_signal<sc_uint<4> > ready; sc_signal<bool> data; wait (clk.value_changed_event() & data.posedge_event() & ready.value_changed_event()); // The events can span over multiple simulation // cycles. For example, if clk changes at 5ns, // a positive edge on data occurs at 8ns and ready // changes at 10ns, then the wait is triggered at // time 10ns. wait (20, SC_NS); // does NOT work with sc_bit or sc_logic: sc_signal<bool> speed_ctrl; wait (10, SC_NS, speed_ctrl.posedge_event()); // Waits for positive edge to occur on speed_ctrl // for 10ns and then times out. wait (SC_ZERO_TIME); wait (0, SC_NS); sc_signal<sc_logic> sac; // sc_in<sc_logic> sync_reset; sc_signal<sc_logic> sync_reset; wait (sac.posedge_event()); wait (sync_reset.negedge_event()); sc_event write_back; // sensitive << write_back; wait (write_back); write_back.notify(); write_back.notify (20, SC_NS); write_back.notify(SC_ZERO_TIME); // Trigger event in next delta cycle. write_back.cancel(); // Cancels a delayed notification. sc_out<bool> out_port; out_port.initialize(0); sc_time t_res; t_res = sc_get_time_resolution(); cout << "The time resolution is " << sc_get_time_resolution() << endl; double time_in_dbl; sc_time time_res = sc_get_time_resolution(); sc_time curr_time = sc_time_stamp(); time_in_dbl = curr_time / time_res; cout << "Time as a double value is " << time_in_dbl << endl; time_in_dbl = sc_simulation_time(); cout << "Time is " << time_in_dbl; sc_set_default_time_unit (100, SC_PS); sc_time t_unit (10, SC_NS); // NOT WORKING: // sc_set_default_time_unit (t_unit); sc_set_default_time_unit (100, SC_PS); sc_time tf_unit; tf_unit = sc_get_default_time_unit(); // Wake up SC_METHOD process after 10ns: next_trigger (10, SC_NS); // Wake up SC_METHOD process on a rising edge // of reset: next_trigger (reset.posedge_event()); return 0; }
int sc_main (int argc, char *argv[]) { cout << "SYSTEMC_VERSION="<<dec<<SYSTEMC_VERSION<<endl; cout << "Compiled with pointer size "<<((sizeof(char*)==8) ? "-m64":"-m32")<<endl; // Timescale #if (SYSTEMC_VERSION>=20070314) sc_set_time_resolution(100.0, SC_FS); #elif (SYSTEMC_VERSION>20011000) sc_set_time_resolution(100.0, SC_FS); sc_set_default_time_unit(1.0, SC_NS); sc_report::make_warnings_errors(true); #else sc_time dut(1.0, sc_ns); sc_set_default_time_unit(dut); #endif // SYSTEMC_VERSION #ifndef NC_SYSTEMC // Simulation logfile sp_log_file splog; splog.open ("sim.log"); splog.redirect_cout(); #endif // Pins #if SYSTEMC_VERSION >= 20060505 sc_clock clk("clk",5,SC_NS); // We want a non-integer half period to prove VCD works #else sc_clock clk("clk",5); #endif // SYSTEMC_VERSION ExBench* bench; SP_CELL (bench,ExBench); SP_PIN (bench,clk,clk); bench->configure(); // Verify the #sp include worked #ifndef NC_SYSTEMC # if SYSTEMC_VERSION < 20060505 sc_initialize(); # endif #endif // Example enumeration usage MyENumClass enval = MyENumClass::ONE; cout << "Assigned to enumeration = "<<enval<<endl; // Prints "ONE" cout << "Iterating an enumeration ="; for (MyENumSimple::iterator it=MyENumSimple::begin(); it!=MyENumSimple::end(); ++it) { cout << " " << (*it).ascii(); } cout << endl; #ifndef NC_SYSTEMC // SystemC traces are flawed, you can't even trace ports sc_trace_file *tf = sc_create_vcd_trace_file("sim_sc" ); sc_trace(tf, clk, "clk"); #if SYSTEMC_VERSION >= 20070314 tf->set_time_unit(1, SC_NS); #endif // SystemPerl traces SpTraceFile* stp = new SpTraceFile; bench->trace(stp,999); stp->open("sim_sp.vcd"); // Alternative SystemPerl traces, allowing rollover // After running, concat the two files to make the vcd file. SpTraceFile* stp2 = new SpTraceFile; stp2->rolloverMB(1); // Rollover logfiles when size > 1MB bench->trace(stp2,999); stp2->open("sim_sp2.vcd"); #endif // NC_SYSTEMC cout << "Starting\n"; #if SYSTEMC_VERSION >= 20060505 sc_start(); #else sc_start(-1); #endif // SYSTEMC_VERSION cout << "Done\n"; #ifndef NC_SYSTEMC sc_close_vcd_trace_file(tf); SpTraceVcd::flush_all(); #endif // NC_SYSTEMC // Coverage mkdir("logs", 0777); SpCoverage::write(); // Writes logs/coverage.pl return (0); }