一种基于递归多叉树的门控时钟转换方法技术

技术编号:27357321 阅读:12 留言:0更新日期:2021-02-19 13:37
本发明专利技术公开了一种基于递归多叉树的门控时钟转换方法,步骤如下:1、获取模块的多叉树层次结构;2、搜索门控时钟模块名和其时钟输出端口名,获得门控时钟信号链表;3、搜索门控时钟信号链表的信号名,获得门控时钟信号和衍生时钟的名称和位置,解析所在行语法类型,保存为解决的门控时钟链表;4、简化链表节点标识字段,保留模块名称,删去链表重复元素,得到修改位置链表;5、根据修改位置链表信号的语法类型,将新的修改内容构造新修改链表并替换;6、去掉门控使能与时钟间的“逻辑与”运算,增加上级与本级门控信号的“逻辑与”运算。本发明专利技术能够使含有门控时钟的大规模数字逻辑的平台验证变为可能,可以广泛应用于集成电路设计技术领域。域。域。

【技术实现步骤摘要】
一种基于递归多叉树的门控时钟转换方法


[0001]本专利技术涉及集成电路设计
,特别是涉及一种基于递归多叉树的门控时钟转换方法。

技术介绍

[0002]门控时钟电路是数字电路中的一种低功耗设计,只有当门控有效的时候才有时钟输出,而其他时候输出时钟处于关闭状态,在电路功能关闭时可以通过关闭时钟减少触发器的翻转次数,起到降低动态功耗的作用。在一些大规模的数字集成电路中,考虑到数字模块集成的便利性,已经大范围使用到了门控时钟电路,这也造就了这类电路的传统结构。典型的门控时钟电路是,门控信号经过锁存器后再与输入时钟经过逻辑与运算,输出所需要的的门控时钟。
[0003]一些数字集成电路的寄存器级描述含有门控时钟电路,虽然这种电路在仿真或流片过程中可以正常使用,但在数字逻辑平台验证过程中会因为门控电路的存在而引起时钟周期约束违例的问题,导致布局布线工具无法实现要求的电路。针对该问题,FPGA(现场可编程逻辑门阵列)供应商在综合工具中加入了门控时钟转换工具,希望在综合后的电路映射过程中将门控时钟结构转换为时钟使能结构,然而该电路优化效果仍不理想——该方法对规模大且门控时钟频繁使用的数字电路完全不起作用,甚至会导致工具流程时间增加。
[0004]因此,在数字逻辑验证阶段,特别是以FPGA实现为典型的验证环境中,迫切需要一种新的优化方法,该方法能够将寄存器级描述的门控时钟硬件结构和时钟连接关系替换为时钟使能结构,解决门控时钟带来的一系列时序问题,从而使含有门控时钟的大规模数字逻辑的平台验证变为可能。本专利技术正是要解决这类门控时钟转换的实际问题。

技术实现思路

[0005]本专利技术的目的是为了克服上述
技术介绍
的不足,提供一种基于递归多叉树的门控时钟转换方法,使其能够将寄存器级描述的门控时钟硬件结构和时钟连接关系替换为时钟使能结构,解决门控时钟带来的一系列时序问题,从而使含有门控时钟的大规模数字逻辑的平台验证变为可能。
[0006]本专利技术提供的一种基于递归多叉树的门控时钟转换方法,包括如下步骤:S1、自顶而下扫描源文件目录,利用递归方法获取模块的多叉树层次结构;S2、在生成的模块多叉树中,以门控时钟模块名和其时钟输出端口名为关键字进行搜索,获得输出门控时钟信号名,保存为门控时钟信号链表;S3、在步骤S1生成的模块多叉树中,以步骤S2生成的门控时钟信号链表的信号名为关键字进行搜索,获得所有门控时钟信号和衍生时钟的名称和位置,解析所在行语法类型,保存为解决的门控时钟链表;S4、简化步骤S3生成的链表的节点标识字段,保留模块名称,然后删去链表中重复的元素,得到针对源文件的修改位置链表;S5、遍历步骤S4生成的修改位置链表,根据每个信号所在行的语法类型,产生新的修改内容,构造新修改链表,在生成新源文件的过程中使用新修改链表的内容进行替换;S6、修改门控时钟模
块,去掉门控使能与时钟间的“逻辑与”运算,增加上级与本级门控信号的“逻辑与”运算,实现门控使能信号和时钟信号分离,产生新的门控时钟模块。
[0007]在上述技术方案中,所述步骤S1的具体过程如下:S11、进入方法construct_tree,所述方法construct_tree的传入参数为“源程序文件夹路径”和“顶层模块文件名”,其中,源程序文件夹存储了全部数字逻辑源程序文件,数字逻辑源程序以硬件描述语言书写完成;S12、进入源文件所在路径中,读取每个以.v为文件后缀的文件,如果源程序文件夹中的结构是子文件嵌套的形式,则需要采用文件夹递归搜索的方式,遍历源程序文件夹下所有的子文件夹直到所有*.v形式的文件均被访问为止,每个模块源文件中存储了模块的名称,在扫描源文件的过程中,采用正则表达式识别所有模块的模块名,然后将识别的模块名依次存放到全模块链表中;S13、创建一个空的多叉树数据结构,保存所有模块间的层次结构关系,描述这种一对多的层次关系——一个多叉树节点包含多个子节点,并且通过这个节点访问其父节点,从而实现从多叉树根节点出发遍历所有节点的目的;S14、创建一个多叉树根节点,作为后续递归多叉树的起点,采用“/顶层模块名”作为根节点标识;S15、调用recursive_tree方法递归地创建整个数字逻辑工程的树形层次结构;S16、完成全模块的多叉树结构,退出construct_tree方法。
[0008]在上述技术方案中,所述步骤S15中recursive_tree方法的具体过程如下:S151、进入方法recursive_tree,所述方法recursive_tree的传入参数为步骤S13创建的多叉树结构、当前的节点和全模块链表;S152、根据当前的节点获取所在模块名称,截取多叉树标识字段的后段;S153、在步骤S152中获取当前节点对应的模块名称后,使用模块名称作为关键字在源程序文件夹中搜索保存这个模块源码的文件;当找到这份源文件后,找到在这个源文件中实例化的其他子模块名称,将步骤S151的输入参数“全模块链表”中的每个模块名称作为关键字,在这个源文件中逐行搜索出现的子模块名,即当前模块中实例化的子模块的位置;找到出现子模块实例化的行后,根据硬件描述语言的实例化语法对出现这些行进行实例化语法检查,通过正则表达式匹配实现,如果这个正则表达式匹配成功,则表示子模块链表的这个子模块确实在该节点进行了实例化,然后将这个子模块名称、子模块实例化起始行、子模块实例化终止行加入“子模块链表”;S154、在遍历子模块链表过程中,检查子模块链表是否为空,如果子模块链表为空,则表示子模块链表已经处理完成,则进入步骤S158;否则进入步骤S155;S155、为当前节点创建子节点,这个子节点与子模块链表存在对应关系:对于子模块链表的每个子模块,使用“当前节点标识:$子模块起始行$子模块终止行/子模块名称”作为子模块节点标识;子模块标识中的“子模块起始行”为当前模块源文件中出现子模块实例化的起始行号,“子模块终止行”为当前模块源文件中出现子模块实例化的终止行号;构建了这个子节点后,将这个节点插入多叉树中相应位置;S156、针对这个节点的子节点递归调用recursive_tree方法;S157、将当前已经创建和添加完成的子模块、子模块实例化的位置信息从“子模块链表”中删除。然后进入步骤S154;S158、这个节点和子节点已经完成了在多叉树的创建和添加,接下来将这个多叉树结构作为返回值返回,退出recursive_tree方法。
[0009]在上述技术方案中,所述步骤S2的具体过程如下:S21、进入方法Get_keyname_in_tree,所述方法Get_keyname_in_tree的传入参数为步骤S15结束后的多叉树结构、当前的节点、门控时钟输出端口名和门控时钟模块名;S22、调用Search_all_keyname_in_node方
法,在当前节点中搜索与门控时钟端口连接的时钟信号,将搜索结果保存到“当前节点时钟信号链表”;S23、在多叉树中,获取当前节点的所有子节点,另存为“子节点链表”,然后将子节点数据结构逐个保存到子节点链表;S24、在遍历子节点链表的过程中,如本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于递归多叉树的门控时钟转换方法,其特征在于:包括如下步骤:S1、自顶而下扫描源文件目录,利用递归方法获取模块的多叉树层次结构;S2、在生成的模块多叉树中,以门控时钟模块名和其时钟输出端口名为关键字进行搜索,获得输出门控时钟信号名,保存为门控时钟信号链表;S3、在步骤S1生成的模块多叉树中,以步骤S2生成的门控时钟信号链表的信号名为关键字进行搜索,获得所有门控时钟信号和衍生时钟的名称和位置,解析所在行语法类型,保存为解决的门控时钟链表;S4、简化步骤S3生成的链表的节点标识字段,保留模块名称,然后删去链表中重复的元素,得到针对源文件的修改位置链表;S5、遍历步骤S4生成的修改位置链表,根据每个信号所在行的语法类型,产生新的修改内容,构造新修改链表,在生成新源文件的过程中使用新修改链表的内容进行替换;S6、修改门控时钟模块,去掉门控使能与时钟间的“逻辑与”运算,增加上级与本级门控信号的“逻辑与”运算,实现门控使能信号和时钟信号分离,产生新的门控时钟模块。2.根据权利要求1所述的基于递归多叉树的门控时钟转换方法,其特征在于:所述步骤S1的具体过程如下:S11、进入方法construct_tree,所述方法construct_tree的传入参数为“源程序文件夹路径”和“顶层模块文件名”,其中,源程序文件夹存储了全部数字逻辑源程序文件,数字逻辑源程序以硬件描述语言书写完成;S12、进入源文件所在路径中,读取每个以.v为文件后缀的文件,如果源程序文件夹中的结构是子文件嵌套的形式,则需要采用文件夹递归搜索的方式,遍历源程序文件夹下所有的子文件夹直到所有*.v形式的文件均被访问为止,每个模块源文件中存储了模块的名称,在扫描源文件的过程中,采用正则表达式识别所有模块的模块名,然后将识别的模块名依次存放到全模块链表中;S13、创建一个空的多叉树数据结构,保存所有模块间的层次结构关系,描述这种一对多的层次关系——一个多叉树节点包含多个子节点,并且通过这个节点访问其父节点,从而实现从多叉树根节点出发遍历所有节点的目的;S14、创建一个多叉树根节点,作为后续递归多叉树的起点,采用“/顶层模块名”作为根节点标识;S15、调用recursive_tree方法递归地创建整个数字逻辑工程的树形层次结构;S16、完成全模块的多叉树结构,退出construct_tree方法。3.根据权利要求2所述的基于递归多叉树的门控时钟转换方法,其特征在于:所述步骤S15中recursive_tree方法的具体过程如下:S151、进入方法recursive_tree,所述方法recursive_tree的传入参数为步骤S13创建的多叉树结构、当前的节点和全模块链表;S152、根据当前的节点获取所在模块名称,截取多叉树标识字段的后段;S153、在步骤S152中获取当前节点对应的模块名称后,使用模块名称作为关键字在源程序文件夹中搜索保存这个模块源码的文件;当找到这份源文件后,找到在这个源文件中实例化的其他子模块名称,将步骤S151的输入参数“全模块链表”中的每个模块名称作为关键字,在这个源文件中逐行搜索出现的子模块名,即当前模块中实例化的子模块的位置;找
到出现子模块实例化的行后,根据硬件描述语言的实例化语法对出现这些行进行实例化语法检查,通过正则表达式匹配实现,如果这个正则表达式匹配成功,则表示子模块链表的这个子模块确实在该节点进行了实例化,然后将这个子模块名称、子模块实例化起始行、子模块实例化终止行加入“子模块链表”;S154、在遍历子模块链表过程中,检查子模块链表是否为空,如果子模块链表为空,则表示子模块链表已经处理完成,则进入步骤S158;否则进入步骤S155;S155、为当前节点创建子节点,这个子节点与子模块链表存在对应关系:对于子模块链表的每个子模块,使用“当前节点标识:$子模块起始行$子模块终止行/子模块名称”作为子模块节点标识;子模块标识中的“子模块起始行”为当前模块源文件中出现子模块实例化的起始行号,“子模块终止行”为当前模块源文件中出现子模块实例化的终止行号;构建了这个子节点后,将这个节点插入多叉树中相应位置;S156、针对这个节点的子节点递归调用recursive_tree方法;S157、将当前已经创建和添加完成的子模块、子模块实例化的位置信息从“子模块链表”中删除。然后进入步骤S154;S158、这个节点和子节点已经完成了在多叉树的创建和添加,接下来将这个多叉树结构作为返回值返回,退出recursive_tree方法。4.根据权利要求3所述的基于递归多叉树的门控时钟转换方法,其特征在于:所述步骤S2的具体过程如下:S21、进入方法Get_keyname_in_tree,所述方法Get_keyname_in_tree的传入参数为步骤S15结束后的多叉树结构、当前的节点、门控时钟输出端口名和门控时钟模块名;S22、调用Search_all_keyname_in_node方法,在当前节点中搜索与门控时钟端口连接的时钟信号,将搜索结果保存到“当前节点时钟信号链表”;S23、在多叉树中,获取当前节点的所有子节点,另存为“子节点链表”,然后将子节点数据结构逐个保存到子节点链表;S24、在遍历子节点链表的过程中,如果检查子节点链表为空,则进入步骤S28,否则进入步骤S25;S25、对“子节点链表”的每个节点,递归地调用Get_keyname_in_tree方法,搜索这个子节点中与门控时钟端口连接的时钟信号,保存为“当前子节点时钟信号链表”;通过递归调用Get_keyname_in_tree方法,遍历整个多叉树中所有的节点,并找出所有出现门控时钟模块的实例化结构,以及实例化结构中门控时钟模块时钟输出端口连接的信号名称,“当前子节点时钟信号链表”的每个元素应该至少包含两个成员:“节点标识”和门控时钟模块时钟输出端口连接的“信号名称”;S26、将“当前子节点时钟信号链表”合并到“当前节点时钟信号链表”,经过这个步骤,“当前节点时钟信号链表”已经包含所有子节点的搜索结果;S27、从“子节点链表”删除这个已经操作过的子节点,避免这个子节点被再次操作;S28、返回“当前节点时钟信号链表”,退出Get_keyname_in_tree方法。5.根据权利要求4所述的基于递归多叉树的门控时钟转换方法,其特征在于:所述步骤S22中Search_all_keyname_in_node方法的具体过程如下:S2201、进入方法Search_all_keyname_in_node,所述方法Search_all_keyname_in_
node的传入参数为步骤S21运行时获取的多叉树结构、当前的节点、门控时钟输出端口名和门控时钟模块名;S2202、创建一个空链表“门控输出时钟信号链表”用于保存与门控时钟输出端口连接的信号;S2203、如果当前打开的节点对应的是门控时钟模块,则进入步骤S2210;否则进入步骤S2204;S2204、打开当前节点对应的源文件,得到文件句柄;S2205、使用“门控时钟模块名”作为关键字找到这个源文件中出现的所有门控时钟实例化结构体,另存为“结构体链表”;S2206、如果结构体链表为空,则进入步骤S2209;否则进入步骤S2207;S2207、对于门控时钟实例化结构体,用“门控时钟输出端口名”在实例化结构体中进行关键字匹配,将与门控时钟输出端口连接的信号提取出来形成端口时钟,追加到“门控输出时钟信号链表”,包含“节点标识”、“端口时钟”,其中,节点标识用于区分不同源文件中的端口时钟;S2208、从“结构体链表”删除这个已经操作完的结构体成员,避免重复操作;S2209、关闭当前节点对应的源文件,释放文件句柄;S2210、返回“门控输出时钟信号链表”,退出Search_all_keyname_in_node方法。6.根据权利要求5所述的基于递归多叉树的门控时钟转换方法,其特征在于:所述步骤S3的具体过程如下:S31、进入方法recursive_search_signal,所述方法recursive_search_signal的传入参数为多叉树结构、树根节点和“搜索链表”initial_list,其中传入参数“搜索链表”initial_list是Get_keyname_in_tree方法的返回值;S32、创建空链表res_list,用于保存多叉树中通过搜索所有解决的门控时钟信号链表。所述“解决的门控时钟信号”是指,以步骤S2找到的门控时钟信号为搜索的起点,在整个多叉树结构中找到与该门控时钟信号连接的所有信号出现的所属节点,以及与节点对应文件的行数,以便于后续的语法类型分辨和修改操作;S33、调用Get_unsolved_list_in_tree方法,返回值为这次搜索“解决的门控时钟信号链表”res_list_step和“不能解决的门控时钟信号链表”unres_list,一方面,通过res_list_step链表收集单次的搜索结果;另一方面,通过unres_list链表收集这次搜索中不能解决的门控时钟信号;其中,所述“不能解决的门控时钟”是指,以门控时钟信号为关键字搜索后新衍生出来的时钟信号;S34、将res_list_step链表合并到res_list链表;S35、将initial_list链表内容用unres_list链表覆盖,即将下一次的搜索起点定为这次搜索中“不能解决的门控时钟信号链表”,然后下次搜索解决当次搜索不能解决的问题;S36、如果initial_list链表为空,则进入步骤S37,结束对这个门控时钟信号的搜索;否则进入步骤S33,继续进行搜索;S37、返回res_list链表,退出recursive_search_signal方法。7.根据权利要求6所述的基于递归多叉树的门控时钟转换方法,其特征在于:所述步骤S33中Get_unsolved_list_in_tree方法的具体过程如下:
S331、进入方法Get_unsolved_list_in_tree,所述方法Get_unsolved_list_in_tree的传入参数为多叉树结构、当前节点和“搜索链表”initial_list,其中“搜索链表”为方法recursive_search_signal中的initial_list链表;S332、调用clear_list_in_node方法,得到已解决的链表resolved_list和未解决的链表unsolved_list链表;S333、获取当前节点的所有子节点,另存为“子节点链表”,每个子节点对应一个子模块;S334、如果“子节点链表”为空,则进入步骤S338;否则进入步骤S335;S335、调用方法Get_unsolved_list_in_tree,所述方法Get_unsolved_list_in_tree的传入参数为多叉树结构、子节点和搜索链表,返回res_list和un_list链表,res_list为子节点中解决的链表,un_list为子节点未解决的链表,通过这次递归调用找出子模块中可以解决和不能解决的门控时钟;S336、将res_list合并到resolved_list链表,将un_list合并到unsolved_list链表,实现两类链表的归并,逐级返回后构成recursive_search_signal方法中待处理的两种链表;S337、从“子节点链表”中删除这个已经操作完的子节点,避免重复的节点处理;S338、返回链表resolved_list和unsolved_list,退出方法Get_unsolved_list_in_tree;所述步骤S332中clear_list_in_node方法的具体过程如下:S33...

【专利技术属性】
技术研发人员:程振洪呙涛秦信刚樊石
申请(专利权)人:中国船舶重工集团公司第七零九研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1