verilog代码:
module multi_logic (a,b,c,d,e,f,g,h,clk,ou1,ou2,ou3,ou4);
input a,b,c,d,e,f,g,h,clk;
output ou1,ou2,ou3,ou4;
reg a,b,c,d,e,f,g,h,clk,ou1,ou2,ou3,ou4;
always @(posedge clk) begin
ou1 <= a ^ b;
ou2 <= c & d;
ou3 <= e | f;
ou4 <= (~g) | h;
end
endmodule
cpp代码:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "Vmulti_logic.h" // create `multi_logic.v`,so use `Vmulti_logic.h`
#include "verilated.h"
#include "verilated_vcd_c.h" //可选,如果要导出vcd则需要加上
int main(int argc, char** argv, char** env) {
VerilatedContext* contextp = new VerilatedContext;
contextp->commandArgs(argc, argv);
Vmulti_logic* multiLogic = new Vmulti_logic{contextp};
VerilatedVcdC* tfp = new VerilatedVcdC; //初始化VCD对象指针
contextp->traceEverOn(true); //打开追踪功能
multiLogic->trace(tfp, 0); //
tfp->open("wave.vcd"); //设置输出的文件wave.vcd
int clk = 1;
int count = 0;
while (!contextp->gotFinish()) {
count++;
int a = rand() & 1;
int b = rand() & 1;
int c = rand() & 1;
int d = rand() & 1;
int e = rand() & 1;
int f = rand() & 1;
int g = rand() & 1;
int h = rand() & 1;
clk = (clk + 1) % 2;
multiLogic->a = a;
multiLogic->b = b;
multiLogic->c = c;
multiLogic->d = d;
multiLogic->e = e;
multiLogic->f = f;
multiLogic->g = g;
multiLogic->h = h;
multiLogic->clk = clk;
multiLogic->eval();
printf("a = %d, b = %d, c = %d, d = %d, e = %d, f = %d, g = %d, h = %d, clk = %d, ou1 = %d, ou2 = %d, ou3 = %d\n",
a, b, c, d, e, f, g, h, clk, multiLogic->ou1, multiLogic->ou2, multiLogic->ou3);
tfp->dump(contextp->time()); //dump wave
contextp->timeInc(1); //推动仿真时间
if (count > 25)
break;
//assert(top->f == ~((a&b) | (~(c&d))));
}
delete multiLogic;
tfp->close();
delete contextp;
return 0;
}
单线程输入指令:
verilator -Wall --cc --trace --exe --build multi_logic.v test_main.cpp
多线程输入指令:
verilator -Wall --cc --trace --exe --build --threads {2} multi_logic.v test_main.cpp
单线程debug输入指令:
verilator --cc --trace -exe --debug --gdbbt multi_logic.v test_main.cpp
进行debug,输出结果如下:
No stack.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Starting Verilator 4.210 2021-07-07 rev v4.210
- Verilator.cpp:550: Option --verilate: Start Verilation
- V3File.cpp:234: --check-times failed: different command line
- V3ParseImp.cpp:271: parseFile: multi_logic
Preprocessing multi_logic.v
- V3PreShell.cpp:147: Reading multi_logic.v
- V3ParseImp.cpp:320: Lexing multi_logic.v
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_001_linkcells.dot
- V3LinkLevel.cpp:45: modSortByLevel()
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_002_cells.tree
- V3LinkDot.h:37: linkDotPrimary:
- V3LinkJump.cpp:289: linkJump:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_007_link.tree
- V3LinkInc.cpp:248: linkIncrements:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_008_linkInc.tree
- V3Param.cpp:1225: param:
- V3LinkDot.h:42: linkDotParamed:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_010_paramlink.tree
- V3Dead.cpp:465: deadifyModules:
- V3Width.cpp:6158: width:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_012_width.tree
- V3Width.cpp:6201: widthCommit:
- V3Const.cpp:3309: constifyAllLive:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_014_const.tree
- V3Undriven.cpp:463: undrivenAll:
- V3AssertPre.cpp:207:assertPreAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_015_assertpre.tree
- V3Assert.cpp:476: assertAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_016_assert.tree
- V3LinkLevel.cpp:135:wrapTop:
- V3Const.cpp:3282: constifyAllLint:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_018_const.tree
- V3SplitVar.cpp:1250:splitVariable:
- V3Inst.cpp:618: dearrayAll:
- V3LinkDot.h:47: linkDotArrayed:
- V3Begin.cpp:293: debeginAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_023_begin.tree
- V3Tristate.cpp:1426:tristateAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_024_tristate.tree
- V3Unknown.cpp:489: unknownAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_025_unknown.tree
- V3Inline.cpp:712: inlineAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_026_inline.tree
- V3LinkDot.h:47: linkDotArrayed:
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_028_const.tree
- V3Dead.cpp:471: deadifyDTypes:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_029_deadDtypes.tree
- V3Inst.cpp:612: instAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_030_inst.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_031_const.tree
- V3Scope.cpp:403: scopeAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_032_scope.tree
- V3LinkDot.h:52: linkDotScope:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_033_linkdot.tree
- V3Class.cpp:155: classAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_034_class.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_035_const.tree
- V3Dead.cpp:477: deadifyDTypesScoped:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_036_deadDtypesScoped.tree
- V3Case.cpp:532: caseAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_037_case.tree
- V3Task.cpp:1729: taskAll:
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_038_task_call.dot
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_039_task.tree
- V3Name.cpp:144: nameAll:
- V3Unroll.cpp:511: unrollAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_041_unroll.tree
- V3Slice.cpp:238: sliceAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_042_slice.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_043_const.tree
- V3Life.cpp:489: lifeAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_044_life.tree
- V3Table.cpp:427: tableAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_045_table.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_046_const.tree
- V3Dead.cpp:477: deadifyDTypesScoped:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_047_deadDtypesScoped.tree
- V3Active.cpp:622: activeAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_048_active.tree
- V3Split.cpp:971: splitAlwaysAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_049_split.tree
- V3SplitAs.cpp:196: splitAsAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_050_splitas.tree
- V3TraceDecl.cpp:360:traceDeclAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_051_tracedecl.tree
- V3Gate.cpp:1602: gateAll:
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_052_gate_simp.dot
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_053_gate_opt.dot
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_054_gate.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_055_const.tree
- V3Dead.cpp:490: deadifyAllScoped:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_056_deadAllScoped.tree
- V3Split.cpp:966: splitReorderAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_057_reorder.tree
- V3Delayed.cpp:512: delayedAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_058_delayed.tree
- V3ActiveTop.cpp:138:activeTopAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_059_activetop.tree
- V3Order.cpp:2018: orderAll:
- V3Order.cpp:949: Loading tree...
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_060_orderg_pre.dot
- V3Order.cpp:1957: Acyclic & Order...
- V3GraphAcyc.cpp:572:Acyclic
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_061_acyc_simp.dot
- V3GraphAcyc.cpp:553: Cutting trivial loops
- V3GraphAcyc.cpp:557: Ranking
- V3GraphAcyc.cpp:561: Placement
- V3GraphAcyc.cpp:455: Cutable edges = 0
- V3GraphAcyc.cpp:565: Final Ranking
- V3GraphAcyc.cpp:575:Acyclic done
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_062_orderg_acyc.dot
- V3GraphAlg.cpp:471: Order:
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_063_orderg_order.dot
- V3Order.cpp:1969: Process Clocks...
- V3Order.cpp:1972: Process Circulars...
- V3Order.cpp:1976: Domains...
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_064_orderg_domain.dot
- V3Order.cpp:1983: Construct Move Graph...
- V3Order.cpp:1992: Move...
- V3Order.cpp:2000: Sensitive...
dot -Tpdf -o ~/a.pdf obj_dir/Vmulti_logic_066_orderg_done.dot
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_067_order.tree
- V3GenClk.cpp:224: genClkAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_068_genclk.tree
- V3Clock.cpp:437: clockAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_069_clock.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_070_const.tree
- V3Life.cpp:489: lifeAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_071_life.tree
- V3LifePost.cpp:349: lifepostAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_072_life_post.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_073_const.tree
- V3Dead.cpp:490: deadifyAllScoped:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_074_deadAllScoped.tree
- V3Changed.cpp:288: changedAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_075_changed.tree
- V3Trace.cpp:905: traceAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_076_trace.tree
- V3Localize.cpp:203: localizeAll:
- V3Descope.cpp:268: descopeAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_078_descope.tree
- V3Combine.cpp:225: combineAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_079_combine.tree
- V3Const.cpp:3319: constifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_080_const.tree
- V3Dead.cpp:484: deadifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_081_deadAll.tree
- V3Clean.cpp:316: cleanAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_082_clean.tree
- V3Premit.cpp:429: premitAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_083_premit.tree
- V3Expand.cpp:947: expandAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_084_expand.tree
- V3Const.cpp:3291: constifyCpp:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_085_const_cpp.tree
- V3Subst.cpp:382: substituteAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_086_subst.tree
- V3Const.cpp:3291: constifyCpp:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_087_const_cpp.tree
- V3Dead.cpp:484: deadifyAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_088_deadAll.tree
- V3MergeCond.cpp:339:mergeAll:
- V3Reloop.cpp:269: reloopAll:
- V3Depth.cpp:160: depthAll:
- V3Branch.cpp:125: branchAll:
- V3Cast.cpp:203: castAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_092_cast.tree
- V3CCtors.cpp:174: cctorsAll:
- V3CUse.cpp:230: cUseAll:
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_093_cuse.tree
- V3EmitCInlines.cpp:56:emitcInlines:
- V3EmitCSyms.cpp:1038:emitcSyms:
- V3EmitCConstPool.cpp:190:emitcConstPool:
- V3EmitCModel.cpp:627:emitcModel:
- V3EmitC.cpp:1105: emitcTrace:
- V3EmitC.cpp:1084: emitc:
- V3EmitXml.cpp:378: emitxml:
- V3StatsReport.cpp:220:statsReport:
- V3EmitMk.cpp:410: emitmk:
- V3Os.cpp:95: export VERILATOR_ROOT=/usr/local/share/verilator # Hardcoded at build time
- V3Os.cpp:95: export SYSTEMC_ARCH=linux # From sysname 'linux'
- V3Ast.cpp:1125: Dumping obj_dir/Vmulti_logic_990_final.tree
- Verilator.cpp:732: Done, Exiting...
[Inferior 1 (process 28702) exited normally]
No stack.
如果输入:
verilator --cc --trace -exe --debug --debugi 9 --gdbbt multi_logic.v test_main.cpp
可以看到更详细的日志。
多线程的指令:
verilator --cc --trace --exe --build --debug --threads 2 --gdbbt multi_logic.v test_main.cpp
end