CN116050312A - 基于链表树的硬件逻辑设计层次结构信息提取方法及系统 - Google Patents
基于链表树的硬件逻辑设计层次结构信息提取方法及系统 Download PDFInfo
- Publication number
- CN116050312A CN116050312A CN202310074294.1A CN202310074294A CN116050312A CN 116050312 A CN116050312 A CN 116050312A CN 202310074294 A CN202310074294 A CN 202310074294A CN 116050312 A CN116050312 A CN 116050312A
- Authority
- CN
- China
- Prior art keywords
- module
- node
- tree
- linked list
- column
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/30—Circuit design
- G06F30/32—Circuit design at the digital level
- G06F30/327—Logic synthesis; Behaviour synthesis, e.g. mapping logic, HDL to netlist, high-level language to RTL or netlist
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F30/00—Computer-aided design [CAD]
- G06F30/30—Circuit design
- G06F30/34—Circuit design for reconfigurable circuits, e.g. field programmable gate arrays [FPGA] or programmable logic devices [PLD]
- G06F30/343—Logical level
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Evolutionary Computation (AREA)
- Geometry (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于链表树的硬件逻辑设计层次结构信息提取方法及系统,本发明基于链表树的硬件逻辑设计层次结构信息提取方法包括使用综合工具将硬件设计的RTL代码综合为一组网表文件,提取网表文件中的信息,得到硬件设计综合报告文件,处理硬件设计综合报告文件生成基于链表树的硬件逻辑设计层次结构信息,本发明从一组硬件模块网表文件中提取设计层级结构信息,并以链表树的方式组织和存储,为逻辑划分算法提供输入,本发明具有层次结构信息提取方便、存储空间资源占用少的优点,并且可进行可视化展示以便于FPGA原型验证系统开发人员直观地理解硬件逻辑设计层次结构。
Description
技术领域
本发明属于集成电路设计领域中的原型验证技术,具体涉及一种基于链表树的硬件逻辑设计层次结构信息提取方法及系统。
背景技术
随着半导体工艺的不断发展和对高性能计算需求的不断提高,芯片设计的复杂度不断提高,进而对验证平台的需求也越来越高。基于FPGA(Field Programmable GateArray,现场可编程逻辑门阵列)搭建的芯片原型验证系统能够反应芯片真实性能、能够发现真实BUG、相比于软件仿真以及硬件仿真加速器具有更快的运行速度等优点,是进行芯片验证的重要手段之一。随着芯片设计规模越来越大,出现了待验证的芯片逻辑规模超出单片FPGA逻辑资源的问题,即无法将完整的芯片设计逻辑放入一颗FPGA之内,从而导致无法搭建芯片的FPGA原型验证系统。为解决上述问题所采用的方法是,使用逻辑划分算法将芯片逻辑设计划分为多个子设计,使每一个子设计所消耗的逻辑资源不超过单片FPGA的逻辑容量,同时子设计之间的互联通信带宽小于FPGA之间的通信带宽,通过使用多片FPGA的方式解决了芯片规模超过单片FPGA逻辑容量的问题,实现了芯片原型验证系统的构建。
FPGA原型验证系统进行逻辑划分的前提是提取出芯片的层次结构信息,即芯片的层次结构信息是逻辑划分算法的输入,芯片的层次结构信息包括设计中模块之间的连接关系、模块间互连信号数量和每个模块消耗的逻辑资源。
硬件设计RTL代码经过综合工具的处理后得到一组网表文件,其中每个设计模块的RTL文件综合后得到对应的一个网表文件,从每个网表文件可获知对应设计模块包含的寄存器、信号线、调用的子模块以及端口数量等信息。但是,由于综合后得到的是每个模块单独的网表,所以不能看到硬件设计完整清晰的层次结构且无法获得每个模块的完整资源消耗,还需要对该组网表文件进行处理,梳理模块间的调用关系,才能将每个设计模块的网表信息有机地组织起来,得到划分算法所需的硬件设计层次结构信息。当硬件设计规模较大、层次较深时,采用何种数据结构来组织、存储硬件设计层次结构信息,对层次结构信息算法的执行效率、层次结构信息所占用的存储空间大小有着重要的影响。因此如何实现硬件逻辑设计层次结构信息提取,已成为一项亟待解决的关键技术问题。
发明内容
本发明要解决的技术问题:针对现有技术的上述问题,提供一种基于链表树的硬件逻辑设计层次结构信息提取方法及系统,本发明基于链表树来组织、存储设计层次结构信息,可从一组硬件模块网表文件中提取设计层级结构信息并以链表树的方式组织和存储,具有层次结构信息提取方便、存储空间资源占用少的优点,并且可进行可视化展示以便于FPGA原型验证系统开发人员直观地理解硬件逻辑设计层次结构。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于链表树的硬件逻辑设计层次结构信息提取方法,包括:
步骤M1:使用综合工具将硬件设计的RTL代码综合为一组网表文件,提取网表文件中的信息,得到硬件设计综合报告文件;
步骤M2:处理硬件设计综合报告文件,生成基于链表树的硬件逻辑设计层次结构信息。
可选地,步骤M1包括:
步骤M11:使用综合工具对硬件设计RTL代码进行综合,生成硬件设计RTL代码中每个模块的网表文件,每个网表文件中包含该模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口信息;
步骤M12:根据关键字逐一对每个网表文件进行处理,提取网表文件中的模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口信息,生成每个网表文件对应的模块综合报告文件,将生成的所有模块综合报告文件进行汇总以得到硬件设计综合报告文件。
可选地,步骤M1中硬件设计综合报告文件中每一行的格式为:
模块名wires_n wire_bits_n public_wires_n public_wire_bits_n memory_nmemory_bits_nprocesses_n['子模块a名','子模块b名','子模块c名',……],
其中,wire_n表示该模块中信号线的数量为n;wire_bits_n表示该模块中所有信号线位宽之和为n bits;memory_n表示该模块中寄存器数组的个数是n;memory_bits_n表示该模块中所有寄存器数组的存储容量之和是n bits;processes_n表示该模块中if-then-else逻辑块、Verilog语法中的always逻辑块以及VHDL语法中的进程逻辑块的数量之和是n;['子模块a名','子模块b名','子模块c名',……]是该模块所例化的各个子模块的名称。
可选地,步骤M2包括:
步骤M21:定义模块信息检索表my_table,所述模块信息检索表my_table的每一行用于存储一个模块对应链表树节点的相关信息;
步骤M22:定义模块逻辑资源结构体logic_data_str以记录模块所需的逻辑资源信息;
步骤M23:从硬件设计综合报告文件中读取一行,继续执行步骤M24;
步骤M24:对读取的一行信息进行链表树构建,继续执行步骤M25;
步骤M25:判断硬件设计综合报告文件是否读取完毕,如果读取完毕,则跳转到步骤M27;如果还未读取完毕,则继续执行步骤M26;
步骤M26:读取硬件设计综合报告文件中下一行的模块信息文件,跳转到步骤M24;
步骤M27:链表树正确构建并将链表树输出或中止程序执行并提示程序执行出错,跳转至步骤M3。
可选地,步骤M21中模块信息检索表my_table的每一行的列分别包括:列name为当前行存储的模块对应的链表树节点名;列has_data用于表示当前行存储的节点中是否已填入了该模块所需的逻辑资源信息,当列has_data为1时表示已填入该模块所需的逻辑资源信息,当列has_data为0时表示还未填入该模块所需的逻辑资源信息;列has_father用于表示当前行存储的模块对应的链表树节点是否已连接至其父节点,当列has_father为1时表示已连接至父节点,当列has_father为0时表示还未连接至父节点;列valid_number为当前行在模块信息检索表my_table中的行数;列pointer_data_node为指向当前行存储的模块对应链表树节点地址的指针;所述链表树节点为一种链表树型数据结构体tree_node,该结构体包含三个成员变量,包括:成员变量pointer_logic_data_str,为指向当前节点的所需逻辑资源信息结构体logic_data_str地址的指针,成员变量child_tree_node_pointer为指向当前链表树节点的子节点child_tree_node地址的指针,成员变量next_tree_node_pointer为指向当前链表树节点的兄弟节点next_tree_node地址的指针;所述父节点是指以当前模块为子节点的链表树节点;步骤M22中模块逻辑资源结构体logic_data_str记录的逻辑资源信息,为链表树节点结构体中成员变量pointer_logic_data_str所指向的数据对象,所述模块逻辑资源结构体logic_data_str的成员变量包括str_mod_name、str_wires、str_wires_bit、str_public_wires、str_public_wires_bits、str_memories、str_memory_bits以及str_processes,分别与硬件设计综合报告文件中每一行字段中的模块名、wires_n、wire_bits_n、public_wires_n、public_wire_bits_n、memory_n、memory_bits_n以及processes_n一一对应。
可选地,步骤M24包括:
步骤M241:将读取的模块名逐行地与模块信息检索表my_table的列name进行对比,判断该模块是否已经注册,如果判断已经注册,则跳转到步骤M242,否则跳转到步骤M243;
步骤M242:使用已经注册模块所在行的列pointer_tree_node,找到该模块对应的链表树节点tree_node,再用链表树节点tree_node中的成员变量pointer_logic_data_str找到该模块对应的逻辑资源结构体logic_data_str,将读取信息中各逻辑资源项依次填进该结构体logic_data_str的各变量中,并将该行列has_data赋值为1,再跳转到步骤M245;
步骤M243:为该模块创建模块逻辑资源结构体logic_data_str,新创建的模块逻辑资源结构体logic_data_str各变量中依次填入读取到的该模块的各逻辑资源信息,为该模块创建一个链表树节点,该链表树节点的成员变量pointer_logic_data_str指向为该模块创建的模块逻辑资源结构体,成员变量child_tree_node_pointer赋值为空,成员变量next_tree_node_pointer赋值为空;在模块信息检索表my_table中建立新一行,继续执行步骤M244;
步骤M244:依次向模块信息检索表my_table中新创建的一行填入数据,列name填入读取到的模块名,列has_data填入1,表示已记录该模块的逻辑资源信息;列has_father填入0,表示该模块对应的链表树节点还未与其父节点关联;列valid_number填入该行的行数;列pointer_data指向为该模块创建的链表树节点,继续执行步骤M245;
步骤M245:判断读取的模块中是否例化子模块,如果判断例化子模块,则跳转到步骤M246;如果判断没有例化子模块,则进入下一行文本的判断,跳转到步骤M24H;
步骤M246:判断读取模块对应链表树节点的成员变量child_tree_node_pointer是否为0;如果是0,跳转到步骤M247;如果不是0,跳转到步骤M24I;
步骤M247:读取该模块的第一个子模块名,跳转到步骤M248;
步骤M248:将读取到的子模块名依次与模块信息检索表my_table中各行列name中已经定义的模块名比较判断是否已被定义,如果已被定义,则跳转步骤M249,否则跳转步骤M24B;
步骤M249:判断已经定义模块是否已连接至父节点,如果判断没有连接至父节点,则跳转到M24A;如果判断已连接至父节点,则跳转步骤M24D;
步骤M24A:把步骤M249已经定义模块定义为步骤M241读取的模块对应链表树节点的子节点,并把步骤M249已经定义模块所在行的列has_father填入1,把列pointer_tree_node存放的值赋值为当前父模块对应链表树节点的成员变量child_tree_node_pointer的值,其中当前父模块为步骤M241读取的模块;再跳转到步骤M245;
步骤M24B:在模块信息检索表my_table中建立新一行,来表示当前读取到的子模块;再跳转到步骤M24C;
步骤M24C:依次向该行的各列填入数据,列name填入当前读取到的子模块名;列has_data填入0,表示还未读取到资源信息;列has_father填入1,表示此模块对应的链表树节点已连接至父节点;列valid_number增加1;列pointer_tree_node填入当前读取到的链表树节点信息,并把列pointer_tree_node存储的值返回至步骤M241模块名对应链表树节点的成员变量child_tree_node_pointer的值;再跳转到步骤M245;
步骤M24D:判断已经定义的模块对应链表树节点的成员变量child_tree_node_pointer是否为0;如果不是0,则跳转到步骤M24E;如果是0,则跳转到步骤M24F;
步骤M24E:以已经定义的模块为根节点,在模块信息检索表my_table中遍历并复制这个节点对应模块、子模块及链表树节点,将复制后链表树节点的地址值赋值为步骤M241所述模块名对应链表树节点的成员变量child_tree_node_pointer的值;再跳转到步骤M245;
步骤M24F:依据已定义的模块,定义一个新链表树节点,链表树节点的成员变量child_tree_node_pointer和成员变量next_tree_node_pointer赋值0,链表树节点的pointer_logic_data_str赋值等于步骤M24D已经定义的模块对应链表树节点中的成员变量pointer_logic_data_str;在模块信息检索表my_table中最后一行新建一行,再跳转到步骤M24G;
步骤M24G:依次向模块信息检索表my_table中新创建的一行填入数据,列name、列has_data以及列has_father赋值为步骤M249已经定义模块的列name、列has_data以及列has_father,列vaild_number是上一行vaild_number的值加1,列pointer_tree_node值是步骤M24F中定义的链表树节点的地址;并把列pointer_tree_node存放的地址值赋值为当前父模块对应链表树节点的成员变量child_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;再跳转到步骤M245;
步骤M24H:跳转步骤M25以进入下一行文本的判断,结束并退出;
步骤M24I:逐个读取子模块名;再跳转到步骤M24J;
步骤M24J:将读取到的每个子模块名依次与模块信息检索表my_table中各行的列name中已经定义的模块名比较,判断是否已经被定义;如果已经定义,则跳转到步骤M24K;否则跳转到步骤M24M;
步骤M24K:判断已经定义的模块是否已连接至父节点;如果没有连接至父节点,则跳转到步骤M24L;如果已连接至父节点,则跳转到步骤M24O;
步骤M24L:把步骤M24K已经定义模块定义为步骤M241读取模块的子模块的兄弟模块,并把步骤M24K已经定义模块的列has_father填入1,把列pointer_tree_node存放的链表树节点地址值赋值为当前父模块对应链表树节点的child_tree_node的成员变量next_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;跳转到步骤M245;
步骤M24M:在模块信息检索表my_table中建立新一行,来表示当前读取到的子模块;再跳转到步骤M24N;
步骤M24N:依次向新建立的该行的各列填入数据,列name填入当前读取到的子模块名;列has_data填入0,表示还未填入资源信息;列has_father填入1,表示已连接至父模块;第四列valid_number增加1;列pointer_tree_node填入当前读取到的链表树节点信息,并把列pointer_tree_node存储的值返回至步骤M241中模块名对应链表树节点的child_tree_node的变量next_tree_node_pointer的值;再跳转到步骤M245;
步骤M24O:判断已经定义的模块对应的节点树的child_tree_node_pointer是否为0;如果是0,则跳转到步骤M24Q;如果不是0,则跳转到步骤M24P;
步骤M24P:以已经定义的模块为根节点,在模块信息检索表my_table中遍历并复制这个节点对应模块和它的子模块,将复制后链表树节点的地址值赋值为步骤M241中模块名对应链表树节点的child_tree_node的成员变量next_tree_node_pointer的值;跳转到步骤M245;
步骤M24Q:定义一个新链表树节点,链表树节点的成员变量child_tree_node_pointer、next_tree_node_pointer均赋值为0,链表树的成员变量pointer_logic_data_str=赋值为步骤M24O已经定义的模块对应链表树节点中的成员变量pointer_logic_data_str;在信息检索表中最后一行新建一行,再跳转到步骤M24R;
步骤M24R:依次向模块信息检索表my_table中新创建的一行填入数据,列name、列has_data以及列has_father分别赋值为步骤M24O已经定义模块的列name、列has_data以及列has_father,列vaild_number是上一行vaild_number的值加1,列pointer_tree_node值是步骤M24P定义的链表树节点的地址;并把列pointer_tree_node存放的地址值赋值为当前父模块对应链表树节点的的child_tree_node的成员变量next_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;再跳转到步骤M245。
可选地,步骤M27包括:
步骤M271,遍历模块信息检索表my_table中列has_father为0的行对应模块;再跳转到步骤M272;
步骤M272:判断模块信息检索表my_table中列has_father为0的行对应模块总数量是否为1,如果数量是1,则跳转到M273;如果数量不是1,则跳转到步骤M274;
步骤M273:输出列has_father为0的模块名,并递归遍历输出其对应的链表树节点及其所有成员变量child_tree_node和next_tree_node至链表文件中,得到基于链表树的硬件逻辑设计层次结构信息;结束并退出;
步骤M274:退出程序执行并提示硬件逻辑设计层次结构提取算法提取出错或程序设计处理算法执行出错。
可选地,步骤M2中得到基于链表树的硬件逻辑设计层次结构信息之后,还包括针对得到的基于链表树的硬件逻辑设计层次结构信息以可视化的方式直观展示硬件设计的层次结构。
此外,本发明还提供一种基于链表树的硬件逻辑设计层次结构信息提取系统,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述基于链表树的硬件逻辑设计层次结构信息提取方法。
此外,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序用于被微处理器编程或配置以执行所述基于链表树的硬件逻辑设计层次结构信息提取方法。
和现有技术相比,本发明主要具有下述优点:本发明包括使用综合工具将硬件设计的RTL代码综合为一组网表文件,提取网表文件中的信息,得到硬件设计综合报告文件,处理硬件设计综合报告文件生成基于链表树的硬件逻辑设计层次结构信息,本发明从一组硬件模块网表文件中提取设计层级结构信息,并以链表树的方式组织和存储,为逻辑划分算法提供输入,本发明具有层次结构信息提取方便、存储空间资源占用少的优点,并且可进行可视化展示以便于FPGA原型验证系统开发人员直观地理解硬件逻辑设计层次结构。
附图说明
图1为本发明实施例方法的基本流程示意图。
图2为本发明实施例中生成硬件设计综合报告文件的流程示意图。
图3为本发明实施例中处理硬件设计综合报告文件的流程示意图。
图4为本发明实施例中输出判断的流程示意图。
图5为本发明实施例中生成基于链表树的硬件逻辑设计层次结构信息的流程示意图。
图6为本发明实施例中可视化链表树结构流程示意图。
图7为本发明实施例中的普通树型层次结构图。
图8为本发明实施例中生成基于链表树的硬件逻辑设计层次结构信息截图。
具体实施方式
如图1所示,本实施例基于链表树的硬件逻辑设计层次结构信息提取方法包括:
步骤M1:使用综合工具将硬件设计的RTL代码综合为一组网表文件,提取网表文件中的信息,得到硬件设计综合报告文件;
步骤M2:处理硬件设计综合报告文件,生成基于链表树的硬件逻辑设计层次结构信息。
如图2所示,本实施例步骤M1包括:
步骤M11:使用综合工具对硬件设计RTL代码进行综合,生成硬件设计RTL代码中每个模块的网表文件,每个网表文件中包含该模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口信息;
步骤M12:根据关键字逐一对每个网表文件进行处理,提取网表文件中的模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口信息,生成每个网表文件对应的模块综合报告文件,将生成的所有模块综合报告文件进行汇总以得到硬件设计综合报告文件。
本实施例中,步骤M11中使用综合工具yosys将用verilog描述的硬件设计RTL代码综合为一组网表文件,使用yosys命令:yosys-import;read_verilog;hierarchy-auto-top;procs、opt、fsm、opt、memory、opt;techmap、opt;abc-lut 4;tee-o log*stat(命令顺序以;隔开),按命令先后顺序来对硬件设计RTL代码进行综合,生成每个模块的网表文件,每个网表文件中包含该模块中wire、wire_bits、public_wires、public_wire_bits、memories、memory_bits、processes各变量数量的信息。其中:yosys-import的含义是将所有yosys命令作为tcl命令导入到tcl shell中;read_verilog的含义是将模块从Verilog文件加载到当前设计中;hierarchy-auto-top的含义是自动确定设计层次结构的顶层模块并标记它;procs、opt、fsm、opt、memory、opt的含义分别是将行为级描述转换为D型触发器和多路复用器、优化、提取和优化有限状态机、优化、将高级内存结构转换为D型触发器和多路复用器、优化;techmap、opt的含义是使用通用方法映射、执行简单的优化;abc-lut 4的含义是使用ABC工具来将yosys的内部门映射到lut4的网列表;tee-o log*stat的含义是把stat命令输出信息,重定向到log*(*=0、1、2、3......)文件中;stat的含义是输出当前设计中的各模块资源;步骤M11中wire的含义是网表型资源;bits是将所有元素的位相加,这样就可以在粗粒度(整个总线是一个元素)和细粒度(每个位是一个元素)之间进行比较;wire_bits的含义是所有网表资源位相加的和;public_wires的含义是公开的网表资源;public_wire_bits的含义是所有公开的网表资源位相加的和;memories的含义是可寻址的内存(数组);memory_bits的含义是所有memory位相加的和;processes的含义是决策树(if-then-else语句等),以及来自Verilog always语句和VHDL进程块(时钟信号和灵敏度)同步声明。
本实施例中,步骤M12根据关键字对所述步骤M11中得到的一组网表文件中的信息进行提取,使用以python实现的网表信息提取算法逐一对每个网表文件进行处理,提取网表文件中的模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口等信息,生成每个网表文件对应的模块综合报告文件log*(n=0,1,2,3……),将生成的所有模块综合报告文件进行汇总,得到硬件设计综合报告文件。
本实施例中,步骤M1中硬件设计综合报告文件中每一行的格式为:
模块名wires_n wire_bits_n public_wires_n public_wire_bits_n memory_nmemory_bits_nprocesses_n['子模块a名','子模块b名','子模块c名',……],
其中,wire_n表示该模块中信号线的数量为n;wire_bits_n表示该模块中所有信号线位宽之和为n bits;memory_n表示该模块中寄存器数组的个数是n;memory_bits_n表示该模块中所有寄存器数组的存储容量之和是n bits;processes_n表示该模块中if-then-else逻辑块、Verilog语法中的always逻辑块以及VHDL语法中的进程逻辑块的数量之和是n;['子模块a名','子模块b名','子模块c名',……]是该模块所例化的各个子模块的名称。例如,部分模块的格式为:
presclr_wdt wires_137wire_bits_226public_wires_24public_wire_bits_45memories_0memory_bits_0processes_0
inc8 wires_23wire_bits_44public_wires_2public_wire_bits_16memories_0memory_bits_0processes_0
alu wires_152wire_bits_321public_wires_19public_wire_bits_106memories_0memory_bits_0processes_0['add_sub8_co_1','mux2_8_1','mux4_8_4']
mux2_7wires_26wire_bits_44public_wires_4public_wire_bits_22memories_0memory_bits_0processes_0
mux2_11wires_38wire_bits_68public_wires_4public_wire_bits_34memories_0memory_bits_0processes_0
……
如图3所示,本实施例中步骤M2包括:
步骤M21:定义模块信息检索表my_table,所述模块信息检索表my_table的每一行用于存储一个模块对应链表树节点的相关信息;
步骤M22:定义模块逻辑资源结构体logic_data_str以记录模块所需的逻辑资源信息;
步骤M23:从硬件设计综合报告文件中读取一行,继续执行步骤M24;
步骤M24:对读取的一行信息进行链表树构建,继续执行步骤M25;
步骤M25:判断硬件设计综合报告文件是否读取完毕,如果读取完毕,则跳转到步骤M27;如果还未读取完毕,则继续执行步骤M26;
步骤M26:读取硬件设计综合报告文件中下一行的模块信息文件,跳转到步骤M24;
步骤M27:链表树正确构建并将链表树输出或中止程序执行并提示程序执行出错,跳转至步骤M3。
本实施例中,步骤M21中模块信息检索表my_table的列信息如表1所示。
表1:模块信息检索表my_table的列字段表。
参见表1,步骤M21中模块信息检索表my_table的每一行的列分别包括:(第一列)列name为当前行存储的模块对应的链表树节点名;(第二列)列has_data用于表示当前行存储的节点中是否已填入了该模块所需的逻辑资源信息,当列has_data为1时表示已填入该模块所需的逻辑资源信息,当列has_data为0时表示还未填入该模块所需的逻辑资源信息;(第三列)列has_father用于表示当前行存储的模块对应的链表树节点是否已连接至其父节点,当列has_father为1时表示已连接至父节点,当列has_father为0时表示还未连接至父节点;(第四列)列valid_number为当前行在模块信息检索表my_table中的行数;(第五列)列pointer_data_node为指向当前行存储的模块对应链表树节点地址的指针;所述链表树节点为一种链表树型数据结构体tree_node,该结构体包含三个成员变量,包括:成员变量pointer_logic_data_str,为指向当前节点的所需逻辑资源信息结构体logic_data_str地址的指针,成员变量child_tree_node_pointer为指向当前链表树节点的子节点child_tree_node地址的指针,成员变量next_tree_node_pointer为指向当前链表树节点的兄弟节点next_tree_node地址的指针;所述父节点是指以当前模块为子节点的链表树节点;步骤M22中模块逻辑资源结构体logic_data_str记录的逻辑资源信息,为链表树节点结构体中成员变量pointer_logic_data_str所指向的数据对象,所述模块逻辑资源结构体logic_data_str的成员变量包括str_mod_name、str_wires、str_wires_bit、str_public_wires、str_public_wires_bits、str_memories、str_memory_bits以及str_processes,分别与硬件设计综合报告文件中每一行字段中的模块名、wires_n、wire_bits_n、public_wires_n、public_wire_bits_n、memory_n、memory_bits_n以及processes_n一一对应。
如图5所示,本实施例中步骤M24包括:
步骤M241:将读取的模块名逐行地与模块信息检索表my_table的列name进行对比,判断该模块是否已经注册,如果判断已经注册,则跳转到步骤M242,否则跳转到步骤M243;
步骤M242:使用已经注册模块所在行的列pointer_tree_node,找到该模块对应的链表树节点tree_node,再用链表树节点tree_node中的成员变量pointer_logic_data_str找到该模块对应的逻辑资源结构体logic_data_str,将读取信息中各逻辑资源项依次填进该结构体logic_data_str的各变量中,并将该行列has_data赋值为1,再跳转到步骤M245;
步骤M243:为该模块创建模块逻辑资源结构体logic_data_str,新创建的模块逻辑资源结构体logic_data_str各变量中依次填入读取到的该模块的各逻辑资源信息,为该模块创建一个链表树节点,该链表树节点的成员变量pointer_logic_data_str指向为该模块创建的模块逻辑资源结构体,成员变量child_tree_node_pointer赋值为空,成员变量next_tree_node_pointer赋值为空;在模块信息检索表my_table中建立新一行,继续执行步骤M244;
步骤M244:依次向模块信息检索表my_table中新创建的一行填入数据,列name填入读取到的模块名,列has_data填入1,表示已记录该模块的逻辑资源信息;列has_father填入0,表示该模块对应的链表树节点还未与其父节点关联;列valid_number填入该行的行数;列pointer_data指向为该模块创建的链表树节点,继续执行步骤M245;
步骤M245:判断读取的模块中是否例化子模块,如果判断例化子模块,则跳转到步骤M246;如果判断没有例化子模块,则进入下一行文本的判断,跳转到步骤M24H;
步骤M246:判断读取模块对应链表树节点的成员变量child_tree_node_pointer是否为0;如果是0,跳转到步骤M247;如果不是0,跳转到步骤M24I;
步骤M247:读取该模块的第一个子模块名,跳转到步骤M248;
步骤M248:将读取到的子模块名依次与模块信息检索表my_table中各行列name中已经定义的模块名比较判断是否已被定义,如果已被定义,则跳转步骤M249,否则跳转步骤M24B;
步骤M249:判断已经定义模块是否已连接至父节点,如果判断没有连接至父节点,则跳转到M24A;如果判断已连接至父节点,则跳转步骤M24D;
步骤M24A:把步骤M249已经定义模块定义为步骤M241读取的模块对应链表树节点的子节点,并把步骤M249已经定义模块所在行的列has_father填入1,把列pointer_tree_node存放的值赋值为当前父模块对应链表树节点的成员变量child_tree_node_pointer的值,其中当前父模块为步骤M241读取的模块;再跳转到步骤M245;
步骤M24B:在模块信息检索表my_table中建立新一行,来表示当前读取到的子模块;再跳转到步骤M24C;
步骤M24C:依次向该行的各列填入数据,列name填入当前读取到的子模块名;列has_data填入0,表示还未读取到资源信息;列has_father填入1,表示此模块对应的链表树节点已连接至父节点;列valid_number增加1;列pointer_tree_node填入当前读取到的链表树节点信息,并把列pointer_tree_node存储的值返回至步骤M241模块名对应链表树节点的成员变量child_tree_node_pointer的值;再跳转到步骤M245;
步骤M24D:判断已经定义的模块对应链表树节点的成员变量child_tree_node_pointer是否为0;如果不是0,则跳转到步骤M24E;如果是0,则跳转到步骤M24F;
步骤M24E:以已经定义的模块为根节点,在模块信息检索表my_table中遍历并复制这个节点对应模块、子模块及链表树节点,将复制后链表树节点的地址值赋值为步骤M241所述模块名对应链表树节点的成员变量child_tree_node_pointer的值;再跳转到步骤M245;
步骤M24F:依据已定义的模块,定义一个新链表树节点,链表树节点的成员变量child_tree_node_pointer和成员变量next_tree_node_pointer赋值0,链表树节点的pointer_logic_data_str赋值等于步骤M24D已经定义的模块对应链表树节点中的成员变量pointer_logic_data_str;在模块信息检索表my_table中最后一行新建一行,再跳转到步骤M24G;
步骤M24G:依次向模块信息检索表my_table中新创建的一行填入数据,列name、列has_data以及列has_father赋值为步骤M249已经定义模块的列name、列has_data以及列has_father,列vaild_number是上一行vaild_number的值加1,列pointer_tree_node值是步骤M24F中定义的链表树节点的地址;并把列pointer_tree_node存放的地址值赋值为当前父模块对应链表树节点的成员变量child_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;再跳转到步骤M245;
步骤M24H:跳转步骤M25以进入下一行文本的判断,结束并退出;
步骤M24I:逐个读取子模块名;再跳转到步骤M24J;
步骤M24J:将读取到的每个子模块名依次与模块信息检索表my_table中各行的列name中已经定义的模块名比较,判断是否已经被定义;如果已经定义,则跳转到步骤M24K;否则跳转到步骤M24M;
步骤M24K:判断已经定义的模块是否已连接至父节点;如果没有连接至父节点,则跳转到步骤M24L;如果已连接至父节点,则跳转到步骤M24O;
步骤M24L:把步骤M24K已经定义模块定义为步骤M241读取模块的子模块的兄弟模块,并把步骤M24K已经定义模块的列has_father填入1,把列pointer_tree_node存放的链表树节点地址值赋值为当前父模块对应链表树节点的child_tree_node的成员变量next_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;跳转到步骤M245;
步骤M24M:在模块信息检索表my_table中建立新一行,来表示当前读取到的子模块;再跳转到步骤M24N;
步骤M24N:依次向新建立的该行的各列填入数据,列name填入当前读取到的子模块名;列has_data填入0,表示还未填入资源信息;列has_father填入1,表示已连接至父模块;第四列valid_number增加1;列pointer_tree_node填入当前读取到的链表树节点信息,并把列pointer_tree_node存储的值返回至步骤M241中模块名对应链表树节点的child_tree_node的变量next_tree_node_pointer的值;再跳转到步骤M245;
步骤M24O:判断已经定义的模块对应的节点树的child_tree_node_pointer是否为0;如果是0,则跳转到步骤M24Q;如果不是0,则跳转到步骤M24P;
步骤M24P:以已经定义的模块为根节点,在模块信息检索表my_table中遍历并复制这个节点对应模块和它的子模块,将复制后链表树节点的地址值赋值为步骤M241中模块名对应链表树节点的child_tree_node的成员变量next_tree_node_pointer的值;跳转到步骤M245;
步骤M24Q:定义一个新链表树节点,链表树节点的成员变量child_tree_node_pointer、next_tree_node_pointer均赋值为0,链表树的成员变量pointer_logic_data_str=赋值为步骤M24O已经定义的模块对应链表树节点中的成员变量pointer_logic_data_str;在信息检索表中最后一行新建一行,再跳转到步骤M24R;
步骤M24R:依次向模块信息检索表my_table中新创建的一行填入数据,列name、列has_data以及列has_father分别赋值为步骤M24O已经定义模块的列name、列has_data以及列has_father,列vaild_number是上一行vaild_number的值加1,列pointer_tree_node值是步骤M24P定义的链表树节点的地址;并把列pointer_tree_node存放的地址值赋值为当前父模块对应链表树节点的的child_tree_node的成员变量next_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;再跳转到步骤M245。
总结而言,步骤M241~M24R对读取的一行信息进行链表树构建共有18种情况,具体如表2所示。
表2:链表树构建种类及步骤。
表2中所述新(旧)模块是指读取到的模块名在读取此模块之前,此模块在my_table中没有(已经)注册;所述有(无)子模块是指读取到的模块还有(暂无)例化其它模块;所述新(旧)模块的child节点为0(1)是指新(旧)模块对应的链表树节点的子节点值为0(1);所述子模块没有(已经)注册是指当前读取到的子模块在读取此子模块之前,此子模块在my_table中没有(已经)注册;所述已注册子模块没有(已经)连接至父模块是指当前读取到在my_table中已经注册的子模块所在行的has_father是0(1);所述已注册子模块没有(有)子模块是指当前读取到的在my_table中已经注册的子模块对应的链表树节点的child_tree_node_pointer=0(1)。
如图4所示,本实施例中步骤M27包括:
步骤M271,遍历模块信息检索表my_table中列has_father为0的行对应模块;再跳转到步骤M272;
步骤M272:判断模块信息检索表my_table中列has_father为0的行对应模块总数量是否为1,如果数量是1,则跳转到M273;如果数量不是1,则跳转到步骤M274;
步骤M273:输出列has_father为0的模块名,并递归遍历输出其对应的链表树节点及其所有成员变量child_tree_node和next_tree_node至链表文件中,得到基于链表树的硬件逻辑设计层次结构信息;结束并退出;
步骤M274:退出程序执行并提示硬件逻辑设计层次结构提取算法提取出错或程序设计处理算法执行出错。
参见图1,本实施例中步骤M2中得到基于链表树的硬件逻辑设计层次结构信息之后,还包括针对得到的基于链表树的硬件逻辑设计层次结构信息以可视化的方式直观展示硬件设计的层次结构。
如图6所示,以可视化的方式直观展示硬件设计的层次结构包括:
步骤M31:定义一个递归画图函数draw(),包含画图动作lambda和递归遍历左节点,执行递归画图函数draw(),再跳转到步骤M32;
步骤M32:判断步骤M31的结果是否生成,如果没有生成,则跳转到步骤M33;如果生成,则跳转到步骤M34;
步骤M33:退出程序,并输出:硬件设计层次结构链表树可视化算法执行出错;
步骤M34:将结果输出至图片格式,并打开图片;再跳转到步骤M35;
步骤M35:打开图片;输出:可视化成功;跳转到步骤M3主程序,退出所有程序。
递归画图函数draw()的参数为左节点名,可表示为:draw(左节点名)。
画图动作lambda的参数为节点名,可表示为lambda(节点名),lambda(节点名)执行过程包括:若节点名等于根节点,则执行动作:画根节点的成员变量logic_data_str;否则,在当前节点的父节点下画单向线段+当前节点的成员变量logic_data_str,递归遍历当前节点的右节点。lambda(节点名)执行过程中,递归遍历当前节点的右节点可表达为:draw(右节点名)。图7所示为本实施例中以可视化的方式直观展示硬件设计的层次结构得到的结果,图8为生成该硬件设计的层次结构的模块信息示意图。
综上所述,本实施例提供了一种面向FPGA原型验证系统逻辑划分的设计层次结构链表树生成方法,包含硬件设计RTL代码综合、构建设计层次结构链表树和设计层次结构链表树可视化等步骤,可从一组硬件模块网表文件中提取设计层级结构信息,并以链表树的方式组织和存储,为逻辑划分算法提供输入,本发明具有层次结构信息提取方便、存储空间资源占用少的优点,并且可进行可视化展示以便于FPGA原型验证系统开发人员直观地理解硬件逻辑设计层次结构。通过本实施例方法,FPGA原型验证系统开发人员可以清晰地了解设计层次结构,并为FPGA原型验证系统的逻辑划分算法提供一种占用存储空间更小的设计层次结构信息表示方法。
此外,本实施例还提供一种基于链表树的硬件逻辑设计层次结构信息提取系统,包括相互连接的微处理器和存储器,微处理器被编程或配置以执行基于链表树的硬件逻辑设计层次结构信息提取方法。此外,本实施例还提供一种计算机可读存储介质,计算机可读存储介质中存储有计算机程序,计算机程序用于被微处理器编程或配置以执行基于链表树的硬件逻辑设计层次结构信息提取方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,包括:
步骤M1:使用综合工具将硬件设计的RTL代码综合为一组网表文件,提取网表文件中的信息,得到硬件设计综合报告文件;
步骤M2:处理硬件设计综合报告文件,生成基于链表树的硬件逻辑设计层次结构信息。
2.根据权利要求1所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M1包括:
步骤M11:使用综合工具对硬件设计RTL代码进行综合,生成硬件设计RTL代码中每个模块的网表文件,每个网表文件中包含该模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口信息;
步骤M12:根据关键字逐一对每个网表文件进行处理,提取网表文件中的模块直接使用的寄存器和信号线资源、调用的子模块以及输入输出端口信息,生成每个网表文件对应的模块综合报告文件,将生成的所有模块综合报告文件进行汇总以得到硬件设计综合报告文件。
3.根据权利要求1所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M1中硬件设计综合报告文件中每一行的格式为:
模块名wires_n wire_bits_n public_wires_n public_wire_bits_n memory_nmemory_bits_nprocesses_n['子模块a名','子模块b名','子模块c名',……],
其中,wire_n表示该模块中信号线的数量为n;wire_bits_n表示该模块中所有信号线位宽之和为n bits;memory_n表示该模块中寄存器数组的个数是n;memory_bits_n表示该模块中所有寄存器数组的存储容量之和是n bits;processes_n表示该模块中if-then-else逻辑块、Verilog语法中的always逻辑块以及VHDL语法中的进程逻辑块的数量之和是n;['子模块a名','子模块b名','子模块c名',……]是该模块所例化的各个子模块的名称。
4.根据权利要求3所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M2包括:
步骤M21:定义模块信息检索表my_table,所述模块信息检索表my_table的每一行用于存储一个模块对应链表树节点的相关信息;
步骤M22:定义模块逻辑资源结构体logic_data_str以记录模块所需的逻辑资源信息;
步骤M23:从硬件设计综合报告文件中读取一行,继续执行步骤M24;
步骤M24:对读取的一行信息进行链表树构建,继续执行步骤M25;
步骤M25:判断硬件设计综合报告文件是否读取完毕,如果读取完毕,则跳转到步骤M27;如果还未读取完毕,则继续执行步骤M26;
步骤M26:读取硬件设计综合报告文件中下一行的模块信息文件,跳转到步骤M24;
步骤M27:链表树正确构建并将链表树输出或中止程序执行并提示程序执行出错,跳转至步骤M3。
5.根据权利要求4所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M21中模块信息检索表my_table的每一行的列分别包括:列name为当前行存储的模块对应的链表树节点名;列has_data用于表示当前行存储的节点中是否已填入了该模块所需的逻辑资源信息,当列has_data为1时表示已填入该模块所需的逻辑资源信息,当列has_data为0时表示还未填入该模块所需的逻辑资源信息;列has_father用于表示当前行存储的模块对应的链表树节点是否已连接至其父节点,当列has_father为1时表示已连接至父节点,当列has_father为0时表示还未连接至父节点;列valid_number为当前行在模块信息检索表my_table中的行数;列pointer_data_node为指向当前行存储的模块对应链表树节点地址的指针;所述链表树节点为一种链表树型数据结构体tree_node,该结构体包含三个成员变量,包括:成员变量pointer_logic_data_str,为指向当前节点的所需逻辑资源信息结构体logic_data_str地址的指针,成员变量child_tree_node_pointer为指向当前链表树节点的子节点child_tree_node地址的指针,成员变量next_tree_node_pointer为指向当前链表树节点的兄弟节点next_tree_node地址的指针;所述父节点是指以当前模块为子节点的链表树节点;步骤M22中模块逻辑资源结构体logic_data_str记录的逻辑资源信息,为链表树节点结构体中成员变量pointer_logic_data_str所指向的数据对象,所述模块逻辑资源结构体logic_data_str的成员变量包括str_mod_name、str_wires、str_wires_bit、str_public_wires、str_public_wires_bits、str_memories、str_memory_bits以及str_processes,分别与硬件设计综合报告文件中每一行字段中的模块名、wires_n、wire_bits_n、public_wires_n、public_wire_bits_n、memory_n、memory_bits_n以及processes_n一一对应。
6.根据权利要求5所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M24包括:
步骤M241:将读取的模块名逐行地与模块信息检索表my_table的列name进行对比,判断该模块是否已经注册,如果判断已经注册,则跳转到步骤M242,否则跳转到步骤M243;
步骤M242:使用已经注册模块所在行的列pointer_tree_node,找到该模块对应的链表树节点tree_node,再用链表树节点tree_node中的成员变量pointer_logic_data_str找到该模块对应的逻辑资源结构体logic_data_str,将读取信息中各逻辑资源项依次填进该结构体logic_data_str的各变量中,并将该行列has_data赋值为1,再跳转到步骤M245;
步骤M243:为该模块创建模块逻辑资源结构体logic_data_str,新创建的模块逻辑资源结构体logic_data_str各变量中依次填入读取到的该模块的各逻辑资源信息,为该模块创建一个链表树节点,该链表树节点的成员变量pointer_logic_data_str指向为该模块创建的模块逻辑资源结构体,成员变量child_tree_node_pointer赋值为空,成员变量next_tree_node_pointer赋值为空;在模块信息检索表my_table中建立新一行,继续执行步骤M244;
步骤M244:依次向模块信息检索表my_table中新创建的一行填入数据,列name填入读取到的模块名,列has_data填入1,表示已记录该模块的逻辑资源信息;列has_father填入0,表示该模块对应的链表树节点还未与其父节点关联;列valid_number填入该行的行数;列pointer_data指向为该模块创建的链表树节点,继续执行步骤M245;
步骤M245:判断读取的模块中是否例化子模块,如果判断例化子模块,则跳转到步骤M246;如果判断没有例化子模块,则进入下一行文本的判断,跳转到步骤M24H;
步骤M246:判断读取模块对应链表树节点的成员变量child_tree_node_pointer是否为0;如果是0,跳转到步骤M247;如果不是0,跳转到步骤M24I;
步骤M247:读取该模块的第一个子模块名,跳转到步骤M248;
步骤M248:将读取到的子模块名依次与模块信息检索表my_table中各行列name中已经定义的模块名比较判断是否已被定义,如果已被定义,则跳转步骤M249,否则跳转步骤M24B;
步骤M249:判断已经定义模块是否已连接至父节点,如果判断没有连接至父节点,则跳转到M24A;如果判断已连接至父节点,则跳转步骤M24D;
步骤M24A:把步骤M249已经定义模块定义为步骤M241读取的模块对应链表树节点的子节点,并把步骤M249已经定义模块所在行的列has_father填入1,把列pointer_tree_node存放的值赋值为当前父模块对应链表树节点的成员变量child_tree_node_pointer的值,其中当前父模块为步骤M241读取的模块;再跳转到步骤M245;
步骤M24B:在模块信息检索表my_table中建立新一行,来表示当前读取到的子模块;再跳转到步骤M24C;
步骤M24C:依次向该行的各列填入数据,列name填入当前读取到的子模块名;列has_data填入0,表示还未读取到资源信息;列has_father填入1,表示此模块对应的链表树节点已连接至父节点;列valid_number增加1;列pointer_tree_node填入当前读取到的链表树节点信息,并把列pointer_tree_node存储的值返回至步骤M241模块名对应链表树节点的成员变量child_tree_node_pointer的值;再跳转到步骤M245;
步骤M24D:判断已经定义的模块对应链表树节点的成员变量child_tree_node_pointer是否为0;如果不是0,则跳转到步骤M24E;如果是0,则跳转到步骤M24F;
步骤M24E:以已经定义的模块为根节点,在模块信息检索表my_table中遍历并复制这个节点对应模块、子模块及链表树节点,将复制后链表树节点的地址值赋值为步骤M241所述模块名对应链表树节点的成员变量child_tree_node_pointer的值;再跳转到步骤M245;
步骤M24F:依据已定义的模块,定义一个新链表树节点,链表树节点的成员变量child_tree_node_pointer和成员变量next_tree_node_pointer赋值0,链表树节点的pointer_logic_data_str赋值等于步骤M24D已经定义的模块对应链表树节点中的成员变量pointer_logic_data_str;在模块信息检索表my_table中最后一行新建一行,再跳转到步骤M24G;
步骤M24G:依次向模块信息检索表my_table中新创建的一行填入数据,列name、列has_data以及列has_father赋值为步骤M249已经定义模块的列name、列has_data以及列has_father,列vaild_number是上一行vaild_number的值加1,列pointer_tree_node值是步骤M24F中定义的链表树节点的地址;并把列pointer_tree_node存放的地址值赋值为当前父模块对应链表树节点的成员变量child_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;再跳转到步骤M245;
步骤M24H:跳转步骤M25以进入下一行文本的判断,结束并退出;
步骤M24I:逐个读取子模块名;再跳转到步骤M24J;
步骤M24J:将读取到的每个子模块名依次与模块信息检索表my_table中各行的列name中已经定义的模块名比较,判断是否已经被定义;如果已经定义,则跳转到步骤M24K;否则跳转到步骤M24M;
步骤M24K:判断已经定义的模块是否已连接至父节点;如果没有连接至父节点,则跳转到步骤M24L;如果已连接至父节点,则跳转到步骤M24O;
步骤M24L:把步骤M24K已经定义模块定义为步骤M241读取模块的子模块的兄弟模块,并把步骤M24K已经定义模块的列has_father填入1,把列pointer_tree_node存放的链表树节点地址值赋值为当前父模块对应链表树节点的child_tree_node的成员变量next_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;跳转到步骤M245;
步骤M24M:在模块信息检索表my_table中建立新一行,来表示当前读取到的子模块;再跳转到步骤M24N;
步骤M24N:依次向新建立的该行的各列填入数据,列name填入当前读取到的子模块名;列has_data填入0,表示还未填入资源信息;列has_father填入1,表示已连接至父模块;第四列valid_number增加1;列pointer_tree_node填入当前读取到的链表树节点信息,并把列pointer_tree_node存储的值返回至步骤M241中模块名对应链表树节点的child_tree_node的变量next_tree_node_pointer的值;再跳转到步骤M245;
步骤M24O:判断已经定义的模块对应的节点树的child_tree_node_pointer是否为0;如果是0,则跳转到步骤M24Q;如果不是0,则跳转到步骤M24P;
步骤M24P:以已经定义的模块为根节点,在模块信息检索表my_table中遍历并复制这个节点对应模块和它的子模块,将复制后链表树节点的地址值赋值为步骤M241中模块名对应链表树节点的child_tree_node的成员变量next_tree_node_pointer的值;跳转到步骤M245;
步骤M24Q:定义一个新链表树节点,链表树节点的成员变量child_tree_node_pointer、next_tree_node_pointer均赋值为0,链表树的成员变量pointer_logic_data_str=赋值为步骤M24O已经定义的模块对应链表树节点中的成员变量pointer_logic_data_str;在信息检索表中最后一行新建一行,再跳转到步骤M24R;
步骤M24R:依次向模块信息检索表my_table中新创建的一行填入数据,列name、列has_data以及列has_father分别赋值为步骤M24O已经定义模块的列name、列has_data以及列has_father,列vaild_number是上一行vaild_number的值加1,列pointer_tree_node值是步骤M24P定义的链表树节点的地址;并把列pointer_tree_node存放的地址值赋值为当前父模块对应链表树节点的的child_tree_node的成员变量next_tree_node_pointer的值,其中当前父模块为步骤M241所述读取的模块;再跳转到步骤M245。
7.根据权利要求5所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M27包括:
步骤M271,遍历模块信息检索表my_table中列has_father为0的行对应模块;再跳转到步骤M272;
步骤M272:判断模块信息检索表my_table中列has_father为0的行对应模块总数量是否为1,如果数量是1,则跳转到M273;如果数量不是1,则跳转到步骤M274;
步骤M273:输出列has_father为0的模块名,并递归遍历输出其对应的链表树节点及其所有成员变量child_tree_node和next_tree_node至链表文件中,得到基于链表树的硬件逻辑设计层次结构信息;结束并退出;
步骤M274:退出程序执行并提示硬件逻辑设计层次结构提取算法提取出错或程序设计处理算法执行出错。
8.根据权利要求1所述的基于链表树的硬件逻辑设计层次结构信息提取方法,其特征在于,步骤M2中得到基于链表树的硬件逻辑设计层次结构信息之后,还包括针对得到的基于链表树的硬件逻辑设计层次结构信息以可视化的方式直观展示硬件设计的层次结构。
9.一种基于链表树的硬件逻辑设计层次结构信息提取系统,包括相互连接的微处理器和存储器,其特征在于,所述微处理器被编程或配置以执行权利要求1~8中任意一项所述基于链表树的硬件逻辑设计层次结构信息提取方法。
10.一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其特征在于,所述计算机程序用于被微处理器编程或配置以执行权利要求1~8中任意一项所述基于链表树的硬件逻辑设计层次结构信息提取方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310074294.1A CN116050312A (zh) | 2023-01-17 | 2023-01-17 | 基于链表树的硬件逻辑设计层次结构信息提取方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310074294.1A CN116050312A (zh) | 2023-01-17 | 2023-01-17 | 基于链表树的硬件逻辑设计层次结构信息提取方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116050312A true CN116050312A (zh) | 2023-05-02 |
Family
ID=86123784
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310074294.1A Pending CN116050312A (zh) | 2023-01-17 | 2023-01-17 | 基于链表树的硬件逻辑设计层次结构信息提取方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116050312A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820432A (zh) * | 2023-08-30 | 2023-09-29 | 中国人民解放军国防科技大学 | 一种bmc固件自动适配主板传感器的方法及系统 |
-
2023
- 2023-01-17 CN CN202310074294.1A patent/CN116050312A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820432A (zh) * | 2023-08-30 | 2023-09-29 | 中国人民解放军国防科技大学 | 一种bmc固件自动适配主板传感器的方法及系统 |
CN116820432B (zh) * | 2023-08-30 | 2023-11-21 | 中国人民解放军国防科技大学 | 一种bmc固件自动适配主板传感器的方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9335977B2 (en) | Optimization of a data flow program based on access pattern information | |
Codetta-Raiteri | The conversion of dynamic fault trees to stochastic Petri nets, as a case of graph transformation | |
CN110007902A (zh) | 业务处理流程配置的方法及装置 | |
US7865346B2 (en) | Instruction encoding in a hardware simulation accelerator | |
JPH03156572A (ja) | 論理回路比較検証システムおよび方法 | |
CN105138769B (zh) | 一种用于可编程电路的时序模型生成方法及装置 | |
JP2007510223A (ja) | ダイアグラミング環境言語のための単純化データ信号サポート | |
CN116050312A (zh) | 基于链表树的硬件逻辑设计层次结构信息提取方法及系统 | |
CN114841103B (zh) | 门级电路的并行仿真方法、系统、存储介质及设备 | |
CN114692532A (zh) | 芯片系统的集成方法、装置及计算机可读存储介质 | |
US20150088483A1 (en) | Simulated component connector definition and connection process | |
CN113420520A (zh) | 集成电路装置设计仿真方法、装置、设备和可读存储介质 | |
Bunker et al. | Formal hardware specification languages for protocol compliance verification | |
Van Eijk | Formal methods for the verification of digital circuits | |
Zengler et al. | Encoding the Linux kernel configuration in propositional logic | |
CN108334313A (zh) | 用于大型soc研发的持续集成方法、装置及代码管理系统 | |
US5761488A (en) | Logic translation method for increasing simulation emulation efficiency | |
CN104636509A (zh) | 门级仿真中验证时序问题的方法 | |
CN114861574A (zh) | 一种应用于层次化物理设计的逻辑简化方法 | |
CN113515909A (zh) | 门级网表的处理方法、计算机存储介质 | |
CN115705446A (zh) | 集成电路的后仿真方法和装置 | |
Meyer et al. | Design and synthesis of array structured telecommunication processing applications | |
CN105787214A (zh) | 一种验证模型的方法及装置 | |
CN112395818A (zh) | 基于SysML的硬件算法模型构建方法 | |
US8661329B1 (en) | Generation of readable hierarchical path identifiers |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |