// DESCRIPTION: Verilator: Verilog example module // // This file ONLY is placed under the Creative Commons Public Domain, for // any use, without warranty, 2017 by Wilson Snyder. // SPDX-License-Identifier: CC0-1.0 //====================================================================== // Include common routines #include // Include model header, generated from Verilating "top.v" #include "Vtop.h" // Current simulation time (64-bit unsigned) vluint64_t main_time = 0; // Called by $time in Verilog double sc_time_stamp() { return main_time; // Note does conversion to real, to match SystemC } int main(int argc, char** argv, char** env) { // This is a more complicated example, please also see the simpler examples/make_hello_c. // Prevent unused variable warnings if (false && argc && argv && env) {} // Set debug level, 0 is off, 9 is highest presently used // May be overridden by commandArgs Verilated::debug(0); // Randomization reset policy // May be overridden by commandArgs Verilated::randReset(2); // Verilator must compute traced signals Verilated::traceEverOn(true); // Pass arguments so Verilated code can see them, e.g. $value$plusargs // This needs to be called before you create any model Verilated::commandArgs(argc, argv); // Create logs/ directory in case we have traces to put under it Verilated::mkdir("logs"); // Construct the Verilated model, from Vtop.h generated from Verilating "top.v" Vtop* top = new Vtop; // Or use a const unique_ptr, or the VL_UNIQUE_PTR wrapper // Set some inputs top->reset_l = !0; top->clk = 0; top->in_small = 1; top->in_quad = 0x1234; top->in_wide[0] = 0x11111111; top->in_wide[1] = 0x22222222; top->in_wide[2] = 0x3; // Simulate until $finish while (!Verilated::gotFinish()) { main_time++; // Time passes... // Toggle a fast (time/2 period) clock top->clk = !top->clk; // Toggle control signals on an edge that doesn't correspond // to where the controls are sampled; in this example we do // this only on a negedge of clk, because we know // reset is not sampled there. if (!top->clk) { if (main_time > 1 && main_time < 10) { top->reset_l = !1; // Assert reset } else { top->reset_l = !0; // Deassert reset } // Assign some other inputs top->in_quad += 0x12; } // Evaluate model // (If you have multiple models being simulated in the same // timestep then instead of eval(), call eval_step() on each, then // eval_end_step() on each.) top->eval(); // Read outputs VL_PRINTF("[%" VL_PRI64 "d] clk=%x rstl=%x iquad=%" VL_PRI64 "x" " -> oquad=%" VL_PRI64 "x owide=%x_%08x_%08x\n", main_time, top->clk, top->reset_l, top->in_quad, top->out_quad, top->out_wide[2], top->out_wide[1], top->out_wide[0]); } // Final model cleanup top->final(); // Coverage analysis (since test passed) #if VM_COVERAGE Verilated::mkdir("logs"); VerilatedCov::write("logs/coverage.dat"); #endif // Destroy model delete top; top = nullptr; // Fin exit(0); }