掌桥专利:专业的专利平台
掌桥专利
首页

门级电路的并行仿真处理方法、计算机可读存储介质

文献发布时间:2023-06-19 11:45:49


门级电路的并行仿真处理方法、计算机可读存储介质

技术领域

本发明涉及门级电路的仿真技术领域,尤其涉及一种可提高门级电路仿真效率的并行仿真处理方法。

背景技术

随着集成电路的不断发展,无论是芯片正向设计还是反向设计,它们对于工具的依赖性越来越强,这对相关软件的处理速度提出了更高的挑战。完全免费开源的数字芯片仿真器有Icarus Verilog、Yosys等。

在仿真过程中,受电路设计规模的影响,不同规模的电路仿真时间差异较大,大规模的电路仿真耗时极长,而对于小型电路仿真耗时则为微秒级,加速电路仿真是芯片仿真阶段中亟待有效解决的关键问题。绝大部分软件的运行速度极大依赖数据集的规模,效率依赖于计算性能,采用计算性能更好的硬件是现在广泛使用的减少处理时间的有效方法。为了解决这一问题,使用多核处理器、GPU等具有优异计算性能的硬件成为近年来提高生产效率的主要方法之一。然而,GPU异构架构对计算平台的能耗和成本要求很高,且基于GPU的软件移植开发周期过程较长,不利于短时间软件加速的快速实现。

因此,在考虑硬件成本和能耗的前提下提高仿真效率是业界亟待解决的技术问题。

发明内容

为了解决现有技术中仿真加速采用高性能硬件的方式导致硬件成本较高的技术问题,本发明提出一种门级电路的并行仿真处理方法、计算机可读存储介质。

本发明提出的门级电路的并行仿真处理方法,包括:

步骤1,基于门级电路的邻接矩阵,采用第一预设分割算法将门级电路对应的图分割为多个团;

步骤2,将每个团作为一个超点,采用第一数据结构对各超点数据进行封装;

步骤3,以所有超点形成的超点图为基础,采用第二预设分割算法将所有超点分为可并行处理的多个分区,并将分区数据采用第二数据结构进行封装;

步骤4,基于超点数据和分区数据,采用预设优先级分配算法生成团之间的团优先级事件队列以及团内部的结点优先级事件队列;

步骤5,依据结点优先级事件队列以及团优先级事件队列定义的仿真顺序对门级电路进行仿真。

进一步,所述步骤1包括:

步骤1.1,预设四个集合,分别为:记录所有确定的极大团列表的T集合,记录当前极大团中已经加入的结点的H集合,记录可能还能加入到当前极大团中的结点的F集合,记录已经加入过之前被分割的某个极大团中的结点的A集合;F集合的初始元素为所有结点;

步骤1.2,依据极大团分割原则,遍历每一个结点及其后继结点,直至所有结点及其后继结点遍历完成,得到被分割的所有团;

每次遍历到的结点从F集合中取出加入至H集合中,同时更新F集合和A集合;

当F集合不为空且A集合为空时,则H集合中的当前极大团未分割完毕,则继续下一个结点的遍历;

当F集合和A集合都为空时,则H集合中当前极大团分割完毕,将H集合中的所有结点作为一个极大团添加到T集合中;

当F集合为空且A集合不为空时,则H集合中当前极大团与T集合中已经被分割的极大团重复,则继续下一个结点的遍历;

步骤1.3,将步骤1.2分割得到的团进行两两相交,得到团之间的公共结点;

步骤1.4,比较存在公共结点的两个团的大小,从较小的团中删除公共结点,得到分割后的所有团。

进一步,所述步骤1中将每一个未被分割到极大团中的结点表示为一个团。

进一步,所述步骤2包括:

步骤2.1,记录每个团所包含的结点,每个团通过一个唯一标识为一个超点;

步骤2.2,遍历各超点内的结点,记录超点与结点的关系以及结点与结点之间的关系;

步骤2.3,基于所述超点与结点的关系以及结点与结点的关系,得到超点与超点的连接关系;

步骤2.4,采用所述第一数据结构对超点以及超点之间的连接关系进行封装。

进一步,所述第一数据结构的内容包括:超点的唯一标识,超点所包含的所有结点的信息,超点的前驱超点的唯一标识,超点中连接前驱超点的结点的信息,前驱超点中连接超点的结点的信息,超点的后继超点的唯一标识,超点中连接后继超点的结点的信息以及后继超点中连接超点的结点的信息。

进一步,所述步骤3具体包括:采用锥形分割方法将所有超点分割为多个锥形区域,并将每一个锥形区域以及每一个锥形区域内的超点、锥形区域之间超点的连接关系采用第二数据结构进行封装。

进一步,所述第二数据结构的内容包括:锥形区域的唯一标识,锥形区域所包含的所有超点的信息,锥形区域中作为其他锥形区域的前驱超点的超点及其连接信息,锥形区域中作为其他锥形区域的后继超点的超点及其连接信息。

进一步,所述步骤4中,基于所述超点数据判断超点对应的团是否存在环形电路,若存在环形电路,则对团的环形电路相关结点进行时序扩展,并基于所述时序扩展后的超点数据采用预设优先级分配算法生成该超点内的结点优先级事件队列;若不存在环形电路,则基于超点数据采用预设优先级分配算法生成该超点内的结点优先级事件队列。

进一步,对团的环形电路相关结点进行时序扩展的扩展次数k根据公式

进一步,所述步骤5中为每个锥形区域分配一个逻辑处理单元实现锥形区域之间的并行仿真处理,所述逻辑处理单元根据团优先级事件队列确定其对应的锥形区域内的团的仿真顺序,根据结点优先级事件队列确定团内的结点的仿真顺序。

进一步,所述步骤5中对团内结点代表的门进行并行仿真时,包括如下步骤:

步骤5.1.1,设置三个全局线性阵列,分别为:用来存储门级电路的主输入的信息和每个门产生的输出信息的第一阵列,用来存储每个引脚接收到的信息的第二阵列,用来存储门的输出值及其输出时间以及门级电路的主输出的输出值及其输出时间的第三阵列;

步骤5.1.2,仿真运算时,更新第一阵列来获取所述主输入的信息;

步骤5.1.3,基于主输入的信息更新第二阵列中当前优先级的门的每个引脚所接收到的信息;

步骤5.1.4,在当前优先级的门进行逻辑运算后,采用第三阵列存储当前优先级的门的输出值及其输出时间,将下一优先级的门作为当前优先级的门进行下一步骤;

步骤5.1.5,基于第三阵列中当前所存储的值更新第一阵列中每个门产生的输出信息,并基于第一阵列中当前所存储的值更新第二阵列中当前优先级的门的每个引脚所接收到的信息,并返回步骤5.1.4进行循环执行,直至团内结点代表的门并行仿真完毕。

本发明提出的计算机可读存储介质,用于存储计算机程序,其特征在于,所述计算机程序运行时执行如权利要求1至7任意一项所述的门级电路的并行仿真处理方法。

本发明与现有技术相比,具有如下有益效果:

现有技术通过获取硬件描述语言工程代码综合后产生的网表中节点间的连接关系,再依照逻辑计算顺序对网表中结点(对应门级电路的门)划分层次。而现有的分割方法本技术方案的主要特征为将门电路网表图,依据其时序偏序关系,转化为有向图表示,并把原本复杂的门电路事件分割问题转化为团分割问题,并提出了一种快速可并行的团分割方法(Bron-Kerbosch extended算法),找出了图中所有独立的完全图结构,对其进行封装。经clique团封装后的图再进行分割可以有效减少对边的切断数量。

本发明对于团clique内部的每个逻辑单元采用三阶段并行算法,有效解决了传统CMB算法仿真由于内存有限的限制,无法将并行仿真扩大到整个电路的问题;采用同进程分线程的方法,创建共享内存中的全局数组,有效地避免了传统算法消息传递模式带来的不便。在团clique内部仿真中,本发明提出了时序扩展的方法,使得仿真相较原来既是可扩展的又是有界的。

本发明通过锥形分割算法,每个锥形图采用一个逻辑处理单元LP进行处理,每个逻辑处理单元分到一个工作节点上,一个工作节点一般被认为是一台机器,每个逻辑处理单元以非减的时标顺序根据优先级分配算法确定clique仿真的顺序进行并行仿真。针对clique间采用TimeWarp这种乐观型同步算法,本身就相较于乐观算法能在粗粒度的并行仿真中,更加充分地利用模拟固有的并行度。我们又在传统TimeWarp的基础上,加入了优先级分配算法,生成了clique的激活仿真的顺序,形成TimeWarp-P算法,同时刻可以仿真多个clique,使得仿真的并行化程度更高。

附图说明

下面结合实施例和附图对本发明进行详细说明,其中:

图1是本发明的简要流程图。

图2是本发明的两次分割门级电路对应的图的变化过程。

图3是现有技术最大团算法的分割结果。

图4是本发明最大团增加算法的分割过程。

图5是本发明文件file2的一个具体示例。

图6是本发明文件file3的一个具体示例。

图7是本发明文件file4的一个具体示例。

图8是本发明文件file5的一个具体示例。

图9是本发明示例的门级电路经锥形分区后的分割结果。

图10是本发明用于说明优先级分配算法的示例有向图。

图11是本发明示例的一环形电路。

图12是图11的环形电路的时序扩展后的电路图。

图13是本发明三阶段处理过程的示意图。

图14是本发明用来说明三并行仿真的示例电路图。

图15是本发明CMB-P算法的数据存储过程示意图。

具体实施方式

为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。

由此,本说明书中所指出的一个特征将用于说明本发明的一个实施方式的其中一个特征,而不是暗示本发明的每个实施方式必须具有所说明的特征。此外,应当注意的是本说明书描述了许多特征。尽管某些特征可以组合在一起以示出可能的系统设计,但是这些特征也可用于其他的未明确说明的组合。由此,除非另有说明,所说明的组合并非旨在限制。

下面结合附图以及实施例对本发明的原理进行详细说明。

如图1所示,本发明的门级电路的并行仿真处理方法的整体流程图主要分为数据预处理阶段、优先级分配阶段以及仿真阶段。在一个实施例中,其中图1中的序号1表示数据预处理阶段涉及到的计算基础数据是基于原始网表文件得到的无向图的邻接矩阵,序号2表示锥形分区算法涉及到的计算基础数据是存储团及团间关系的JSON文件,序号3表示图1左侧的优先级分配算法涉及到的计算基础数据是存储团及团间关系的JSON文件(序号2及序号3代表的是同一个文件),序号4表示图1右侧的优先级分配算法涉及到的计算基础数据是存储锥形区域内团信息的JSON文件,序号5表示本发明的CMB-P算法涉及到的计算基础数据是全局的优先级数组,以及序号3所代表的JSON文件,序号6表示本发明的TimeWarp-P算法涉及到的计算基础数据是全局的优先级数组,以及序号4所代表的JSON文件。下面将详细展开介绍各个阶段以及各个阶段所涉及到的计算基础数据。

数据预处理阶段中,主要对门级电路对应的图进行两次分割以及两次数据封装。第一次分割是基于门级电路的邻接矩阵,采用第一预设分割算法将门级电路对应的图分割为多个团,接着将每个团作为一个超点,采用第一数据结构对各超点数据进行封装。第二次分割是以所有超点形成的超点图为基础,采用第二预设分割算法将所有超点分为可并行处理的多个分区,并将分区数据采用第二数据结构进行封装。在本发明中,团与超点的意思是等同的,其所包含的结点(结点代表一个门)内容相同。当团被表示为图中一个点时,该点为一个超点。

在数据预处理阶段,采用邻接矩阵存储原始网表文件中存储的图关系信息,该图关系信息可以指的是门级电路对应的有向图,之后再运算过程中将有向图转化为无向图再进行第一次分割,也可以采用邻接矩阵直接存储门级电路对应的无向图(此时邻接矩阵为对称邻接矩阵)。随后基于邻接矩阵,依据最大团算法的原理,对门级电路对应的无向图进行第一次分割,并将对应的数据进行封装,在一个实施例中,可以具体封装为JSON文件,将封装后的第一个JSON文件(图1序号2或序号3所代表的文件)作为锥形分区算法的输入,进行第二次分割,第二次分割算法完成后,输出存储锥形分区结果的第二个JSON文件(图1序号4所代表的的文件)。

图2示出了数据预处理阶段中门级电路对应的图的变化过程,最开始邻接矩阵存储的是门级电路对应的有向图,依据最大团算法的原理,将有向图中的结点划分为多个极大团,然后把每一个极大团表示为一个超点形成超点图,超点图中一共包括V1-V6这6个超点,接着对超点图进行第二次分割,基于锥形分区算法,分割为两个锥形区域,这两个锥形区域将会进行并行仿真处理。

优先级分配阶段中,基于数据预处理阶段的超点数据和分区数据(序号4以及序号2或序号3代表的文件),采用预设优先级分配算法生成团之间的团优先级事件队列以及团内部的结点优先级事件队列。其具体是采用优先级分配算法对上述两个JSON文件进行处理。最大团增强算法生成的第一个JSON文件经优先级分配算法处理后,生成团(clique)内部的结点优先级事件队列。锥形分区算法生成的第二个JSON文件经优先级分配算法处理后,生成团(clique)间的团优先级事件队列。

仿真阶段中,将依据结点优先级事件队列以及团优先级事件队列定义的仿真顺序对门级电路进行仿真,即优先级分配阶段生成的优先级事件队列作为仿真过程进行顺序的初始化。数据预处理步骤生成的两个JSON文件作为仿真过程中电路所需的电路信息的补充。

【邻接矩阵】

下面详细描述数据预处理阶段采用邻接矩阵存储图关系信息的过程。

门级电路的原始网表文件为file1,读取file1文件中的结点信息,提取出结点及结点关系。

建立一个一维数组b,存储结点名(L_000000000017eaa0,...)与数组序号(1,...)的对应关系,便于后续查找,同时建立一个二维数组a,存储结点之间的关系。

循环遍历file1中的结点名,将遍历到的结点顺序存入数组b,实现数组名与结点名的对应。

循环遍历file1中的每个结点,对每个结点循环其outputs数组,每一个结点的outputs数组存储的是该结点的所有后继节点(也可以称之为目标结点),将[本结点->目标结点]这一关系设为1,存入数组a,并将其关系改成无向,即将[目标节点->本结点]这一关系也设为1,存入数组a,该数组a就是存储门级电路对应的无向图的邻接矩阵。

【第一次分割】

下面详细描述数据预处理阶段的第一次分割过程。

最大团算法可以在门级电路对应的无向图中找到所有团(团,英文为clique,团是一个无向图undirected graph的子图,该子图中任意两个结点之间均存在一条边),如图3所示,采用最大团算法可以找到两个团,分别为clique1和clique2,但是最大团算法所找到的两个团之间存在一个重复的结点4,因而需要对最大团算法进行改进,避免重复结点。本发明的第一次分割过程是基于最大团算法的原理来对门级电路的无向图进行第一次分割,但是使得分割后的各个团之间没有重复结点,本发明中基于最大团算法的新的处理方法称之为最大团增强算法,最大团增强算法的输入就是无向图的邻接矩阵,假设在一个具体应用例中,一个具体示例的门级电路对应的无向图的邻接矩阵为如下所示。

则采用本发明的最大团增强算法的输出内容为:clique(4)1 2 3 4;clique(3)56 7。即团4和团3之间无重复结点。

最大团增强算法的具体过程如下:

步骤1.1,预设四个集合,分别为:记录所有确定的极大团列表的T集合,记录当前极大团中已经加入的结点的H集合,记录可能还能加入到当前极大团中的结点的F集合,记录已经加入过之前被分割的某个极大团中的结点的A集合;F集合的初始元素为所有结点;

步骤1.2,依据极大团分割原则,遍历每一个结点及其后继结点,直至所有结点及其后继结点遍历完成,得到被分割的所有团;

每次遍历到的结点从F集合中取出加入至H集合中,同时更新F集合和A集合;

当F集合不为空且A集合为空时,则H集合中的当前极大团未分割完毕,则继续下一个结点的遍历;

当F集合和A集合都为空时,则H集合中当前极大团分割完毕,将H集合中的所有结点作为一个极大团添加到T集合中;

当F集合为空且A集合不为空时,则H集合中当前极大团与T集合中已经被分割的极大团重复,则继续下一个结点的遍历;

步骤1.3,将步骤1.2分割得到的团进行两两相交,得到团之间的公共结点;

步骤1.4,比较存在公共结点的两个团的大小,从较小的团中删除公共结点,得到分割后的所有团。

以图4为例来说明最大团增强算法的具体应用过程。

在最开始还未开始分割,因而T集合为空,不存在确定的极大团,F集合中为所有待分割的结点,即结点1-4,H集合和A集合也均为空。

接着读取结点1到H集合中,F集合进行更新,存储的是与结点1有连接关系的结点2、3,A集合还是为空。

接着读取结点2到H集合中,H集合内当前的结点为1、2,F集合进行更新,存储的是与结点1、2有连接关系的结点3,A集合还是为空。

接着读取结点3到H集合中,H集合内当前的结点为1-3,F集合进行更新,与结点1-3均有连接关系的结点不存在,因而F集合为空,此时结点1-3也还未划分到一个确定的团中,因而A集合也为空,满足F集合和A集合同时为空,因此结点1-3作为一个确定的极大团——团1,可以将团1添加到T集合中。

由于结点1还连接着结点3,因此在走完结点2那一条路径之后,接着读取结点3到H集合中,此时H集合内当前的结点为1、3,A集合进行更新,此时结点2已经出现在一个确定的团中了,因而A集合为结点2,F集合进行更新,由于结点2出现在A集合中,虽然结点2与结点1、3均有连接关系,那么也不属于可能被划分到当前极大团的结点,因而F集合为空,这满足上述步骤1.5当中的当F集合为空且A集合不为空时,则H集合中当前极大团与T集合中已经被分割的极大团重复,因而无需再进行分割,开始下一轮新的结点的读取。

接着读取结点2,此时H集合内为结点2,与结点2均有连接关系的是结点3、4,更新F集合,F集合内为结点3、4,A集合更新,A集合内为之前已经被分到其他极大团中的结点1。

接着读取结点3,此时H集合内为结点2、3,更新A集合,A集合内的结点为1,与结点2、3均有连接关系的结点1已经被划分,因此F集合内为空,继续下一轮新的结点的读取。

接着读取结点4,此时H集合内为结点2、4,更新A集合,A集合为空,更新F集合,没有与结点2、4同时连接的结点,因此,F集合也为空,此时H集合内的结点2、4构成了团2,可以被放到T集合中。

以上述规则,遍历每一个结点以及该结点连接的所有后继结点,直到所有的结点遍历完毕,可以得到团1(包含结点1、2、3)、团2(包含结点2、4),将两个团进行相交操作,得到公共结点2,比较两个团的大小,团2为小团,则删除团2中的公共结点,最终团2为结点4,团1保持不变。

在上述分割过程中,也有可能存在未被分割到极大团中的孤立结点,在上述分割过程中,如果存在未被分割到极大团中的结点,则这些结点单独表示为一个团,然后采用文件file2来记录所有团及其对应的结点。

文件file2的形成过程为:

获取分割得到的极大团的数组,以及原始网表文件file1;

遍历所有的极大团的数组,将每一个极大团作为一个团,为各个团设立一个唯一标识,将极大团的数组中的结点存入到以该唯一标识为key建立的字典下;

遍历不在极大团的数组中的孤立结点,即原始网表文件file1中尚未被记入到极大团的结点,将这些结点每一个都作为独立的团,为每个团也设立唯一标识,将团中所含结点存入以该唯一标识为key建立的字典下;

经过两轮遍历之后,得到文件file2,在一个具体应用例中,文件file2的具体内容如图5所示。

【采用第一数据结构进行封装】

将上述步骤得到的每一个团作为一个超点,采用第一数据结构对各超点数据进行封装,这个过程主要包括以下几个步骤:

步骤2.1,记录每个团所包含的结点,每个团通过一个唯一标识为一个超点,该步骤的详细过程也就是上述file2的形成过程;

步骤2.2,遍历各超点内的结点,记录超点与结点的关系以及结点与结点之间的关系;

步骤2.3,基于所述超点与结点的关系以及结点与结点的关系,得到超点与超点的连接关系;

步骤2.4,采用所述第一数据结构对超点以及超点之间的连接关系进行封装。

其中,第一数据结构的内容包括:超点的唯一标识,超点所包含的所有结点的信息,超点的前驱超点的唯一标识,超点中连接前驱超点的结点的信息,前驱超点中连接超点的结点的信息,超点的后继超点的唯一标识,超点中连接后继超点的结点的信息以及后继超点中连接超点的结点的信息。

上述步骤2.2的输出结果就是文件file3,下面详细描述文件file3的行程过程。

获取原始网表文件file1以及文件file2;

循环遍历文件file2中每个团的唯一标识(clique_ID)以及对应的结点名,从原始网表文件file1中找到对应的结点信息,并将结点信息插入文件file2,这里的结点信息包括结点对应的门的器件型号,结点的前驱结点的器件型号、前驱结点的唯一标识,结点的后继结点的器件型号,后继结点的唯一标识等等。

对文件file2中每个团(clique)内的结点进行遍历,在原始网表文件file1中找到此结点的前驱结点inputs的信息和后继结点outputs的信息。循环遍历每个结点的前驱结点inputs和后继结点outputs中的结点是否在当前团中。

如果前驱结点不在这个团内,在此团的唯一标识clique_ID的前驱团import属性的key下,以本结点的唯一标识node_ID创建一个key,结点的唯一标识node_ID对应的值value存储其前驱结点所在的团的唯一标识clique_ID、其前驱结点的结点名以及该前驱结点指向本结点的几号输入pin脚(即引脚)。

如果后继结点不在这个clique内,则在此clique_ID的outputs属性的key下,以本节点的node_ID创建一个key,node_ID对应的value存储其后继结点所在的clique_ID、其后继结点的结点名以及该后继结点对应本结点的几号输出pin脚。

上述操作过程修改了文件file2,将上述过程执行完毕之后得到的更新后的文件file2命名为文件file3,文件file3记录的是超点与结点的关系以及结点与结点之间的关系,在一个具体实施例中文件file3的具体内容如图6所示。

上述过程中对结点唯一标识node_ID对应的value查找实现如下:

基于团的唯一标识clique_ID如何遍历:若当前遍历的结点的某个前驱结点或后继结点无法在由clique_ID标识的结点nodes中遍历到,说明其某个前驱结点或后继结点在其他的clique_ID标识下的结点nodes中,遍历所有的clique_ID标识的结点nodes,找到对应结点,记录该结点对应的团的唯一标识clique_ID,退出循环。

当前遍历的结点的前驱结点或后继结点的名称如何遍历:若本结点的某个前驱结点或后继结点无法在当前团的唯一标识clique_ID标识的所有结点nodes中遍历到,直接记录下这个前驱结点或后继结点的名称。

输入、输出几号pin脚如何遍历:若本结点的某个前驱结点或后继结点无法在当前团的唯一标识clique_ID下的所有结点nodes中遍历到,记录下前驱结点或后继结点的名称。查找原始网表文件file1中对应的本结点名称的inputs数组(前驱结点数组)或者outputs数组(后继结点数组),从这两个数组中找到前驱结点或后继结点的名称,并记录下其在数组中的位置,此位置即为pin脚编号。例如原始网表文件file1中记录[‘nodes’][node_label][‘outputs’][0]=other_label,表明node_label结点的0号出口是指向other_label的0号pin脚。

经过上述步骤2.3、2.4之后输出的是文件file4,文件file4就是第一个JSON文件,下面描述file4的具体形成过程。

获取文件file3,并备份file3形成文件file4。

循环遍历文件file3中的clique_ID,即循环遍历每一个团;

循环遍历clique_ID下的import中的结点对应的from_community,将团的前驱信息import下所有结点的from_community属性值(file3[clique_ID][‘import’][node][‘from_community’])进行比较。将from_community相同的结点存入file4。也就是说,在遍历到一个具体的团时,当团内的某个结点的前驱结点不在当前这个团内,则需要通过遍历得知该前驱结点属于哪个团,即需要知道其from_community属性。同样的在其他团中的后继结点,也需要知道该后继结点来自哪个团,即需要知道其target_community属性。

首先清空文件file4中原有的前驱信息import与后继信息export所含的value。存储方式为在文件file4的import属性下新建key,key值为所有不同的from_community(属性from_community的值为所有前驱结点来自的团的唯一标识),并将from_community相同的结点存入对应的from_community下。循环遍历clique_ID下的export中的结点对应的target_community,将export下所有结点的target_community进行比较。将target_community相同的结点存入文件file4。存储方式为在文件file4的export属性下新建key,key值为所有不同的target_community,并将target_community相同的结点存入对应的target_community下。

然后将file3中import与export下不同结点的具体信息填充到文件file4中,输出文件file4,在一个具体实施例中,文件file4的具体内容如图7所示。文件file4就是采用第一数据结构封装后的超点数据,也可以称之为团数据。第一数据结构的内容可以采用下表1来表示。

表1第一数据结构

【第二次分割及采用第二数据结构进行封装】

在经过第一次分割之后得到了团,将每一个团在图中表示为一个超点,就会形成超点图,第二次分割是采用锥形分区算法把超点图中的所有超点分为多个锥形区域,如图8所示,并将每一个锥形区域以及每一个锥形区域内的超点、锥形区域之间超点的连接关系采用第二数据结构进行封装。

在一个实施例中,第二数据结构的内容包括:锥形区域的唯一标识,锥形区域所包含的所有超点的信息,锥形区域中作为其他锥形区域的前驱超点的超点及其连接信息,锥形区域中作为其他锥形区域的后继超点的超点及其连接信息。

锥形分区算法是一个现有算法,其原理为:创建一个CRoot列表,存储网表的源点,CRoot列表的大小代表分区数。遍历CRoot列表中的所有结点。从第一个结点开始扫描其后继结点,通过深度优先遍历的方式(也称之为广度优先遍历算法),扫描后继结点的后继结点,直至扫描到终止结点。对扫描到的每个结点都赋予一个唯一的标签。接着扫描CRoot列表中的其他结点,进行深度优先遍历,给遍历到的结点赋予唯一标签,若在扫描过程中发现结点已有标签,这停止对这个结点进行赋值,扫描其他结点的后继结点。直至扫描结束。

下面描述锥形分区算法在本发明中的详细应用过程。

获取文件file4,即第一个JSON文件。

创建两个空字典record_dict和temp_dict。字典record_dict用于存储结点与锥形区域的分区标签的对应关系,字典temp_dict用于存储输出文件。

采用锥形分割算法,对文件file4中的超点赋予锥形分区标签。循环遍历文件file4中的超点,一个超点作为一个key,对应其分区标签,存储在字典record_dict中,用于后续查找。

循环遍历字典record_dict,将分区标签相同的归为一类,在字典temp_dict中以分区标签为key,对应一个空字典。空字典中创建三个key,分别是结点nodes:用于存放该锥形区域的所有结点;输入信息import:用于存放输入超点信息,即当该锥形区域内的某个超点的前驱超点(也称之为输入超点)不在当前锥形分区内,则需要记录前驱超点以及其所在的锥形分区的唯一标识;输出信息export:用于存放输出超点信息,即当该最新区域内的某个超点的后继超点(也称之为目标超点)不在当前锥形分区内,则需要记录后继超点以及其所在的锥形分区的唯一标识。

上述结点nodes的数据如何获取:对字典record_dict进行遍历,将分区标签相同的超点存入该锥形分区的nodes列表。

上述输入信息import的数据如何获取:遍历字典temp_dict中的每个锥形区域的所有超点,每遍历到一个超点,在文件file4中查找其import中的超点,如果import中存在超点不在此锥形区域中,遍历其他锥形区域的超点nodes,查找匹配后,创建from_cone属性记录前驱锥形区域,创建from_clique属性记录前驱锥形区域中发送信号的超点,即团clique。

上述输出信息export的数据如何获取:遍历字典temp_dict中每个锥形区域的所有超点,每遍历到一个超点,在文件file4中查找其export中的超点,如果export中存在超点不在此锥形分区中,遍历其他锥形分区的超点nodes,查找匹配后,创建target_cone属性记录目标分区,即后继锥形区域,创建target_clique属性记录目标分区中接收信号的超点,即团clique。

将字典temp_dict输出为file5,得到第二个JSON文件,第二个JSON文件就是采用第二数据结构封装的文件,在一个实施例中,第二个JSON文件的具体内容如图9所示。

第二数据结构的内容可以采用下表2进行表示。

表2第二数据结构

在上述整个数据预处理阶段,第一次分割将门级电路对应的无向图分割为多个团,一个团就是一个完全图。假设一个无向图G,一个团是图G的子图,该子图中所有的顶点之间都有边将他们相连。考虑到完全图内的每对不同顶点之间都有一条边相连,即完全图内部的点是连接紧密的。与不完全图相比,对完全图进行分割会切断大量的边,产生较多pin脚。本发明为了减少对边的切断,采用最大团增强算法以团为单位来进行分割,避免了对完全图进行分割,找出了图中所有独立的完全图结构,对其进行封装。经团clique封装后的图再进行分割可以有效减少对边的切断数量,降低了仿真复杂度。

随后,本发明对最大团增强算法处理过的图结构采用锥形分区算法进行分区,生成对应的数据结构。通过最大团增强算法和锥形分区算法为随后过程的进行的优先级分配阶段做好数据预处理准备。

【优先级分配】

在优先级分配过程中,是基于上述阶段中得到的超点数据和分区数据,采用预设优先级分配算法生成团之间的团优先级事件队列以及团内部的结点优先级事件队列。

一个局部的门级电路,其各个门之间存在时序关系,但部分门或门电路之间可以并行仿真,例如一个AND1同时输出信号到一个AND2和OR1,则AND2和OR1就可以并行仿真。该预设优先级分配算法的目的是找出同一优先级的门电路,并将不同优先级的门电路从高到低进行排列(同一优先级门电路可并行仿真)。仿真顺序即按照二维列表顺序读取进行每一层的仿真,第一层并行仿真结束后,再进入下一层进行并行仿真。

优先级分配的规则为后继结点优先级低于其前驱结点(超点也同理),当所有结点以及超点的优先级分配完成,则算法结束。该算法的输入文件就是采用邻接矩阵存储的结点关系图,采用邻接矩阵存储的超点关系图,该算法的输出就是按优先级从高到低排列的二维列表,每一次包括同一优先级的结点(超点也同理)。

以图10为例来说明优先级分配算法的过程及最终分配的结果,初始的有向图中存在7个结点,分别为结点1-结点7,可以确定优先级为0的结点有:结点1、结点4和结点7。去掉优先级为0的结点后,进一步可以确定优先级为1的结点有:结点2和结点3。去掉优先级为1的结点,可以确定优先级为2的结点有结点6,再去掉优先级为2的结点,可以确定优先级为3的结点有结点5。因此可以得到相应的优先级列表,优先级为0的优先级最高,优先级为3的队列的优先级最低。

需要注意的是,在对优先级进行分配之前,要基于超点数据判断超点对应的团是否存在环形电路,因为环形电路在仿真时涉及到搜索空间爆炸问题,如果存在环形电路,则需要对团的环形电路相关结点进行时序扩展,并基于时序扩展后的超点数据采用预设优先级分配算法生成该超点内的结点优先级事件队列;若不存在环形电路,则基于超点数据采用预设优先级分配算法生成该超点内的结点优先级事件队列。

下面描述环形空间的时序扩展原理。

如图10所示,在门级电路中,通常都会出现局部环状电路,即一个门的输出是其前一个门的输入。图10中与门和或门的输出是异或门的输入,异或门的输出又是与门和或门的输入。这种局部环状电路通常会造成搜索空间爆炸的问题,我们以8组激励的仿真示范来说明问题。8组激励分别为T=0至T=3时,b=1,c=1;T=4至T=7时刻,b=1,c=0。其他引脚的初始值为0。T=0的时刻,仿真开始,引脚b和引脚c从外部接收激励均为1,其它引脚都是初始的默认值为0;T=1到T=3时,外部激励不改变,其他引脚的值根据门计算规则周期改变;T=4时,外部激励使得引脚b和引脚c的值改变,其他引脚的值根据门计算规则周期改变;T=5到T=7时,外部激励不改变,其他引脚的值根据门计算规则周期改变。当T有无穷多个时刻,仿真的结果也是无穷无尽的,下表3只列举了T=0至T=7时刻,并且仅仅在T=0和T=4时刻改变外部激励的情况下的仿真数据。

表3环形电路的仿真激励局部数据

图10中的例子仅仅是3个门的局部环形电路,该环形电流具有2个主输入,8组激励的仿真情况。本发明所指的主输入包括用户要输入的激励,也可以是局部的门级电路的外部输入,该外部输入可能是其他局部的门级电路的输出,即主输入是用户输入激励和/或中间状态形成的临时激励,若存在k个结点的局部环状电路,有n个主输入引脚,在m个周期内有m组激励数据,时间那么仿真的复杂度就应该是O(n

为了有效解决这个问题,本发明提出了时序扩展的方法。一个局部环状电路进行N个时间周期的仿真,可以等效于一个局部环状图级联N个相同的电路图在后面,这就是时序扩展,如图12所示。图11的局部电路要进行N次周期,那么就要进行N次循环仿真,其等效于图12的级联N次的情况,在一次仿真周期中所有的值全部计算完成,每一层(由虚线划分的层)对应图12的每个周期。

在数据预处理阶段,一个局部环状电路图会被分割出来并封装成为一个团clique,之后进行时序扩展。做时序扩展的好处是,可以根据分配的内存大小、计算资源(分配的核数)来规定最大激励的组数和仿真周期,进而限制了仿真的规模,使得仿真相较原来既是可扩展又是有界的。并且,每个计算单元都是相同的,便于移植针对某一规模较小的电路进行基于特定的算法CMB-P(之后要介绍的一种仿真算法)的分布式并行仿真。

【TimeWarp-P算法和CMB-P算法】

在确定完仿真优先级后进行仿真时,为每个锥形区域分配一个逻辑处理单元实现锥形区域之间的并行仿真处理,逻辑处理单元根据团优先级事件队列确定其对应的锥形区域内的团的仿真顺序,根据结点优先级事件队列确定团内的结点的仿真顺序。

TimeWarp-P算法是基于现有的TimeWarp算法(时间卷回算法)进行的改进,现有的TimeWarp算法每个逻辑处理单元LP设置了一个局部时钟(LVT),一个全局时钟(GVT),一个状态保存队列、输入缓冲(IB)和输出缓冲(OB)。其中局部时钟表示各个逻辑处理单元LP当前的模拟时间,而全局时钟表示整个系统中未处理事件的最小时标。模拟开始后,每个逻辑处理单元LP

本发明的TimeWarp-P算法以上述TimeWarp算法为基础进行改进,通过之前描述的锥形分割算法,每个锥形图是采用一个逻辑处理单元LP来进行仿真处理,每个逻辑处理单元分到一个工作节点上,一个工作节点一般被认为是一台主机,每个逻辑处理单元以非减的时标顺序根据前述优先级分配算法确定团仿真的顺序进行并行仿真。根据全图中不同逻辑处理单元LP的团clique之间的有向边,确定消息的发送方与接收方。当逻辑处理单元LP接收到的消息的时标T

本发明为每个逻辑处理单元设置的数据结构有:局部时钟LVT,用来记录该逻辑处理单元的仿真时间;全局时钟GVT,用来记录当前被仿真的门级电路的仿真最大时间;接收消息队列Input_queue,用来接收其他逻辑处理单元发送的新消息;发送消息队列Output_queue,用来接收对应的锥形区域内的门需要发送给其他锥形区域内的门的输出消息;状态保存队列Clique_state_queue,用来记录当前被仿真的团的所有门及其每个引脚在每个时刻的状态值;团关系队列Clique_relation_array,用来记录当前团所指向的下一个团,当下一个团位于其他锥形区域时,将对应的门的输出值及输出时间存入至发送消息队列。

CMB-P算法是本发明基于CMB算法改进后的算法,CMB(Chandy-Misra-Bryant)算法是最早的一种分布式并行模拟保守同步算法。现有的CMB算法对于某个事件(E

本发明的CMB-P算法根据团所分配的内存,计算clique块内(团内)扩展的数目并进行时序扩展,采用三并行算法针对每个逻辑处理单元进行快速仿真。根据之前优先级分配算法得到的器件激活顺序,在同一层进行门器件间的并行仿真,之后仿真下一层,以此持续推进仿真进度。通过在共享内存中创建共有数组的方法,每个门在共有数组中有固定的条目,且条目中的信息是按时间递增次序更新,在下次计算时插入到相应输入引脚的FIFO队列中,从而避免了传统CMB算法中消息传递的繁琐同步操作。

下面介绍逻辑处理单元的三并行仿真的主要原理,一个仿真循环需要经历三个阶段:更新主输入、更新输入引脚的值和门评估。

更新主输入阶段,从主输入队列提取主输入信号并插入到一级门上引脚的消息队列中,这里所指的主输入指的是外部输入的激励,如用户设置的激励等;

更新输入引脚阶段,每个门产生的输出信号被提取并插入到由该门驱动的输入引脚中;

门评估阶段,先提取输入引脚FIFO中最早的事件,然后根据门的类型和输入引脚的值来计算门输出的新状态。

一个仿真循环分配三组线程来分别处理三个阶段,三个阶段顺序执行。每个阶段中的for each都分配一组线程进行并行操作。根据上述优先级分配算法确定的器件激活顺序,持续推进并行仿真。例如图13,箭头A1标识的是第一阶段,获取并处理主输入,该局部电路有4个主输入,因此分配4个线程进行处理;其次,箭头A2标识的是第二阶段,从输出数组中把数据加入输入引脚中,有6个输入引脚,因此分配6个线程进行处理;最后箭头A3标识的是第三阶段,进行门评估,将门输出加入输出数组中,由于门本身存在前后关系,根据优先级算法得到各个门的激活仿真顺序,应该先进行第一阶段Process 1的门仿真,之后再进行第二阶段Process 2和第三阶段Process 3的并行仿真。

这种细粒度映射策略的优点有两方面。首先,可以简化每个线程的计算,从而防止内存访问开销和复杂逻辑引入的冗余计算;其次,由于细粒度对象具有较高的结构规律性,可以将分支分歧最小化。

采用三并行仿真方式对团内结点代表的门进行并行仿真时,具体包括如下步骤:

步骤5.1.1,设置三个全局线性阵列,分别为:用来存储门级电路的主输入的信息和每个门产生的输出信息的第一阵列gate_output_array,用来存储每个引脚接收到的信息的第二阵列pin_FIFO_array,用来存储门的输出值及其输出时间以及门级电路的主输出的输出值及其输出时间的第三阵列gate_status_array;

步骤5.1.2,仿真运算时,更新第一阵列来获取主输入的信息;

步骤5.1.3,基于主输入的信息更新第二阵列中当前优先级的门的每个引脚所接收到的信息;

步骤5.1.4,在当前优先级的门进行逻辑运算后,采用第三阵列存储当前优先级的门的输出值及其输出时间,将下一优先级的门作为当前优先级的门进行下一步骤;

步骤5.1.5,基于第三阵列中当前所存储的值更新第一阵列中每个门产生的输出信息,并基于第一阵列中当前所存储的值更新第二阵列中当前优先级的门的每个引脚所接收到的信息,并返回步骤5.1.4进行循环执行,直至团内结点代表的门并行仿真完毕。

以图14所示的电路为例,图15中的第一阵列gate_output_array存储的的主输入PI[0]-PI[4]以及由每个门产生的信息output[0]-output[4],第二阵列pin_FIFO_array存储的是每个引脚的接收到的信息pin[0]-pin[12],第三阵列gate_status_array存储的是门的当前输出逻辑值及其时间gate[0]-gate[4]和主输出的值及最后接收到消息的时间PO[0]-PO[2]。

本发明在仿真过程中将传统的消息传递模式转换为共享内存模式,通过全局数组,全局数据中每个门的输出都有固定的条目。在每次模拟迭代期间,由一个门传送的消息被写入数组中相应的条目。然后在更新过程中,该消息从该门对应的数组位置中读取,并插入到相应输入引脚的消息FIFO中。每一个门都是一个逻辑单元,按照我们的仿真方式,逻辑单元产生的消息序列是FIFO序列,每个门引脚的收到新消息都按时间戳顺序从小到大排列好了,以此来保证仿真的同步性。

由于每个团clique的仿真都在一个工作节点中,一个工作节点的内存对于其派生的线程来说是共享的,根据团clique的结点数n、团clique的引脚数p和该团clique可用的最大内存m,可以计算出当团存在环形电路时,环形电路的时序扩展的次数k,工作节点应确保次数k大于等于1;如果团clique存在主输入激励,数量为a组,那么k应该小于等于a。即次数k可以通过公式

本发明在团clique内部仿真中,采用时序扩展方法,根据最大内存、团clique内部结点数、团clique内部引脚数,对团clique进行k次扩展,较好地控制了循环电路的仿真规模,使得局部环状电路可扩展、有界;对细粒度计算采用保守同步算法,有效地保证了计算的正确性;针对团clique内部的每个逻辑单元(门)采用三阶段并行算法,每个clique中的优先级同层器件之间是并行仿真的,解决了传统CMB算法仿真由于内存有限的限制,无法将并行仿真扩大到整个电路的问题;采用同进程分线程的方法,创建共享内存中的全局数组,有效地避免了传统算法消息传递模式带来的不便。

同时本发明在传统TimeWarp算法的基础上,加入了优先级分配算法,生成了团clique的激活仿真的顺序,形成TimeWarp-P算法,同时刻可以仿真多个团clique,使得仿真的并行化程度更高。

本发明还保护对应的计算机可读存储介质,该计算机可读存储介质用来存储计算机程序,当计算机程序运行时执行上述的门级电路的并行仿真处理方法。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

相关技术
  • 门级电路的并行仿真处理方法、计算机可读存储介质
  • 晶体管级电路的验证方法、装置、设备及计算机可读存储介质
技术分类

06120113047001