当前位置: 首页 > 工具软件 > Verilator > 使用案例 >

EDA开源仿真工具verilator入门6:调试实例

雍志新
2023-12-01

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

 类似资料: