集成电路装置设计仿真方法、装置、设备和可读存储介质

文档序号:20522 发布日期:2021-09-21 浏览:56次 >En<

阅读说明:本技术 集成电路装置设计仿真方法、装置、设备和可读存储介质 (Integrated circuit device design simulation method, device, apparatus and readable storage medium ) 是由 王斌 潘于 陈俊 于 2021-06-25 设计创作,主要内容包括:本公开提供了一种集成电路装置设计仿真方法、装置、设备和可读存储介质。用于集成电路装置的设计仿真方法包括:获取基于集成电路装置的多个模块构建的运行队列,其中,运行队列包括选自多个模块的至少一个模块,并且在运行队列中,至少一个模块是基于至少一个模块的执行层级来顺序排列的;确定可用的处理器;以及使用可用的处理器来运行该运行队列内的模块的仿真函数,用于对集成电路装置进行仿真验证。(The present disclosure provides an integrated circuit device design simulation method, device, apparatus, and readable storage medium. The design simulation method for the integrated circuit device comprises the following steps: obtaining a run queue constructed based on a plurality of modules of an integrated circuit device, wherein the run queue comprises at least one module selected from the plurality of modules, and in the run queue, the at least one module is sequentially arranged based on an execution hierarchy of the at least one module; determining an available processor; and running, using the available processors, simulation functions of the modules within the run queue for simulation verification of the integrated circuit device.)

集成电路装置设计仿真方法、装置、设备和可读存储介质

技术领域

本公开的实施例涉及集成电路

技术领域

,更具体地涉及一种集成电路装置设计仿真方法、装置、设备和可读存储介质。

背景技术

随着集成电路的复杂度不断增加,电路设计的复杂度也不断提高。例如,当前对计算设备的计算能力的需求急剧增长,通用图形处理器(General-purpose computing ongraphics processing units,GPGPU)因其并行计算的设计而具有极为广泛的应用,此外,对集成电路快速迭代的要求也越来越高,其中,集成电路的模型的好坏对整个电路设计有着极其重要的作用。

因为集成电路设计的特性,模型通常是基于接口、模块、寄存器和时钟而服务于处理事务,故而开发者大多抽象出这些通用的部件构建出统一的模型框架,在模型框架的基础上填充模型的功能,以利于后续的仿真验证、物理设计等设计步骤。对于GPGPU这种大型集成电路而言,存在模块多、接口多、数据交互多等特点,即使在模型框架的层面进行GPGPU仿真,都需要耗费大量的验证时间,而在和设计混合仿真的过程中则是要耗费更多的时间。由此,在集成电路的设计过程中,如何加速模型仿真变得至关重要。

发明内容

本公开的一些实施例提供了一种用于集成电路装置的设计仿真方法、装置、设备和可读存储介质,用于提高集成电路的模型仿真速率。

根据本公开的一方面,提供了一种用于集成电路装置的设计仿真方法。该设计仿真方法包括:获取基于集成电路装置的多个模块构建的运行队列,其中,运行队列包括选自多个模块的至少一个模块,并且在运行队列中,至少一个模块是基于至少一个模块的执行层级来顺序排列的;确定可用的处理器;以及使用可用的处理器来运行该运行队列内的模块的仿真函数,用于对集成电路装置进行仿真验证。

根据本公开的一些实施例,运行队列是按照以下步骤基于集成电路装置的多个模块构建的:获取集成电路装置的多个模块之间的层级结构;基于层级结构,生成对应于至少一个模块的多叉树结构,其中,多叉树结构以不同的节点表征不同的模块,每个子节点表征的模块被包括在与子节点对应的父节点表征的模块中,以具有节点深度的子节点和父节点之间的连接顺序表征至少一个模块的执行层级;以及基于节点深度对多叉树结构中的节点进行遍历,以构建运行队列。

根据本公开的一些实施例,在运行队列中按照连接顺序来排列节点并且其中包括与该节点相关联的节点信息,节点信息包括:节点名称、运行指示符、父节点信息和子节点信息,运行指示符用于指示该节点的仿真函数是否可运行,父节点信息包括与该节点直接相连的父节点的节点名称,子节点信息包括与该节点直接相连的子节点的节点名称。

根据本公开的一些实施例,基于节点深度对多叉树结构中的节点进行遍历,以构建运行队列包括:按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,以构建运行队列,其中,叶子节点表示不具有子节点的节点,根节点表示不具有父节点的节点。

根据本公开的一些实施例,按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,包括:按照节点的节点深度将节点的节点信息顺序地存储在运行队列中,其中,对于具有相同节点深度的节点,确定该节点是叶子节点还是父节点,在运行队列中将叶子节点的节点信息存储在父节点的节点信息之前,并将叶子节点的运行指示符设置为标记1,将父节点的运行指示符设置为标记2,其中,运行指示符为标记1指示该节点的仿真函数可运行,运行指示符为标记2指示该节点的仿真函数不可运行。

根据本公开的一些实施例,按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,还包括:对于多叉树结构中的节点,确定存在数据信息的活跃节点,并将活跃节点以及与活跃节点直接相连的父节点和子节点标记为激活状态。

根据本公开的一些实施例,按照节点的节点深度将该节点的节点信息存储在运行队列中,包括:在一个仿真时钟周期中,仅对于当前多叉树结构中标记为激活状态的节点,按照节点的节点深度将该节点的节点信息存储在运行队列中,而不存储当前多叉树结构中未被标记为激活状态的节点。

根据本公开的一些实施例,按照节点的节点深度将节点的节点信息顺序地存储在运行队列中包括:对于最大节点深度N:确定节点深度为N的节点,并将节点深度为N的节点的节点信息存储在运行队列中,其中,将节点深度为N的节点的运行指示符设置为标记1,将与节点深度为N的节点直接相连的父节点的节点名称作为节点深度为N的节点的父节点信息;以及对于深度小于N的节点深度M:确定节点深度为M的叶子节点,并将节点深度为M的叶子节点的节点信息存储在运行队列中,其中,将节点深度为M的叶子节点的运行指示符设置为标记1,将与节点深度为M的叶子节点直接相连的父节点的节点名称作为节点深度为M的叶子节点的父节点信息;确定节点深度为M的父节点,并将节点深度为M的父节点的节点信息存储在运行队列中,其中,将节点深度为M的父节点的运行指示符设置为标记2,将与节点深度为M的父节点直接相连的父节点的节点名称作为节点深度为M的父节点的父节点信息,以及将与节点深度为M的父节点直接相连的子节点的节点名称作为节点深度为M的父节点的子节点信息,其中,N为大于1的整数,M为小于N大于1的整数。

根据本公开的一些实施例,可用的处理器的数目为多个,使用可用的处理器来运行该运行队列内的模块的仿真函数包括:使用多个可用的处理器来并行地运行该运行队列内的多个模块的仿真函数。

根据本公开的一些实施例,并行地运行该运行队列内的多个模块的仿真函数,包括:确定运行队列中运行指示符为标记1的节点数目;以及基于可用处理器的数目以及运行指示符为标记1的节点数目,使用可用的处理器来并行地运行该运行队列内运行指示符为标记1的节点的仿真函数。

根据本公开的一些实施例,可用处理器的数目表示为S,运行指示符为标记1的节点数目表示为T,S和T为大于等于0的整数,基于可用处理器的数目以及运行指示符为标记1的节点数目,利用可用处理器来并行地运行该运行队列内的节点的仿真函数包括:在确定T小于等于S的情况下,利用可用处理器来并行地运行该运行队列中的T个运行指示符为标记1的节点的仿真函数;或者,在确定T大于S的情况下,利用可用处理器来并行地运行该运行队列中的前S个运行指示符为标记1的节点的仿真函数。

根据本公开的一些实施例,并行地运行该运行队列内的多个模块的仿真函数,还包括:在运行过程中更新运行队列。

根据本公开的一些实施例,在运行过程中更新运行队列,包括:将完成仿真函数运行之后的每一节点表示为第一节点,依据第一节点的父节点信息确定第一节点的父节点,并更新第一节点的父节点的节点信息;在运行队列中删除第一节点的节点信息;以及持续更新直到运行队列为空。

根据本公开的一些实施例,第一节点的父节点表示为第二节点,更新第一节点的父节点的节点信息包括:从第二节点的子节点信息中删除第一节点的节点名称;确定第二节点的子节点信息是否为空;在确定第二节点的子节点信息为空的情况下,将第二节点的运行指示符设置为标记1。

根据本公开的另一方面,还提供了一种用于集成电路装置的设计仿真装置,包括:运行队列获取单元,配置成:获取基于集成电路装置的多个模块构建的运行队列,其中,运行队列包括选自多个模块的至少一个模块,并且在运行队列中,至少一个模块是基于至少一个模块的执行层级来顺序排列的;计算单元,配置成:确定可用的处理器;以及仿真验证单元,配置成使用可用的处理器来运行该运行队列内的模块的仿真函数,用于对集成电路装置进行仿真验证。

根据本公开的一些实施例,该设计仿真装置还包括运行队列构建单元。运行队列构建单元配置成:获取集成电路装置的多个模块之间的层级结构;基于层级结构,生成对应于至少一个模块的多叉树结构,其中,多叉树结构以不同的节点表征不同的模块,每个子节点表征的模块被包括在与子节点对应的父节点表征的模块中,以具有节点深度的子节点和父节点之间的连接顺序表征至少一个模块的执行层级;以及基于节点深度对多叉树结构中的节点进行遍历,以构建运行队列,其中,在运行队列中按照连接顺序来排列节点并且其中包括与该节点相关联的节点信息,节点信息包括:节点名称、运行指示符、父节点信息和子节点信息,运行指示符用于指示该节点的仿真函数是否可运行,父节点信息包括与该节点直接相连的父节点的节点名称,子节点信息包括与该节点直接相连的子节点的节点名称。

根据本公开的一些实施例,运行队列构建单元配置成:按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,以构建运行队列,其中,叶子节点表示不具有子节点的节点,根节点表示不具有父节点的节点。

根据本公开的一些实施例,运行队列构建单元配置成:按照节点的节点深度将节点的节点信息顺序地存储在运行队列中,其中,对于具有相同节点深度的节点,确定该节点是叶子节点还是父节点,在运行队列中将叶子节点的节点信息存储在父节点的节点信息之前,并将叶子节点的运行指示符设置为标记1,将父节点的运行指示符设置为标记2,其中,运行指示符为标记1指示该节点的仿真函数可运行,运行指示符为标记2指示该节点的仿真函数不可运行。

根据本公开的一些实施例,运行队列构建单元还配置成:对于多叉树结构中的节点,确定存在数据信息的活跃节点,并将活跃节点以及与活跃节点直接相连的父节点和子节点标记为激活状态。

根据本公开的一些实施例,运行队列构建单元配置成:在一个仿真时钟周期中,仅对于当前多叉树结构中标记为激活状态的节点,按照节点的节点深度将该节点的节点信息存储在运行队列中,而不存储当前多叉树结构中未被标记为激活状态的节点。

根据本公开的一些实施例,运行队列构建单元配置成:对于最大节点深度N:确定节点深度为N的节点,并将节点深度为N的节点的节点信息存储在运行队列中,其中,将节点深度为N的节点的运行指示符设置为标记1,将与节点深度为N的节点直接相连的父节点的节点名称作为节点深度为N的节点的父节点信息;以及对于深度小于N的节点深度M:确定节点深度为M的叶子节点,并将节点深度为M的叶子节点的节点信息存储在运行队列中,其中,将节点深度为M的叶子节点的运行指示符设置为标记1,将与节点深度为M的叶子节点直接相连的父节点的节点名称作为节点深度为M的叶子节点的父节点信息;确定节点深度为M的父节点,并将节点深度为M的父节点的节点信息存储在运行队列中,其中,将节点深度为M的父节点的运行指示符设置为标记2,将与节点深度为M的父节点直接相连的父节点的节点名称作为节点深度为M的父节点的父节点信息,以及将与节点深度为M的父节点直接相连的子节点的节点名称作为节点深度为M的父节点的子节点信息,其中,N为大于1的整数,M为小于N大于1的整数。

根据本公开的一些实施例,可用的处理器的数目为多个,仿真验证单元配置成:使用多个可用的处理器来并行地运行该运行队列内的多个模块的仿真函数。

根据本公开的一些实施例,仿真验证单元配置成:确定运行队列中运行指示符为标记1的节点数目;以及基于可用处理器的数目以及运行指示符为标记1的节点数目,使用可用的处理器来并行地运行该运行队列内运行指示符为标记1的节点的仿真函数。

根据本公开的一些实施例,可用处理器的数目表示为S,运行指示符为标记1的节点数目表示为T,S和T为大于等于0的整数,仿真验证单元配置成:在确定T小于等于S的情况下,利用可用处理器来并行地运行该运行队列中的T个运行指示符为标记1的节点的仿真函数;或者,在确定T大于S的情况下,利用可用处理器来并行地运行该运行队列中的前S个运行指示符为标记1的节点的仿真函数。

根据本公开的一些实施例,仿真验证单元还配置成:在运行过程中更新运行队列。

根据本公开的一些实施例,仿真验证单元配置成:将完成仿真函数运行之后的每一节点表示为第一节点,依据第一节点的父节点信息确定第一节点的父节点,并更新第一节点的父节点的节点信息;在运行队列中删除第一节点的节点信息;以及持续更新直到运行队列为空。

根据本公开的一些实施例,第一节点的父节点表示为第二节点,仿真验证单元配置成:从第二节点的子节点信息中删除第一节点的节点名称;确定第二节点的子节点信息是否为空;在确定第二节点的子节点信息为空的情况下,将第二节点的运行指示符设置为标记1。

根据本公开的又一方面,还提供了一用于集成电路装置的设计仿真设备。该用于集成电路装置的设计仿真设备包括:处理器;和存储器,其中,存储器中存储有计算机可读代码,计算机可读代码在由处理器运行时,执行如上所述的用于集成电路装置的设计仿真方法。

根据本公开的又一方面,还提供了一种非暂时性计算机可读存储介质,其上存储有指令,指令在被处理器执行时,使得处理器执行如上所述的用于集成电路装置的设计仿真方法。

利用本公开实施例提供的用于集成电路装置的设计仿真方法、装置、设备和可读存储介质,能够实现基于由选自集成电路装置的多个模块的至少一个模块而构建的运行队列来进行对于集成电路装置的仿真验证过程,从而有利于提高集成电路的模型仿真速率,缩短集成电路设计周期。

附图说明

为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1示出了集成电路的模型框架的示意图;

图2A示出了根据本公开实施例的设计仿真方法的流程图;

图2B示出了根据本公开实施例的构建运行队列的流程示意图;

图3示出了对应于图1中的模型框架的多叉树结构的示意图;

图4示出了根据本公开实施例的运行队列的节点信息的示意图;

图5示出了最大节点深度为5的多叉树结构的示意图;

图6示出了根据本公开实施例的设计仿真方法的整体流程图;

图7示出了根据本公开实施例的设计仿真装置的示意性框图;

图8示出了根据本公开实施例的设计仿真设备的示意性框图;

图9示出了根据本公开实施例的示例性计算设备的架构的示意图;

图10示出了根据本公开实施例的非暂时性计算机可读存储介质的示意图。

具体实施方式

下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本公开一部分的实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在无需创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。

此外,如本公开和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。本公开中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。同样,“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。

对于集成电路而言,高昂的制造成本、不可逆的研发时间成本使得电路设计过程中的每个环节都不容许出现一点错误,而且,随着集成电路的复杂程度日益提高,验证需要探索的空间和范围也越来越大,因此验证所需要的时间也越来越长。充分且快速的验证过程有利于及时发现设计中存在的错误,从而提高设计成功率。

对于大型的集成电路结构,例如GPGPU,通常基于时钟来将电路结构的模型框架抽象成具有层级结构的多个模块。具体的,对于模块的划分,可以理解为将大的设计划分为小的子设计,例如,可以按照实现的功能来将电路整体划分为多个模块。模块的划分需要考虑的因素例如可以包括划分的模块的数量、模块之间的信号互连等。

示意性地,图1示出了具有层级结构的模型框架示意图。在图1中示出了具有3级结构的模型框架,其中,第1级结构包括顶层模块,第2级结构包括模块1和模块2,第3级结构包括子模块1、子模块2、子模块3和子模块4。在模型框架中,模块之间可能存在数据传输,数据传输在图1中示出为管道,例如,管道1、子管道1以及子管道2,例如,数据可以通过子管道1来从子模块1传输至子模块2。

在相关技术中,为了对如图1所示的模型框架进行仿真验证,对于每个仿真时钟周期,都需要对模型框架内的模块按照层级结构从下至上的顺序,来对模块进行串行的验证过程。例如,对于其中一个仿真时钟周期,需要按照子模块1、子模块2、子模块3、子模块4、模块1、模块2、顶层模块的顺序来逐个地执行各个模块的仿真函数,以验证各个模块是否可以实现其设计功能。

尽管以上串行验证的方式易于实现,但是这也严重影响了集成电路的仿真验证的速率,尤其是对于结构复杂的集成电路,例如,GPGPU,其模型框架中层级结构数目多、层次复杂,且其中包括的模块数目也非常多,以上串行验证的方式将使得整个模型的验证运行时间过长,不利于集成电路的优化设计,也无法满足对于不断缩短集成电路设计生产周期的市场需求。

为了提高集成电路的模型仿真效率,本公开的一些实施例提供了一种用于集成电路装置的设计仿真方法,在保证设计效果的同时缩短仿真验证时间。

可以的理解的是,在本文中涉及的集成电路装置可以泛指各种类型的电路结构,诸如GPGPU、Soc、微处理器等各类电路,在此不作限制。除非另有定义,本文中使用的所有术语具有与本公开所属领域的普通技术人员共同理解的相同含义。

为了更清楚地说明根据本公开实施例的设计仿真方法,提供图2A,用于示出根据本公开实施例的设计仿真方法的流程图。以下将结合图2A来描述根据本公开实施例的设计仿真方法的实现过程。

如图2A所示,首先,在步骤S201,获取基于集成电路装置的多个模块构建的运行队列。例如,集成电路装置可以是GPGPU,集成电路装置的多个模块可以是集成电路装置的模型框架中所包括的模块,例如模型框架可以是如图1所示出的。可以理解的是,图1中示出的模型框架仅是示意性地,针对不同的集成电路结构,层级结构可以多于3级,例如几级或者几十级,模型框架中包括的模块也不限于图1中示出的模块,在此不作限制。

根据本公开的一些实施例,运行队列可以包括选自多个模块的至少一个模块。例如,运行队列可以包括的模型框架中的一部分模块,或者,也可以包括的模型框架中的所有模块。此外,根据本公开的一些实施例,在运行队列中的至少一个模块是基于至少一个模块的执行层级来顺序排列的。该执行层级可以理解为图1中示出的模块之间的执行顺序关系,例如,模块1的执行顺序应在其包括的子模块1-子模块4的执行顺序之后,即,在执行逻辑上,应先处理第3层级的模块再处理处于第2层级的模块。关于运行队列的构建过程将在下文详细描述。

接着,在步骤S202,确定可用的处理器。在此步骤中,可用的处理器可以是能够用于进行仿真验证的处理器。可用的处理器的数目可以是多个,此外,处理器可以分布式的,或者云计算中的处理器,在此不作限制。

接着,在步骤S203,使用可用的处理器来运行获取的运行队列内的模块的仿真函数,用于对集成电路装置进行仿真验证。模块的仿真函数可以是模块的主(main)函数,主函数可以作为仿真程序执行的起点,如果有其他函数,则在完成对其他函数的调用后再返回到主函数,最后由主函数结束整个仿真程序。

利用根据本公开的一些实施例的设计仿真方法,避免了相关技术中串行执行各个模块的仿真验证过程,而是通过基于由选自集成电路装置的多个模块的至少一个模块而构建的运行队列来进行对于集成电路装置的仿真验证过程,这有利于提高集成电路的模型仿真效率,缩短集成电路设计周期。尤其对于诸如GPGPU的大型集成电路设计而言,基于运行队列进行的仿真验证过程更能加速模型仿真,从而节省电路设计的时间成本。

下面,将具体描述根据本公开实施例的运行队列的构建过程。具体的,图2B示出了根据本公开实施例的构建运行队列的流程示意图。

根据本公开的一些实施例,运行队列是基于集成电路装置的多个模块构建的,首先在步骤S210,获取集成电路装置的多个模块之间的层级结构。此处的多个模块之间的层级结构可以是指针对要进行设计的集成电路生成的模型框架,模型框架由具有层级结构的多个模块组成,例如,如图1所示出的。

接着,在步骤S220中,基于层级结构,生成对应于至少一个模块的多叉树结构。在根据本公开的一些实施例中,至少一个模块可以是模型架构中的所有模块,也可以是其中的一部分模块(例如,仅包括期望对其进行验证的部分模块),在此不作限制。

为便于描述,以图1中的模型框架为例,针对该图1中的模型框架的所有模块构建的多叉树结构示出于图3。如图3所示出的,在多叉树结构中,以不同的节点表征不同的模块,例如,以一个圆形框表示一个节点,该节点对应于集成电路的模型框架中的一个模块。此外,对于多叉树结构中的节点,分为子节点和父节点,其中,每个子节点表征的模块被包括在与该子节点对应的父节点表征的模块中,例如,对应于模块1的节点为父节点且对应于子模块1-子模块4的节点为子节点。又例如,对应于顶层模块的节点为父节点且对应于模块1和模块2的节点为子节点。即,在多叉树结构中,以具有节点深度的子节点和父节点之间的连接顺序表征至少一个模块的执行层级。例如,对于图1中示出的包括3级结构的模型框架,由其构建的多叉树结构(如图3所示)的最大节点深度为3,其中,节点深度为1的节点对应于第1级结构,节点深度为2的节点对应于第2级结构,节点深度为3的节点对应于第3级结构。

接着,如图2B所示,在步骤S230,基于节点深度对多叉树结构中的节点进行遍历,以构建运行队列。根据本公开的一些实施例,在运行队列中按照多叉树结构中的节点之间的连接顺序来排列节点,并且运行队列中包括与该节点相关联的节点信息。

图4示出了根据本公开实施例的运行队列的节点信息的示意图,如图4所示,运行队列中包括按照节点之间的连接顺序来排列的节点,诸如节点1、节点2、节点n等节点,并包括与节点1、节点2、节点n等节点分别对应的节点信息。

根据本公开的一些实施例,节点信息可以包括节点名称、运行指示符、父节点信息和子节点信息。作为示例,节点名称可以是与该节点对应的模块的名称。作为示例,运行队列中的节点1与子模块1对应,则节点1的节点名称可以表示为“子模块1”,作为其他示例,节点名称也可以是用于标识该节点对应的模块的其他信息,例如编号,在此不作限制。运行指示符可以用于指示该节点的仿真函数是否可运行,关于运行指示符的设置,将在下文描述。例如,父节点信息可以包括与该节点直接相连的父节点的节点名称,子节点信息包括与该节点直接相连的子节点的节点名称。作为示例,在节点1对应于子模块1的情况下,节点1的父节点信息可以包括与子模块1直接相连的模块1的名称,即,“模块1”,而节点1不具有子节点,由此,节点1的子节点信息可以为空。

根据本公开的一些实施例,以上步骤S230可以包括:按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,以构建运行队列。叶子节点表示不具有子节点的节点,根节点表示不具有父节点的节点。例如,图3所示的多叉树结构中,子模块1-子模块4为节点深度为3的叶子节点,模块2为节点深度为2的叶子节点,模块1为节点深度为2的父节点,顶层模块为节点深度为1的根节点。

根据本公开的一些实施例,上述遍历可以是:按照节点的节点深度将节点的节点信息顺序地存储在运行队列中。例如,优先将具有较大节点深度的节点信息存储在运行队列中,这是由于,节点深度较大的节点的执行层级先于节点深度较小的节点的执行层级。此外,根据本公开的一些实施例,对于具有相同节点深度的节点,首先确定该节点是叶子节点还是父节点,在运行队列中将叶子节点的节点信息存储在父节点的节点信息之前,并将叶子节点的运行指示符设置为标记1,将父节点的运行指示符设置为标记2,其中,运行指示符为标记1指示该节点的仿真函数可运行,运行指示符为标记2指示该节点的仿真函数不可运行。作为示例,可以以1位二进制数来表示运行指示符的标记,例如,二进制数为1对应于标记1,二进制数为0则对应于标记2。

根据本公开的一些实施例,对于最大节点深度N,例如,图3示出的多叉树结构中,最大节点深度为3,即,N=3,在此情形中,按照节点的节点深度将节点的节点信息顺序地存储在运行队列中包括:确定节点深度为N的节点,并将节点深度为N的节点的节点信息存储在运行队列中,其中,对于节点深度为3的节点,将其运行指示符设置为标记1,将与其直接相连的父节点的节点名称作为其父节点信息。

在图3中,节点深度为3的节点为子模块1-子模块4的节点,对于此类叶子节点,其不包括子节点,可以优先执行,由此,可以将此节点深度为3的节点的节点信息顺序地存储在运行队列中。对于节点深度为3的节点的节点信息,首先将其运行指示符设置为标记1,以用于指示此4个节点的仿真函数处于可运行的状态,接着可以将与其直接相连的父节点的节点名称(即,“模块1”)作为其父节点信息存储在运行队列中。

根据本公开的一些实施例,对于深度小于N的节点深度M,即,对于除具有最大节点深度之外的节点,例如,M为1或者2,在此情形中,按照节点的节点深度将节点的节点信息顺序地存储在运行队列中包括:首先,确定节点深度为M的叶子节点,并将节点深度为M的叶子节点的节点信息存储在运行队列中,其中,将节点深度为M的叶子节点的运行指示符设置为标记1,将与节点深度为M的叶子节点直接相连的父节点的节点名称作为节点深度为M的叶子节点的父节点信息;接着,确定节点深度为M的父节点,并将节点深度为M的父节点的节点信息存储在运行队列中,其中,将节点深度为M的父节点的运行指示符设置为标记2,将与节点深度为M的父节点直接相连的父节点的节点名称作为节点深度为M的父节点的父节点信息,以及将与节点深度为M的父节点直接相连的子节点的节点名称作为节点深度为M的父节点的子节点信息。

在以上按照节点的节点深度将节点的节点信息顺序地存储在运行队列的过程中,基于节点之间的连接顺序来排列节点,该连接顺序表征模型框架中的模块的执行层级。由此,在基于运行队列中顺序存储的节点的节点信息来执行验证的过程中,可以依据该顺序排列的节点信息来进行仿真函数的执行过程,避免了相关技术中串行执行所有模块的仿真函数的费时验证程序。

图5示出了最大节点深度为5的多叉树结构的示意图,以下将以图5中示出的多叉树结构作为具体示例,来描述根据本公开的一些实施例的运行队列构建过程。

如图5所示的多叉树结构的最大节点深度为5,首先,按照深度优先原则开始遍历整个多叉树,将遍历到的节点的节点信息放入运行队列中,即遍历的顺序为多叉树结构中的从下至上的顺序,例如,首先遍历节点深度为5的节点,接着是节点深度为4的节点,以此类推直至遍历到节点深度为1的根节点(图5中示出为处理器核心(Core))。

对于遍历到的当前节点,首先确定当前节点是否为叶子节点,如果是,则将叶子节点的运行指示符设置为标记1,并将与其相连的父节点的节点名称存储至其父节点信息中。作为示例,对于节点深度为5的节点“命令运行子模块1”,可以将其运行指示符设置为标记1,并将与其直接相连的父节点的名称(即,“命令运行模块”)存储至其父节点信息中。如果当前节点是父节点,例如,节点深度为4的命令运行模块,则将该当前节点的运行指示符设置为标记2,将该当前节点的所有子节点放入其子节点信息中,其中,节点深度为4的命令运行模块的子节点包括:命令运行子模块1和命令运行子模块2。

按照以上描述的方式进行遍历,直至遍历到根节点为止。作为示例,对于图5中示出的多叉树结构,遍历得到的运行队列内的节点的顺序可以是:{命令运行子模块1(运算核1),命令运行子模块2(运算核1),运算子模块1(运算核1),运算子模块2(运算核1),命令运行子模块1(运算核2),命令运行子模块2(运算核2),运算子模块1(运算核2),运算子模块2(运算核2)}。其中,可以理解的是,以上示出的“命令运行子模块1(运算核1)”表示图5中对应于运算核1的命令运行子模块1。由于以上列出的节点为具有最大节点深度5的叶子节点,则这些节点优先放置在运行队列内,并且,其运行指示符可以设置为标记1,即表示这些节点的仿真函数处于可运行的状态。

接着以上节点深度为5的叶子节点,运行队列中可以是节点深度为4的节点,对于具有相同节点深度4的节点,首先从叶子节点开始,排列顺序为:{命令接受模块(运算核1),运算控制模块(运算核1),数据缓存(运算核1),控制模块1(运算核1),控制模块2(运算核1),命令接受模块(运算核2),运算控制模块(运算核2),数据缓存(运算核2),控制模块1(运算核2),控制模块2(运算核2)}。由于以上节点为节点深度为4的叶子节点,则,可以将这些节点的运行指示符可以设置为标记1,即表示这些节点的仿真函数也处于可运行的状态。

在节点深度为4的叶子节点之后,可以是节点深度为4的父节点,排列顺序为:{命令运行模块(运算核1),运算部件(运算核1),命令运行模块(运算核2),运算部件(运算核2)}。由于此部分节点为父节点,则可以将其运行指示符设置为标记2,表示这些节点的仿真函数处于不可运行的状态。换句话说,对于父节点而言,需要在执行其包括的子节点的仿真函数之后再运行父节点的仿真函数,由此,在构建运行队列过程中,可以将其运行状态标记为不可运行,以避免节点之间执行层级的混乱,例如,在执行命令运行子模块之前执行了命令运行模块的仿真函数,这不符合模型框架中模块的执行层级顺序。

按照以上描述的过程,对多叉树结构中的节点进行遍历,直至遍历到节点深度为1的根节点。

对于以上运行指示符的实现方式,例如,可以是设置运行标记Flag,Flag=1表示仿真函数处于可运行的状态,即作为标记1,Flag=0表示仿真函数处于不可运行的状态,即作为标记2。又例如,还可以设置两个指示符来指示模块的仿真函数的运行状态,例如,设置参数Ready和Pending,其中,Ready=1表示仿真函数处于可运行的状态,即作为标记1,而Pending=1表示仿真函数处于不可运行的状态,即作为标记2。以上运行指示符还可以实现为其他方式,在此不作限制。此外,可以理解的是,以上节点信息还可以包括除上述节点名称、运行指示符、父节点信息和子节点信息之外的其他指示信息,可以根据实际需求进行设置。

根据本公开的一些实施例,按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,还包括:对于多叉树结构中的节点,确定存在数据信息的活跃节点,并将活跃节点以及与活跃节点直接相连的父节点和子节点标记为激活状态。在这些实施例中,引入了忙碌机制,为模块加入了激活状态(Active)属性。在一个仿真时钟周期中,仅对于当前多叉树结构中标记为激活状态的节点,按照节点的节点深度将该节点的节点信息存储在运行队列中,而不存储当前多叉树结构中未被标记为激活状态的节点。

对于存在数据信息的节点,可以理解为存在数据传输的节点。例如,图1中示出有用于传输数据的管道,管道用于接收模块接口放入的数据。当管道内数据内容时,表示其上下游的节点处于忙碌状态。由此,可以将这些节点设置为激活状态,此外,与活跃节点直接相连的父节点和子节点标记为激活状态。

在通过遍历多叉树结构来构建运行队列的过程中,只有标记为活跃状态的节点的节点信息才存储到运行队列中。作为示例,在遍历节点深度为5的节点过程中,假设被标记为活跃状态的节点只有命令运行子模块2(运算核1)和运算子模块2(运算核1),则针对节点深度为5的节点,放入运行队列的节点可以包括{命令运行子模块2(运算核1),运算子模块2(运算核1)},而节点深度为5的其他节点由于其并不处于活跃状态,即,不存在数据处理,而不放入运行队列中。此外,由于命令运行子模块2(运算核1)和运算子模块2(运算核1)处于活跃状态,由此,其父节点(分别为命令运行模块(运算核1)和运算部件(运算核1))也被将标记为激活状态,并按照上述深度优先原则依次放入运行队列之中。

在应用以上描述的忙碌机制的实施例中,运行队列内的节点仅包括集成电路装置的多个模块中的部分活跃模块,即,忙碌的模块。这使得在基于运行队列进行仿真验证的过程中,可以避免对于不忙碌的模块的验证过程,相比于相关技术中串行验证所有模块的方式节省了不必要的验证时间。例如,针对某一仿真时钟周期的验证过程中,验证任务度比较简单,可能存在较多模块处于空闲(idle)状态,在这种情况下,在基于上述引入了忙碌机制而构建的运行队列进行仿真验证中,将不再运行未被标记为激活状态的模块的仿真函数,从而能够极大的提升集成电路的验证效率,这对于诸如GPGPU的大型集成电路而言提升效果更加显著。

以上结合图2B-图5描述了构建运行队列的过程,以上构建运行队列的过程可以称为仿真验证的后处理阶段。基于构建的运行队列,根据本公开一些实施例的设计仿真方法可以确定可用的处理器,然后使用确定的可用的处理器来运行该运行队列内的模块的仿真函数,以实现对集成电路装置的仿真验证。基于运行队列进行仿真验证的过程可以称为运行阶段,下面将介绍运行阶段的实现过程。

根据本公开的一些实施例,可用的处理器的数目可以为一个或多个,在可用的处理器的数目为一个的情况下,可以从运行队列中依次地验证模块的仿真函数。在可用的处理器的数目为多个的情况下,使用可用的处理器来运行该运行队列内的模块的仿真函数包括:使用多个可用的处理器来并行地运行该运行队列内的多个模块的仿真函数。并行运行可以是由多个处理器来分别运行不同模块的仿真函数,以提高验证效率。

具体的,并行地运行该运行队列内的多个模块的仿真函数可以包括:确定运行队列中运行指示符为标记1的节点数目;以及基于可用的处理器的数目以及运行指示符为标记1的节点数目,使用可用的处理器来并行地运行该运行队列内运行指示符为标记1的节点的仿真函数。假设,可用的处理器的数目表示为S,运行指示符为标记1的节点数目表示为T,并且S和T为大于等于0的整数。在确定T小于等于S的情况下,即,当前处于可运行状态的模块的个数不大于可用的处理器的数目,则可以利用可用的处理器来并行地运行该运行队列中的T个运行指示符为标记1的节点的仿真函数。在确定T大于S的情况下,即,当前处于可运行状态的模块的个数大于可用的处理器的数目,则可以利用可用的处理器来并行地运行该运行队列中的前S个运行指示符为标记1的节点的仿真函数。

在根据本公开的一些实施例,在运行阶段中,在可用的处理器运行了模块的仿真验证函数之后,还可以对运行队列进行更新。具体的,更新运行队列可以包括:将完成仿真函数运行之后的每一节点表示为第一节点,依据第一节点的父节点信息确定第一节点的父节点,并更新第一节点的父节点的节点信息,例如,第一节点的父节点可以表示为第二节点,即,从第二节点的子节点信息中删除第一节点的节点名称。接着,可以在运行队列中删除第一节点的节点信息;以及持续更新直到运行队列为空。

例如,以第一节点为节点1为例,在使用可用的处理器运行了该节点1所对应的模块的仿真函数之后,可以依据运行队列中节点1的父节点信息确定该节点1的父节点(即,第二节点),更新该父节点的节点信息,例如,删除该父节点的子节点信息内的该节点1的节点名称。然后,可以在运行队列中删除节点1的节点信息,表示该节点1的仿真函数已完成仿真验证过程。

根据本公开的一些实施例,更新第一节点的父节点的节点信息还包括:确定第二节点的子节点信息是否为空;在确定第二节点的子节点信息为空的情况下,将第二节点的运行指示符设置为标记1。例如,在删除该父节点的子节点信息内的该节点1的节点名称之后,可以判断该父节点的子节点信息是否为空,如果确定为空,则表示该父节点的子节点均已完成仿真验证,在此情况下,可以将该父节点的运行指示符设置为标记1,即表示该父节点的仿真函数当前处于可运行状态。这是由于该父节点的子节点全部完成运行,该父节点则暴露成子节点而处于可运行状态。

此外,在完成上述节点信息更新过程之后,还可以更新可用的处理器的数目。这是由于运行该节点1的可用的处理器已经完成了针对节点1的验证任务,其可以重新作为可用的处理器,以用于其他模块的验证。

循环以上基于运行队列的并行验证过程,直到运行队列内的所有节点均完成验证,即,运行队列为空,这表示已经完成当前仿真时钟周期的验证过程。在完成当前仿真时钟周期的运行阶段之后,可以再次进入下一仿真时钟周期的后处理阶段,以用于构建针对该下一仿真时钟周期的运行队列。

此外,在运行阶段中,还可以设置监控程序,以用于检查针对模块的验证过程中是否存在超时行为,如果存在超时行为,则表示该模块的仿真函数可能存在错误,在此种情况下,监控程序可以控制跳出运行阶段并报错。

图6示出了执行根据本公开实施例的设计仿真方法的流程图,其中示出了针对某一仿真时钟周期,包括运行阶段和后处理阶段的验证过程。

如图6所示,针对每个仿真时钟周期的验证过程可以分为运行阶段601以及后处理阶段602。首先,可以利用例如函数cycle_n.run来调用所有模块的仿真验证函数。接着,可以判断触发标识(Trigger)是否为1,Trigger可以由测试激励激活,或者由外部其他模块诸如内存模块等激活。如果确定Trigger为1,则可以构建多叉树结构(例如图3或图5所示)并标记活跃节点,即,标记针对当前仿真时钟周期存在数据内容的节点。接着,可以按照节点深度进行多叉树遍历并按照如上所描述的方式来逐个节点深度进行运行队列的构建过程,直至遍历至根节点。

如果确定Trigger不为1,可以进入运行阶段601,其中,可以首先判断运行队列是否为空,如果运行队列为空则表示整个模型处于空闲状态而无需运行仿真函数,即结束当前仿真时钟周期的验证过程。如果运行队列不为空,则确定运行队列中的运行指示符为标记1的节点的数目(表示为T),并且检查当前可用的处理器的数目CPU(表示为S),以基于确定的S和T并行地进行仿真验证。例如,如果T小于等于S,则可以并行运行所有处于可运行状态的节点的仿真函数,如果T大于S,则可以根据S来并行地运行该运行队列中的前S个运行指示符为标记1的节点的仿真函数。

当运行完成节点的仿真函数之后,还可以对运行队列中的节点信息进行更新。例如,更新上述第一节点的父节点(即,第二节点)的节点信息,并从运行队列中删除该第一节点的节点信息。此外,如果第二节点的子节点信息为空,则将该第二节点的运行指示符设置为标记1,相当于该第二节点的子节点全部运行完成,作为父节点的第二节点更新为可运行的节点。接着,可以返回到判断运行队列是否为空,如果不为空则可以按照以上过程继续执行并行验证过程,直至运行队列为空为止,结束当前仿真时钟周期的验证过程。

利用本公开实施例提供的用于集成电路装置的设计仿真方法,能够实现基于由选自集成电路装置的多个模块的至少一个模块而构建的运行队列来进行对于集成电路装置的仿真验证过程,从而有利于提高集成电路的模型仿真效率,缩短集成电路设计周期。此外,基于构建的运行队列能够进行并行仿真验证过程,以提高验证速度,这对于并行度极高的情况有着非常明显的速度提升。例如,对于GPGPU的模型框架构建的多叉树结构包括8734个节点,最大节点深度为14级,相比于相关技术中的串行地执行所有模块的验证过程,仿真验证速率能获得几十倍的提升。此外,在根据本公开的一些实施例中,在构建运行队列的过程中还引入了忙碌机制,仅将具有数据处理内容的节点放入运行队列,而对于处于空闲状态的模块并不放入运行队列,使得避免针对空闲模块的仿真验证时间,在此情形下,基于运行队列的仿真验证速率能获得几百倍以上的提升。提高模型的验证速率有利于降低集成电路的验证时间成本,缩短集成电路的设计周期,满足对于不断缩短集成电路设计生产周期的市场需求。

图7示出了根据本公开实施例的设计仿真装置的示意性框图。如图7所示,设计仿真装置1000可以包括运行队列获取单元1010、计算单元1020、仿真验证单元1030。

根据本公开的一些实施例,运行队列获取单元1010可以配置成:获取基于集成电路装置的多个模块构建的运行队列。例如,集成电路装置可以是GPGPU,集成电路装置的多个模块可以是集成电路装置的模型框架中所包括的模块,例如模型框架可以是如图1所示出的。可以理解的是,图1中示出的模型框架仅是示意性地,针对不同的集成电路结构,层级结构可以多于3级,例如几级或者几十级,此外,模型框架中包括的模块也不限于图1中示出的模块。根据本公开的一些实施例,运行队列可以包括选自多个模块的至少一个模块。例如,运行队列可以包括的模型框架中的一部分模块,或者,也可以包括的模型框架中的所有模块。此外,根据本公开的一些实施例,在运行队列中的至少一个模块是基于至少一个模块的执行层级来顺序排列的。该执行层级可以理解为图1中示出的模块之间的执行顺序关系,例如,模块1的执行顺序应在其包括的子模块1-子模块4的执行顺序之后,即,在执行逻辑上,应先处理第3层级的模块再处理处于第2层级的模块。

根据本公开的一些实施例,计算单元1020可以配置成:确定可用的处理器。可用的处理器可以是能够用于进行仿真验证的处理器。可用的处理器的数目可以是多个,此外,处理器可以分布式的,或者云计算中的处理器,在此不作限制。

根据本公开的一些实施例,仿真验证单元1030可以配置成:使用可用的处理器来运行该运行队列内的模块的仿真函数,用于对集成电路装置进行仿真验证。

利用根据本公开的一些实施例的设计仿真装置1000进行集成电路的仿真验证,能够避免相关技术中串行执行各个模块的仿真验证过程,而是通过基于由选自集成电路装置的多个模块的至少一个模块而构建的运行队列来进行对于集成电路装置的仿真验证过程,这有利于提高集成电路的模型仿真效率,缩短集成电路设计周期。尤其对于诸如GPGPU的大型集成电路设计而言,基于运行队列进行的仿真验证过程更能加速模型仿真,从而节省电路设计的时间成本。

根据本公开的一些实施例,如图7所示,设计仿真装置1000还可以包括运行队列构建单元1040。运行队列构建单元1040可以配置成:获取集成电路装置的多个模块之间的层级结构。此处的多个模块之间的层级结构可以是指针对要进行设计的集成电路生成的模型框架,模型框架由具有层级结构的多个模块组成,例如,如图1所示出的。

接着,运行队列构建单元1040可以配置成:基于层级结构,生成对应于至少一个模块的多叉树结构。在根据本公开的一些实施例中,至少一个模块可以是模型架构中的所有模块,也可以是其中的一部分模块(例如,仅包括期望对其进行验证的部分模块),在此不作限制。其中,多叉树结构以不同的节点表征不同的模块,每个子节点表征的模块被包括在与子节点对应的父节点表征的模块中,以具有节点深度的子节点和父节点之间的连接顺序表征至少一个模块的执行层级。

接着,运行队列构建单元1040可以配置成:基于节点深度对多叉树结构中的节点进行遍历,以构建运行队列。根据本公开的一些实施例,在运行队列中按照多叉树结构中的节点之间的连接顺序来排列节点,并且运行队列中包括与该节点相关联的节点信息。

根据本公开的一些实施例,节点信息可以包括:节点名称、运行指示符、父节点信息和子节点信息,运行指示符用于指示该节点的仿真函数是否可运行,父节点信息包括与该节点直接相连的父节点的节点名称,子节点信息包括与该节点直接相连的子节点的节点名称。关于节点信息可以参照上文结合图4进行的描述,在此不再重复。

根据本公开的一些实施例,运行队列构建单元1040配置成:按照深度优先的原则,从具有最大节点深度的叶子节点开始,在多叉树中以节点深度从大到小的顺序的依次访问至具有节点深度为1的根节点,以构建运行队列。叶子节点表示不具有子节点的节点,根节点表示不具有父节点的节点。例如,图3所示的多叉树结构中,子模块1-子模块4为叶子节点,顶层模块为根节点。

根据本公开的一些实施例,运行队列构建单元1040进行上述遍历可以包括:按照节点的节点深度将节点的节点信息顺序地存储在运行队列中。例如,优先将具有较大节点深度的节点信息存储在运行队列中,这是由于,节点深度较大的节点的执行层级先于节点深度较小的节点的执行层级。此外,根据本公开的一些实施例,对于具有相同节点深度的节点,首先确定该节点是叶子节点还是父节点,在运行队列中将叶子节点的节点信息存储在父节点的节点信息之前,并将叶子节点的运行指示符设置为标记1,将父节点的运行指示符设置为标记2,其中,运行指示符为标记1指示该节点的仿真函数可运行,运行指示符为标记2指示该节点的仿真函数不可运行。

根据本公开的一些实施例,对于最大节点深度N,例如,图3示出的多叉树结构中,最大节点深度为3,即,N=3,在此情形中,运行队列构建单元1040进行按照节点的节点深度将节点的节点信息顺序地存储在运行队列中包括:确定节点深度为N的节点,并将节点深度为N的节点的节点信息存储在运行队列中,其中,对于节点深度为3的节点,将其运行指示符设置为标记1,将与其直接相连的父节点的节点名称作为其父节点信息。

根据本公开的一些实施例,对于深度小于N的节点深度M,运行队列构建单元1040配置成:确定节点深度为M的叶子节点,并将节点深度为M的叶子节点的节点信息存储在运行队列中,其中,将节点深度为M的叶子节点的运行指示符设置为标记1,将与节点深度为M的叶子节点直接相连的父节点的节点名称作为节点深度为M的叶子节点的父节点信息;确定节点深度为M的父节点,并将节点深度为M的父节点的节点信息存储在运行队列中,其中,将节点深度为M的父节点的运行指示符设置为标记2,将与节点深度为M的父节点直接相连的父节点的节点名称作为节点深度为M的父节点的父节点信息,以及将与节点深度为M的父节点直接相连的子节点的节点名称作为节点深度为M的父节点的子节点信息,其中,N为大于1的整数,M为小于N大于1的整数。

对于以上运行指示符的实现方式,例如,可以是设置运行标记Flag,Flag=1表示仿真函数处于可运行的状态,Flag=0表示仿真函数处于不可运行的状态。又例如,还可以设置两个指示符来指示模块的仿真函数的运行状态,例如,设置参数Ready和Pending,其中,Ready=1表示仿真函数处于可运行的状态,而Pending=1表示仿真函数处于不可运行的状态。以上运行指示符还可以实现为其他方式,在此不作限制。此外,可以理解的是,以上节点信息还可以包括除上述节点名称、运行指示符、父节点信息和子节点信息之外的其他指示信息,可以根据实际需求进行设置。

在以上按照节点的节点深度将节点的节点信息顺序地存储在运行队列的过程中,基于节点之间的连接顺序来排列节点,该连接顺序表征模型框架中的模块的执行层级。由此,在基于运行队列中顺序存储的节点的节点信息来执行验证的过程中,可以依据该顺序排列的节点信息来进行仿真函数的执行过程,避免了相关技术中串行执行所有模块的仿真函数的费时验证程序。

根据本公开的一些实施例,运行队列构建单元1040还可以配置成:对于多叉树结构中的节点,确定存在数据信息的活跃节点,并将活跃节点以及与活跃节点直接相连的父节点和子节点标记为激活状态。在这些实施例中,引入了忙碌机制,为模块加入了激活状态(Active)属性。在一个仿真时钟周期中,运行队列构建单元1040可以配置成:仅对于当前多叉树结构中标记为激活状态的节点,按照节点的节点深度将该节点的节点信息存储在运行队列中,而不存储当前多叉树结构中未被标记为激活状态的节点。

在应用以上描述的忙碌机制的实施例中,运行队列内的节点仅包括集成电路装置的多个模块中的部分活跃模块,即,忙碌的模块。这使得在基于运行队列进行仿真验证的过程中,可以避免对于不忙碌的模块的验证过程,相比于相关技术中串行验证所有模块的方式节省了不必要的验证时间。例如,针对某一仿真时钟周期的验证过程中,验证任务度比较简单,可能存在较多模块处于空闲(idle)状态,在这种情况下,在基于上述引入了忙碌机制而构建的运行队列进行仿真验证中,将不再运行未被标记为激活状态的模块的仿真函数,从而能够极大的提升集成电路的验证效率,这对于诸如GPGPU的大型集成电路而言提升效果更加显著。

根据本公开的一些实施例,可用的处理器的数目可以为一个或多个。在可用的处理器的数目是多个的情况下,仿真验证单元1030可以配置成:使用多个可用的处理器来并行地运行该运行队列内的多个模块的仿真函数。并行运行可以是由多个处理器来分别运行不同模块的仿真函数,以提高验证效率。

根据本公开的一些实施例,仿真验证单元1030可以配置成:确定运行队列中运行指示符为标记1的节点数目;以及基于可用的处理器的数目以及运行指示符为标记1的节点数目,使用可用的处理器来并行地运行该运行队列内运行指示符为标记1的节点的仿真函数。

根据本公开的一些实施例,可用的处理器的数目表示为S,运行指示符为1的节点数目表示为T,S和T为大于等于0的整数,仿真验证单元1030可以配置成:在确定T小于等于S的情况下,利用可用的处理器来并行地运行该运行队列中的T个运行指示符为标记1的节点的仿真函数;或者,在确定T大于S的情况下,利用可用的处理器来并行地运行该运行队列中的前S个运行指示符为标记1的节点的仿真函数。

根据本公开的一些实施例,仿真验证单元1030还可以配置成:在运行过程中更新运行队列。

根据本公开的一些实施例,仿真验证单元1030可以配置成:将完成仿真函数运行之后的每一节点表示为第一节点,依据第一节点的父节点信息确定第一节点的父节点,并更新第一节点的父节点的节点信息;在运行队列中删除第一节点的节点信息;以及持续更新直到运行队列为空。

根据本公开的一些实施例,第一节点的父节点表示为第二节点。仿真验证单元1030可以配置成:从第二节点的子节点信息中删除第一节点的节点名称;确定第二节点的子节点信息是否为空;在确定第二节点的子节点信息为空的情况下,将第二节点的运行指示符设置为标记1。

此外,在完成上述节点信息更新过程之后,还可以更新可用的处理器的数目。这是由于运行该节点1的可用的处理器已经完成了针对节点1的验证任务,其可以重新作为可用的处理器,以用于其他模块的验证。

根据本公开的一些实施例,在运行阶段中,设计仿真装置1000中还可以设置有监控程序,以用于检查针对模块的验证过程中是否存在超时行为,如果存在超时行为,则表示该模块的仿真函数可能存在错误,在此种情况下,监控程序可以控制跳出运行阶段并报错。

关于设计仿真装置1000执行的步骤的具体实现过程可以参照以上结合附图描述的根据本公开的设计仿真方法,在此不再重复描述。

根据本公开的又一方面,还提供了一种用于集成电路装置的设计仿真设备。图8示出了根据本公开实施例的设计仿真设备的示意性框图。

如图8所示,设计仿真设备2000可以包括处理器2010以及存储器2020。根据本公开实施例,存储器2020中存储有计算机可读代码,该计算机可读代码当由处理器2010运行时,可以执行如上所述的设计仿真方法。

处理器2010可以根据存储在存储器2020中的程序执行各种动作和处理。具体地,处理器2010可以是一种集成电路,具有信号处理能力。上述处理器可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中公开的各种方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,可以是X86架构或者是ARM架构等。

存储器2020存储有计算机可执行指令代码,该指令代码在被处理器2010执行时用于实现根据本公开实施例的设计仿真方法。存储器2020可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM)、可编程只读存储器(PROM)、可擦除可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)或闪存。易失性存储器可以是随机存取存储器(RAM),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的RAM可用,例如静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、同步动态随机存取存储器(SDRAM)、双倍数据速率同步动态随机存取存储器(DDRSDRAM)、增强型同步动态随机存取存储器(ESDRAM)、同步连接动态随机存取存储器(SLDRAM)和直接内存总线随机存取存储器(DR RAM)。应注意,本文描述的存储器旨在包括但不限于这些和任意其它适合类型的存储器。

根据本公开实施例的方法或装置也可以借助于图9所示的计算设备3000的架构来实现。如图9所示,计算设备3000可以包括总线3010、一个或多个CPU 3020、只读存储器(ROM)3030、随机存取存储器(RAM)3040、连接到网络的通信端口3050、输入/输出组件3060、硬盘3070等。计算设备3000中的存储设备,例如ROM 3030或硬盘3070可以存储本公开提供的设计仿真方法的处理和/或通信使用的各种数据或文件以及CPU所执行的程序指令。计算设备3000还可以包括用户界面3080。当然,图9所示的架构只是示例性的,在实现不同的设备时,根据实际需要,可以省略图9示出的计算设备中的一个或多个组件。作为示例,上述计算设备3000可以实现为安装有用于集成电路的设计仿真应用程序的计算机,在此不作限制。

例如,计算设备3000中可以安装有用于集成电路设计仿真的应用程序,并且该计算设备3000可以为多核处理器,包括多个CPU 3020。由此,计算设备可以构建或获取基于集成电路装置的多个模块构建的运行队列,并且借助多个CPU来并行地运行该运行队列内的模块的仿真函数,以对集成电路装置进行并行地仿真验证过程,从而提高集成电路仿真验证速率,缩短电路设计周期。

根据本公开的又一方面,还提供了一种非暂时性计算机可读存储介质。图10示出了根据本公开实施例的非暂时性计算机可读存储介质的示意图。

如图10所示,计算机可读存储介质4020上存储有指令,指令例如是计算机可读指令4010。当计算机可读指令4010由处理器运行时,可以执行参照以上附图描述的设计仿真方法。计算机可读存储介质包括但不限于例如易失性存储器和/或非易失性存储器。易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。例如,计算机可读存储介质4020可以连接于诸如计算机等的计算设备,接着,在计算设备运行计算机可读存储介质4020上存储的计算机可读指令4010的情况下,可以进行如上所述的设计仿真方法。

根据本公开的又一方面,还提供了一种计算机程序产品或计算机程序,该计算机程序产品或者计算机程序包括计算机可读指令,该计算机可读指令存储在计算机可读存储介质中。计算机设备的处理器可以从计算机可读存储介质读取该计算机可读指令,处理器执行该计算机可读指令,使得该计算机设备执行上述各个实施例中描述的设计仿真方法。

利用本公开实施例提供的用于集成电路装置的设计仿真方法、装置、设备以及可读存储介质,能够实现基于由选自集成电路装置的多个模块的至少一个模块而构建的运行队列来进行对于集成电路装置的仿真验证过程,从而有利于提高集成电路的模型仿真效率,缩短集成电路设计周期。此外,基于构建的运行队列能够进行并行仿真验证过程,以提高验证速度,这对于并行度极高的情况有着非常明显的速度提升。此外,在根据本公开的一些实施例中,在构建运行队列的过程中还引入了忙碌机制,仅将具有数据处理内容的节点放入运行队列,而对于处于空闲状态的模块并不放入运行队列,使得避免针对空闲模块的仿真验证时间,在此情形下,基于运行队列的仿真验证速率能获得几百倍以上的提升。提高模型的验证速率有利于降低集成电路的验证时间成本,缩短集成电路的设计周期,满足对于不断缩短集成电路设计生产周期的市场需求。

本领域技术人员能够理解,本公开所披露的内容可以出现多种变型和改进。例如,以上所描述的各种设备或组件可以通过硬件实现,也可以通过软件、固件、或者三者中的一些或全部的组合实现。

此外,虽然本公开对根据本公开的实施例的系统中的某些单元做出了各种引用,然而,任何数量的不同单元可以被使用并运行在客户端和/或服务器上。单元仅是说明性的,并且系统和方法的不同方面可以使用不同单元。

本公开中使用了流程图用来说明根据本公开的实施例的方法的步骤。应当理解的是,前面或后面的步骤不一定按照顺序来精确的进行。相反,可以按照倒序或同时处理各种步骤。同时,也可以将其他操作添加到这些过程中。

本领域普通技术人员可以理解上述方法中的全部或部分的步骤可通过计算机程序来指令相关硬件完成,程序可以存储于计算机可读存储介质中,如只读存储器、磁盘或光盘等。可选地,上述实施例的全部或部分步骤也可以使用一个或多个集成电路来实现。相应地,上述实施例中的各模块/单元可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本公开并不限制于任何特定形式的硬件和软件的结合。

除非另有定义,这里使用的所有术语具有与本公开所属领域的普通技术人员共同理解的相同含义。还应当理解,诸如在通常字典里定义的那些术语应当被解释为具有与它们在相关技术的上下文中的含义相一致的含义,而不应用理想化或极度形式化的意义来解释,除非这里明确地这样定义。

以上是对本公开的说明,而不应被认为是对其的限制。尽管描述了本公开的若干示例性实施例,但本领域技术人员将容易地理解,在不背离本公开的新颖教学和优点的前提下可以对示例性实施例进行许多修改。因此,所有这些修改都意图包含在权利要求书所限定的本公开范围内。应当理解,上面是对本公开的说明,而不应被认为是限于所公开的特定实施例,并且对所公开的实施例以及其他实施例的修改意图包含在所附权利要求书的范围内。本公开由权利要求书及其等效物限定。

30页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:三相直线感应电机分段供电切换过程的实时仿真建模方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类