开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

开源仿真工具Verilator入门2:主要数据结构介绍

AstNode类:用于解析Verilog

图片[1]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

AST(抽象语法树)在最顶层由类AstNode表示,AstNode是抽象类,其派生类对应某个单一元件或者多组元件。例如:
AstGenerate:对应的是一个generate block;
AstNodeFTask:对应functions和tasks,进一步会生成派生类:AstFunc和AstTask;
AstNode有一个重要特性type hierarchy(类型层次结构),即所有子类如果不是final,那么其必须是抽象类,并且类名前缀为AstNode*。astgen脚本就是基于此(后面会介绍)。
每个AstNode有4个指向子节点的指针,可以通过op1p-op4p方法来访问。这些方法在继承类中会被更具体的方法调用,例如AstIf类(处理if表达式),ifsp调用op2p给出对应then语句block的AST指针,elsesp调用op3p给出对应else语句block的AST指针,当然不存在的话,指针为空。
AstNode具有下一个(next)和前一个(previous) AST的概念,例如一个block中的next语句和previous语句。这类语句的AST指针可以通过back和next的方法获取。
AstNetlist在树结构的最顶端,所以检查这个类是判断是否在树结构顶端的标准方法。
为了方便,每一个函数或者方法使用变量指针nodep指向当前处理的AstNode。
VNVisitor类:用于处理Verilog,转化成仿真C++

图片[2]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

遍历(passes,扫描所有代码的语法树)是通过AST访问者(visitor)类实现的,这些通过抽象类VNVisitor的子类实现,每一个遍历创建一个visitor类的实例来执行方法实现遍历。
确定Verilog代码仿真顺序,包括:
V3Graph类:

图片[3]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[4]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[5]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

一些遍历(passes)算法是通过图算法实现的,类V3Graph用来表示这些图。这些图是有向的,算法用来操纵图并把图结构输出生成 `GraphViz `__ dot格式的文件,V3Graph.h提供了这个类的文档。

V3GraphVertex类:

图片[6]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[7]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[8]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

V3GraphVertex类是图结构中点对应的基类,Vertex有三个属性:fanout(扇出)、color(点着色)和rank(边排序),这三个属性很有可能用在对图做排序的算法中。此外,还提供了一个通用的user/userp成员变量,用来标记某个算法。

提供了虚拟函数来说明name、color、shape和style特征来输出到dot文件。通常V3GraphVertex的派生类会重写这些方法。

Iterators被用来访问入边和出边,通常的调用形式:

图片[9]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

V3GraphEdge类:

图片[10]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[11]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

图片[12]-开源仿真工具Verilator入门2:主要数据结构介绍-Anlogic-安路社区-FPGA CPLD-ChipDebug

V3GraphEdge是图结构中有向边的基类,有两个属性:权重(weight)和是否可裁剪(cutable),与V3GraphVertex类似,还提供了一个通用的user/userp成员变量,用来标记某个算法。

访问函数(Accessor)fromp和top分别返回入节点和出节点。提供了虚拟函数来说明label、color和style特征来输出到dot文件。通常V3GraphVertex的派生类会重写这些方法。

GraphAlg类:

GraphAlg是图算法的基类,其执行了一种bool型的followEdge方法来判断是否跟随(follow)一条边,如果改图的边大于0并且edgeFuncp函数(构造函数传入)返回为真那么followEdge函数返回真。

请登录后发表评论

    没有回复内容