发明内容
本发明的方式之一,为具有用于存储第1进程的存储器的计算机系统。该第1进程具有进行包括输入级和输出级的多级逻辑运算的运算部分,运算部分包括具有多个输入的运算、和作为多个输入的源的前级运算(多个)。
该计算机系统还具有生成第2进程的单元。第2进程包括多条用于执行包含于第1进程的运算部分的多个运算的语句。生成该第2进程的单元(调度(scheduling)功能)具有从输出级向输入级对存储于存储器的运算部分进行解析的单元。该解析单元可以判断解析对象的运算是下述第1类型的运算,即该第1类型的运算是指由于决定解析对象的运算的多个输入的一部分,而其他输入的至少一部分则为自由的输入。
生成第2进程的单元还具有下述单元,即,如果解析对象的运算是第1类型的运算,就将用于执行解析对象的运算的语句再构成为至少一个语句并输出。至少一个语句包括用于执行解析对象的运算的多个输入的源(发生源)的运算中的任意一个、即执行前级的多个运算的任意一个,并跳过由此而成为自由的输入的源(发生源)的运算、即跳过前级的运算中的任意一个的语句。
典型地,输出单元将用于执行解析对象的运算的语句再构成为包括下述4个语句的多个语句,即:
(1)用于以解析对象的运算的多个输入中的一个作为第1输入、并执行该第1输入的源的运算的第1语句。
(2)用于设定解析对象的运算的输出的第2语句。
(3)用于执行因第1输入而成为自由的输入的源的运算的第3语句。
(4)用于在因第1输入而发生自由的输入时,跳过成为自由的输入的源的运算的第4语句。典型的该第4语句,是用于在因第1输入而发生自由的输入时,跳过上述第3语句的语句,这些语句不一定按照这一顺序表述。
第1进程的一个方式是包括多级逻辑运算的逻辑电路的表述或逻辑合成该逻辑电路的门电平的网表。第2进程的一个方式是计算机程序(以下称为程序),多个语句包括控制计算机硬件的多条命令。第2进程的另一个方式,是用于对可再构成的逻辑电路进行再构成的硬件控制信息,多个语句包括用于以周期为单位来再构成逻辑电路的至少一部分的配置(configuration)信息。第1进程的其他方式也可以是这些程序或硬件控制信息。
在本说明书中,所谓“输入是自由的”或“发生自由的输入”,表示在某运算(本说明书的“第1类型的运算”)中,即使不决定该运算的自由输入值,也能决定该运算的输出的情况。例如,如果是2个输入的AND门,只要一个输入(例如本说明书中的“第1输入”)为“0”(负或伪),则即使不决定另一输入,AND门的输出也为0。在这种情况下,另一输入为“自由的输入”。多个输入的AND门也一样。如果是2个输入的OR门,只要1个输入(第1输入)为1(正或真),则即使是不决定另一输入,OR门的输出也是1。在这种情况下,其他输入是“自由输入”。多输入的OR门也一样。如果是两个输入的选择器,只要决定了选择信号(第1输入),则由此未被选择的一方的输入为自由输入。
没有必要为了得到以前级输出为输入的运算部分的结果,执行已成为自由的输入的源(发生源)的运算。在作为本发明方式之一的计算机系统中,生成第2进程的单元在生成包含执行运算的语句的进程时,解析单元从输出级侧到输入级侧对包含于第1进程的运算部分中的运算进行解析。通过从输出级到输入级进行解析,能够判断输入为自由输入的类型(第1类型)的运算,能够判断是否需要执行(评价)相对于该解析对象的运算的前级运算。
然后,如果解析对象的运算是其输入的一部分为自由的输入的第1类型,则输出单元就将执行该运算的语句再构成为上述第1~第4语句并输出到存储器。包含再构成的语句的进程,在发生了自由的输入时,为跳过该自由的输入的源的运算的执行的进程。
生成第2进程的单元还包含递归(Recursive)(反复)处理。也就是生成第2进程的单元还具有利用解析单元和输出单元来同样地对输出到存储器的包含于所再构成的语句中的运算进行递归再构成的功能。因此,利用生成第2进程的单元能够生成下述第2进程,该第2进程包括在包含于第1进程的运算部分的运算中发生自由的输入时,能够利用以跳过该输入的源的运算的执行(评价)的方式调度的多个语句(语句群)来表现第1进程的运算部分。
如果解析对象的运算是作为选择器等安装的选择性运算,则上述第2语句是利用不自由的输入来执行解析对象的运算、并设定其输出的语句。该语句也可以为参照或利用检查表(LUT)的语句。如果是AND、OR等输出0/1(正负、真伪)的逻辑运算,则上述第2语句为用于简单地设定规定值为输出的语句。
计算机系统最好还具有用于存储模板(template)的存储器。模板具有:用于针对每个输入的一部分为自由的种类的运算,将用于执行该运算的语句再构成为上述第1至第4语句或包括这些动作的至少一个语句的信息(指示)。模板既可以存储于与第1进程相同的存储器中,也可以存储于不同的存储器。而且模板也可以嵌入控制计算机系统的程序中。输出单元也可以参照模板,再构成用于执行解析对象的运算的语句。
输出单元最好还具有在希望通过再构成用于执行解析对象的运算的语句来改善运算部分的执行速度时,再构成相应语句的功能。如果即使生成跳过运算的第4语句也几乎没有进行跳过的机会的话,第2进程有可能慢执行跳过语句所需要的时间。此外,如果跳过的运算是如设定即时或设定全局变量那样的处理,则即使不跳过,也基本不会影响处理速度。另一方面,如果是如访问存储器那样的需要数个时钟的处理,跳过是有意义的。
输出单元最好能够防止重复输出用于执行同一运算的语句。在包含于运算部分的多个运算以某一前级运算的输出为共同的输入使用时,有可能生成多个用于执行该输入的源的运算的语句。在执行该输入的源的运算需要数个时钟的情况下,通过以用于执行该运算的语句不重复的方式生成第2进程,能够缩短用于利用仿真器等执行第2进程的时间。
该计算机系统的一个方式是根据包含第1进程的第1内容来生成包含第2进程的第2内容的编译器(compiler)。第2内容包括程序和/或硬件控制信息。该计算机系统的不同的方式是执行第2内容的仿真器。
仿真器的一个例子是生成并执行用于进行基于周期方式的仿真的模型的系统。这样的计算机系统的一个方式,具有生成逻辑电路的门电平的网表的单元、以及生成包括基于包含于网表中的第1进程而生成的第2进程的程序的单元,生成该程序的单元包括生成第2进程的单元。程序之一是仿真用的程序,计算机系统最好还包括作为用于执行仿真的程序的仿真器的功能。
本发明的其他方式之一是安装在具有用于存储第1进程的存储器的计算机上的程序(程序产品)。该程序具有使计算机作为生成上述第2进程的单元起作用的步骤。程序(程序产品)能够记录于HDD、CD-ROM等计算机可读的适当的记录媒体上提供。此外,程序能够通过互联网等计算机网络提供。
本发明的又一其他方式是一种方法,该方法包括安装到具有存储器的计算机、根据第1进程生成第2进程的步骤。生成该第2进程的步骤包括下述步骤。
(a)从输出级向输入级对存储于存储器中的运算部分进行解析,判断解析对象的运算是下述第1类型的运算,即该第1类型的运算是指由于决定该运算的多个输入的一部分,而其他输入的至少一部分则为自由的。
(b)如果解析对象的运算是第1类型的运算,就将用于执行解析对象的运算的语句再构成为至少一个语句然后输出。至少一个语句包括用于执行上述解析对象的运算的多个输入的源的运算中的任意一个、并跳过由此成为自由的输入的源的运算的语句。
在步骤(b)中,被再构成并输出的典型的语句(至少一个语句)是包括上述第1至第4语句的语句。此外,这种方法是制造(生成)包括再构成的至少一个语句的内容的方法。
生成第2进程的步骤最好包括反复进行步骤(a)和步骤(b)(递归处理)。在这种情况下,步骤(b)将再构成的语句输出到作为解析对象的存储器。
上述步骤(b)最好包括参照模板的步骤,而该模板具有:针对每个输入的一部分为自由的种类的运算,将用于执行该运算的语句再构成为至少一个语句的信息(指示)。
此外,上述步骤(b)最好包括在希望通过再构成用于执行解析对象的运算的语句来改善运算部分的执行速度时,再构成用于执行解析对象的运算的语句的步骤。
再有,上述步骤(b)最好包括防止重复生成用于执行同一运算的语句的步骤。
这一方法可以使用于逻辑电路的仿真方法中。该方法最好包括根据逻辑电路的表述生成包括第1进程的门电平的网表、生成包括第2进程的仿真用的程序、以及利用仿真用的程序以基于周期的方式对逻辑电路进行仿真。
具体实施方式
图1表示生成用于以基于周期的方式来仿真逻辑电路的模型的计算机系统的概略构成。该计算机系统1典型地具有作为硬盘的存储器2、和由包括CPU及存储器的适当的资源构成的处理功能3。通过将存储器2存储的模型生成程序5加载到处理功能3上,提供作为模型生成系统(模板6)而要求的各种功能。模型生成系统6,具有:逻辑合成功能11,即根据RTL等的逻辑电路的表述30,生成门电平的网表31的单元;以及内容发生器(发生器)12,即决定该门电平的网表(第1内容)31的评价顺序(评价进度表),并作为模型(第2内容)生成仿真用的程序(仿真程序)32的单元。取代模型生成程序5,将仿真程序32加载到处理功能3上,以此可使该计算机系统1作为基于周期方式进行仿真的仿真器7起作用。
发生器12包括从输出级向输入级递归地解析并调度包含于网表31中的与多级组合逻辑部(逻辑运算部)的各个门对应的运算(逻辑运算)的功能。也就是说,具有:从输出级向输入级对包含于网表31中的多级逻辑运算进行解析的单元(分析器)14、以及将逻辑运算转换及再构成为包含于仿真程序32中的命令(语句)并输出的单元(转换器)15。
分析器14在与网表31的各个门对应的各运算中判断成为解析对象的运算是发生自由的输入信号的类型(第1类型)的运算。转换器15在解析对象的运算是第1类型时,将用于执行该运算的命令(语句)再构成为如下所述的多个命令(多个语句)。还有,在仿真程序中执行运算的步骤,是在仿真中评价运算的步骤,运算结果或运算输出是仿真的评价结果。
1.选择合适的输入信号(第1输入信号),执行(评价)与该输入信号的源的门对应的前级运算的第1命令(第1语句)。
2.设定解析对象的运算输出(评价结果)的第2命令(第2语句)。
3.执行(评价)与因第1输入信号而成为自由的输入信号(自由输入信号)的源的门对应的前级运算的第3命令(第3语句)。
4.因第1输入信号而跳过第3命令的第4命令(第4语句)。
分析器14和转换器15分别以包含于第1和第3命令中的运算、依情况第2命令中包含的运算作为解析对象的运算,在到达输入级的运算之前反复进行同样的处理。该第1~第4的命令不必按该顺序执行。第4命令是条件分支命令,可以将第1命令组装入其条件中。特别是评价对象的运算是输入即时或全局变量的情况下,最好是第1命令只设定变数,并组装到条件分支命令中。在这种情况下,由转换器15输出的实际的语句就成为3个语句。作为条件分支命令的第4命令需要在第3命令之前执行。此外,第2命令既可以在条件分支后执行,也可以在分支前执行。
在该模型生成系统6中,包含再构成功能的转换器15,参照连同网表31等存储于存储器2的模板群20的适当的模板,生成对应于解析对象的运算的第1~第4命令。在模型(仿真程序)32的生成中,为了改善访问速度,最好是将模板群20暂时存储到包含于处理功能3的RAM等CPU可高速访问的存储器中。如果是独立于程序5的模板群20,则可以通过追加删除模板文件,来改变模板处理模式。
模板群20也可以嵌入存储器2所存储的模型生成程序5中。如果将模板群20或进行与模板群对应的处理的语句嵌入程序5中,由于不需要一一读出独立的模板群20,所以程序5本身的制作变得容易。
执行包括由发生器12生成的命令序列的仿真程序32时,运算部分的执行大体来说从输入级向输出级进行。但是在只评价与某一门对应的运算的某一输入信号的值,就决定了该门的输出值时,跳过用于计算其余的自由输入信号的值的前级运算的执行命令(短路评价)。因此,根据仿真程序32,仿真器7不限于在各时钟周期执行全部门,可以提高仿真的处理速度。因此能够提高基于周期的功能仿真的速度,能够应对随着LSI设计规模的增大而仿真负担增大的情况。
图2表示在计算机系统1中,以网表31或其一部分作为第1进程,根据该第1进程,以仿真程序32或其一部分生成为第2进程的处理的概要。而且,图2的流程图包括在利用仿真程序32进行仿真之前的处理。在步骤51中,利用逻辑合成功能11逻辑合成逻辑电路表述30,并生成门电平的网表31。然后,将程序发生器12作为生成第2进程的单元,在步骤52至56中生成仿真程序32,该仿真程序32包含用于执行包含于该网表31中的多级运算部分的命令序列。因此,步骤52至56成为以网表31为第1进程、根据第1进程生成包含于仿真程序32的第2进程的步骤。
在生成第2进程的步骤中,首先,在步骤52中,利用分析器14对运算部分的输出级的运算进行解析。在步骤54中,如果是发生了自由的输入(变成自由输入)的运算,则在步骤55中,转换器15将执行解析对象的运算的命令再构成为第1~第4命令,并作为第2内容(虚拟程序)的命令(语句)输出到存储器2。接着,在步骤53中,将前面输出的程序命令作为第1进程,从输出级向输入级对包含于其中的再构成的命令中的运算(前级的运算)递归地进行解析。如果前级的运算是发生自由输入的类型,则同样地对执行运算的命令进行再构成。然后,在步骤56中,反复进行上述处理,直到包含于运算部分的运算的解析结束。
在步骤55的再构成步骤中,最好设为不重复生成用于执行同一前级运算的命令。也可以设置统一功能,以便在再构成结束后统一执行相同运算的命令,从而能进一步提高处理速度。
在生成作为逻辑电路的仿真模型的程序32后,在步骤58中,使用该程序32执行仿真。
图3利用门电路来表述表示包含于门电平的网表31中的逻辑部分的构成。此外,如下所示的网表、程序表等仅仅是用于说明的例示。
包含于网表31中的某一运算部分36a是两级组合的逻辑运算。因此相当于存储在存储器2中的第1进程。逻辑运算部分36a包括输入级33的运算33p和33q,以及输出级34的运算34y。输入级的运算33p以信号A和信号B作为输入进行逻辑(AND)运算,输出信号P。输入级的运算33q以信号C和信号D作为输入,进行逻辑(NAND)运算,输出信号Q。输出级的运算34y以信号P和信号Q作为输入,进行逻辑(OR)运算,输出信号Y。信号Y成为运算部分36a的输出。在该运算部分36a中,输入级33的运算是相对于输出级34的运算的前级(前段)运算,输出级34的运算是相对于输入级33的运算的后级(后段、后续)运算。
图4将运算部分36a,表示为使用与图1不同的基于周期的仿真器编译了的仿真程序的一个例子。该仿真程序39a在下面所示的表述中大致作为比较例处理。但是显然并不表示本申请的权利要求范围中不包括具有输出表示为比较例的程序的功能的系统、程序、方法等。此外,在以下所述的实施方式中,分别将包含于程序中的多个命令(语句)表述为代码,有时把一组代码表述为代码块。此外,有时将逻辑运算、与运算或该逻辑运算对应的门(逻辑门)表述为节点。再有,在下述实施方式中,有时将包括再构成语句生成内容的情况表述为“调度”或“进行调度”。此外,在本说明书中,有时用不同单词置换表述几个单词,这是为了更容易理解包含于本申请中的发明,而不是限定本申请的权利要求范围的表述。
比较例的代码39a,是以从输入级向输出级执行的方式编译运算部分36a的结果。在基于周期方式的仿真中,从代码块39a的START标签到END标签表示用于对一个时钟周期的逻辑电路的动作进行仿真的命令组(命令序列)。在仿真中,按照时钟周期的数量反复执行该命令序列。因此,利用图4的代码块39a执行仿真时,每一时钟周期从输入级33向输出级34简单一律地执行并评价与所有的门的逻辑运算对应的命令。也就是说,在代码块39a中,从上开始依次地分别表述执行输入级的运算33p、33q以及输出级的运算34y的命令,并按该顺序执行运算。
图5表示表示利用图1的模型生成系统6编译过过的运算部分36a的仿真程序32的一个例子。利用分析器14从输出级34向输入级33对运算部分36a进行解析。首先,了解到输出级的运算34y为逻辑(OR),是发生自由输入的类型1的运算。因此,只要输入信号P和Q中一方的输入信号例如信号P为“1”,则不管另一输入信号Q如何,输出信号Y为“1”。因此,另一输入信号Q为自由输入信号。因此根据输入信号P的值,不需要执行另一个输入信号Q的源(发生源)即前级的运算(在本例子中是输入级的运算)33q。
按照图2所示的流程图,利用分析器14解析输出级的运算34y。由转换器15,将执行输出级的运算34的命令,如代码组32a所示地,再构成为第1命令61、第2命令62、第3命令63以及第4命令64的命令序列,并输出到存储器2。在代码块32a中,第1命令61是用于执行作为第1输入而选择的输入信号P的源的运算33p的命令(语句)。第2命令62是用于设定因输入信号P而输入信号Q成为自由输入时的输出信号Y的命令(语句)。第3命令63是用于执行作为自由输入的输入信号Q的源的运算33q的命令(语句)。第4命令64是用于在因输入信号P而输入信号Q变为自由输入时跳过第3命令63的命令(语句)。
代码块32a是第2进程的一个例子,表述不限于此。可以设为组合或分割包含于代码组32a中的命令的表述。例如命令63也可以设为执行运算33q、将其结果设定为输出Y的1个命令的表述。第1命令61也可以包含于条件分支命令即第4命令的条件的表述中。此外,第2命令62也可以表述为第4命令的ELSE语句。
用仿真器7执行图5所示的代码块32a时,大体从输入级33向输出级34执行并评价运算。但是,由于只要信号P的值为1,则信号Q的值为自由的,所以运算33q的计算本身被跳过。在这种规模的电路时,执行第4命令64的条件分支的语句成了额外开销(overhead)。因此,代码块32a的执行速度与代码块39a的执行速度没有大的差别,也有可能代码块32a的执行速度反而变得慢。但是,当运算33q不是简单的NAND门,而是由多级复杂的逻辑进行运算的情况下,可以整体跳过该多级运算的执行。因此,可以大大缩短发生自由输入的周期的代码块32a的执行时间。
图6表示包含于网表31中的不同的运算部分36b的构成。该运算部分36b也是两级组合的逻辑运算,包括输入级33的运算33p、33q和33r,以及输出级34的运算34y。输入级的运算33p和33q与图3所示的运算相同。33r以信号E和信号F作为输入进行逻辑(OR)运算,输出信号R。输出级的运算34y是选择器,以信号R作为控制信号(选择信号),以信号P或信号Q作为信号Y输出。
图7中将运算部分36b,表示为以从输入级向输出级执行的方式编译的比较例的代码块39b。在代码块39b中从上开始分别依次表述执行输入级的运算33p、运算33q、运算33r以及输出级的运算34y的命令。因此代码块39b表示在每个时钟周期内,都从输入级33向输出级34简单一律地执行仿真全部门的逻辑运算的命令。
图8中将运算部分36b表示为由图1的模型生成系统6编译过的仿真程序32的一个例子。从输出级34向输入级33解析运算部分36b时,相对于输入级的运算为后级或后续运算的输出级的运算34y是选择器,是发生自由的输入信号的第1类型的运算。也就是说,在运算34y中,因输入信号R而输入信号P和输入信号Q内有一方输入信号成为自由信号。因此,在以输入信号R作为第1输入信号进行解析时,因为该值,不需要执行输入信号P或Q的发生源即输入级(前级)的运算33p或33q。
按照图2所示的流程图,首先,解析输出级的运算34y,将执行输出级运算34y的命令,如代码块32b所示,再构成为第1命令61、第2命令62、第3命令63以及第4命令64的命令序列。在代码块32b中,第1命令61是执行作为第1输入而选择的输入信号R的源的运算33r的命令。第2命令62,在该例子中,是当因输入信号R而输入信号P成为自由输入时,用于设定输入信号Y的命令。第2命令62包括执行运算33q的命令和将运算33q的结果设定为输出Y的命令。第3命令63是执行成为自由输入的输入信号P的源的运算33p的命令。第3命令63包括执行运算33p的命令、将运算33p的结果设定为输出Y的命令、以及跳过第2命令62的命令。第4命令64是当因输入信号R而输入信号P成为自由信号时,跳过第3命令63的命令。
用仿真器7执行图8所示的代码块32b时,首先评价选择器34y的选择信号R,根据其结果追溯到输入级,只对信号P和信号Q的某一方的发生源进行评价。因此,能够缩短代码块32b的执行时间。
图9表示在内容发生器12中,作为内容生成仿真程序32时参照模板群20的例子。在转换器15中,在再构成语句的步骤55中参照模板群20。图9是用于使计算机系统1作为模型系统6起作用的模型生成程序5的程序的一部分,将分析器14的功能和转换器15的功能安装到计算机系统1中。也就是说,图9的程序源表示使用模板群20代码生成的程序(调度的程序)48的一个例子。利用该程序48,发生器12在步骤52中从指向门电平网表31的输出级34的门的节点出发,使用包含于模板群20的基于门的种类的模板,递归地生成代码。
当解析对象的运算为两个输入的AND门的情况下,转换器15使用包含于程序48中的模板21,再构成执行逻辑(AND)运算的命令。逻辑(AND)运算(门,节点),只要输入信号的一方为“0”,则输出为“0”,另一输入为自由输入。模板21,作为语句26,包括生成执行作为输入信号#0(input#0)的源的前级(前)运算的第1命令(代码)的指示(信息)。模板21,作为语句27,还包括生成将评价对象的运算(节点)的输出设定为“0”的第2命令(代码)的指示。语句21,作为语句28还包括生成作为短路评价用的条件分支的第4命令(代码)的指示。模板21,作为语句29还包括生成执行作为另一其他输入信号#1(input#1)的源的前级运算的第3命令(代码)的指示。
包含于模板群20的模板22,包括在评价对象的运算为逻辑(OR)时,转换器15再构成执行该运算的命令用的信息。关于在再构成的命令,上面已经叙述。
模板23是评价对象的运算为逻辑(XOR)时用的模板。在该逻辑运算中,没有发生自由输入。因此,模板23包括用于生成分别执行输入侧(前级)运算的命令、和根据这些结果来评价逻辑(XOR)的命令的指示。
模板24是逻辑(NOT)运算时用的模板。该逻辑运算也没有发生自由输入。因此,模板24包括生成执行输入侧(前级)运算的命令、和根据其结果来评价逻辑(NOT)的命令的指示。
模板25是用于对选择器进行解析的模板。该模板25中包括表示分别生成图8所示的第1命令61至第4命令64的信息的语句。
图10所示的代码块32c,是与图3所示的运算部分36a对应的代码块的不同例子。该代码块32c是根据图9的程序48,利用转换器15进行再构成并输出的例子。
图11中,包含于代码块32c中的各个命令表示利用转换器15进行再构成的过程。代码块32c是为了作为整体来运算输出信号Y而调度的代码块。其中,包含“L_P”标签的小块32d是针对信号P而调度的代码块,包含“L_Q”标签的小块32e是针对信号Q而调度的代码块。
首先,作为进程表(Y)生成用于执行作为输出信号Y的源的运算34y的命令。该命令是用于执行逻辑(OR)运算34y的命令。该命令,被基于包含于程序48中的模板22进行再构成,并被转换(再构成)为包括执行运算33p用的命令(时间表(P))、和执行运算33q用的命令(时间表(Q))的命令序列。然后,根据程序48,参照模板递归地解析、再构成各个命令。在图9的程序48中没有组装入NAND门用的模板,但是NAND门的模板可以根据AND门的模板而类推出来。
通常,在命令(进度表(P))以及命令(进度表(Q))中,包含执行成为该命令对象的运算的输入源的更前一级运算的命令。程序48参照所组装入的模板递归地解析、再构成这些命令。这些命令就是图11中利用细长的空框表示的命令(进度表(A)、(B)、(C)以及(D))。在图3所示的运算部分36a中,A~D信号是全局(global)输入信号(针对电路整体的输入信号)。因此不是能进行再构成的信号,所以在程序48中为“不做任何处理(do nothing)”,不会生成更多代码。这样一来,就生成了图10所示的代码块32c。
在生成作为模型的仿真程序32(进行调度)时,解析处理包含于网表31中的运算(逻辑)的顺序,与执行作为仿真程序32而生成的命令(代码)时的顺序(逻辑评价顺序)不同。在进行调度时,发生器12从输出级向输入级按照深度优先搜索的要领递归地对多级运算进行解析,并生成命令,进行置换或再构成。在仿真器7执行作为程序32而生成的代码时,大体来说,从输入级向输出级执行多级运算。
在由本实施方式的发生器12根据网表31生成的仿真程序32中,包括不明确表示评价对象的运算逻辑的命令。从组装入程序48中的模板可知,只要评价对象的运算是发生自由输入的类型,在程序32中就不明确表示该评价对象的运算逻辑。在发生自由输入时,不仅不执行自由输入的源的运算(前级运算),而且也不需要执行以自由输入作为输入的运算(评价对象(解析对象)的运算)本身,不明示需要自由输入的逻辑。
例如,如模板21所示,如果评价对象的运算逻辑是(AND),则在发生自由输入时,输出简单设置为“0”。在不发生自由输入时,仅简单地将另一输入设定为输出。此外,从图11所示的经过可知,越接近输出级,被根据评价对象的运算进行再构成的命令越分散。因此,几乎不可能根据仿真程序32推测评价对象的运算逻辑。因此,设计者不容易直接对由该模型生成系统6生成的仿真程序32进行编码,必然在仿真程序32的生成中使用计算机系统1。
以上,参照图3~图5、图6~图8,说明了根据包括第1进程的网表31来生成包括第2进程的仿真程序32的情况。在这些实施方式中,网表31是包括第1进程的第1内容,仿真程序32是包括第2进程的第2内容,内容发生器12能够根据第1内容生成第2内容。模型生成系统6的内容发生器12,也可以取代网表31,以从输入级向输出级调度的比较例的程序39作为包括第1进程的内容,使用组装了模板的程序48进行转换(再构成),作为包括第2进程的内容生成程序32。在这种情况下,可以将包括内容发生器12的处理功能3或计算机系统1称为最优化编译器。
在比较例的程序39等的规定某一规格或应用的典型的程序中,表示从输入级到输出级的时间经过的表述,表示程序计数器的行进方向、即表示语句的执行顺序(时间经过)的自上而下。从而,在该最优化编译器中,自下而上地与时间相反方向地解析源程序39,从而转换为不执行成为自由输入的发生源的运算的程序32,可以实现由源程序39带来的应用程序处理速度的提高。
此外,以上,以生成用于基于周期方式对安装于ASIC、FPGA等上的逻辑电路进行仿真的模型为例进行了说明。例如,图4或图7所示的程序39,表示在各周期中执行全部逻辑运算(逻辑门)的电路或装置。近年来,人们提出了能够以周期为单位动态地变更或再构成电路结构的硬件。例如,可以例举本申请人的国际公开WO2005/022380。
在这种可动态再构成的硬件中,并行地执行全部运算带来的优点是例如若不严格追求执行速度,则可以进行不同的处理(执行方法)。首先,生成硬件控制信息(配置信息),其用于在可再构成的硬件上安装用于执行图4或图7所示的程序39的各语句用的电路结构、即将图3或图6所示的电路。接着,以周期为单位一边再构成该电路结构的一部分,一边用小的硬件资源执行图3或图6所示的电路功能。
内容发生器12可以将上述硬件控制信息转换为相当于图5或图8所示的程序32的硬件控制信息。也就是说,内容发生器12可以转换为设置为忽略执行自由输入的源的运算的电路的安装的硬件控制信息。当利用该硬件控制信息来控制可再构成的硬件时,可以忽略硬件上再构成用于执行发生自由输入的运算的电路,能够提高处理速度,能实现更有效地利用硬件资源。
此外,能够在语句的再构成中利用的模板不限于图9所示的模板。图10所示的代码块32c是通过图9所示的程序48由安装到系统1上的发生器12进行调度的模板(以下有时也简单记为调度)的。图10所示的代码块32c是不同于图5或图8的代码,虽然不是进行错误的动作,但是不能说是高效率的代码块。在代码块32c中,根据输入全局变量的信号A和信号C的值将信号B或信号D判定为是自由的并进行条件分支,但是对提高代码的执行速度、即仿真的执行速度没有大贡献。当然由于判定和分支的额外开销的缘故,代码块32c有可能执行速度变差。可是,如果是为生成信号A~D而访问存储器,或生成这些信号需要数个时钟的情况,则在代码组32c中进行条件分支就非常有助于提高处理速度。
图12所示的程序48,包括用于再构成执行AND门运算的命令的模板21的不同例子。该模板21包含用于根据输入的属性判断是否进行再构成的信息。转换器15通过参考该模板21,在自由输入的源是如全局输入这种情况时,在利用第4命令跳过该自由输入的源也不能够期待(预想)改善仿真的执行速度的情况下,不进行再构成。此外,该模板21可以选择作为自由输入而跳过的前级运算。
图12所示的模板21,包括:如果输入信号#0和#1两者是全局变量,则指示不进行再构成的部分21a;在其他情况下,如果输入信号#0是全局变量,就指示以将其选择为第1输入并跳过输入信号#1的源的运算的方式进行再构成的部分21b;反之如果输入信号#1是全局变量,就指示以将其选择为第1输入并跳过输入信号#0的源的运算的方式进行再构成的部分21c;以及如果是除此以外的条件,就指示以缺省输入信号#0并选择为第1输入、跳过输入信号#1的源的运算的方式进行再构成的部分21d。使用该模板21时,转换器15可以生成图5和图8所示的代码。再构成用于执行其他逻辑运算的命令的模板也可以同样安排。
图13所示的程序48包括模板21的另一不同的例子。该模板21除了上面所述以外,还具有判断输入信号的发生源的运算的复杂性、指示选择判断发生自由的输入的部分21e和21f。在调度AND门运算和OR门运算时,最好也考虑输入信号的评价顺序。例如在图5所示的代码块32a中,根据信号(中间信号)P的评价结果跳过信号(中间信号)Q的评价(发生源的运算)。但是,反之也可以生成根据信号Q的评价结果跳过信号P的评价这样的代码。
在图5所示的代码块32a中,不管是用哪一个评价顺序,代码执行性能都不改变。但是,在信号P的源运算、还有源运算的更前一级的运算群的逻辑复杂的情况下,可以预料,比起“对发生信号P的复杂运算或运算群进行计算后,碰巧跳过发生简单的信号Q的计算”,“计算简单的信号Q之后,碰巧跳过发生信号P的复杂运算或运算群的计算”更好。因此在进行调度时,转换器15使用图3的模板21,并且根据计算输入信号的逻辑的复杂度(门数),区分使用先代码生成输入信号#0的部分21f、与先代码生成输入信号#1的部分21e。
但是,所说的进行调度时要判断的逻辑的复杂度,有可能不能简单地以门的数量计算。例如图6所示的逻辑电路36n,简单地计算的话包括4个门。但是,图8所示的代码块32b,以跳过自由输入的运算的方式进行调度。因此,通过执行代码块32b,必然能够跳过信号P或信号Q任一方的发生源的运算,因此代码执行时间实际上只要3个门的数量即可。因此,可以说由通过该调度而生成的代码表现的逻辑复杂度相当于3个门。
要而言之,在本实施方式中,所谓“进行调度”包括跳过自由输入的源的运算(自由输入的运算),所谓对由“跳过”带来的好处作出贡献的逻辑复杂度,是“评价该逻辑所花费的时间”,是作为短路评价的对象的代码和/或代码块(短路评价代码)的执行时间的期待值。很难准确地计算该期待值,需要很多时间。因此,比较而言期待值不言自明的对象反映到模板上是有效的。但是,短路评价代码组装进来后,很难准确计算期待值。从而,在很难准确计算期待值时,最好配合使用从用户得到指定暗示、利用性能统计器(profiler)自动统计之类的试探式的方法。
而且,即使了解了某一门的输入信号的发生源的运算群的复杂度大小,也不一定能够就这点完全地决定评价顺序的好坏。因为评价顺序的好坏还依赖于跳过自由输入的发生源的运算的概率。考虑对包括输入复杂的中间信号P(大部分情况下为1)和简单的中间信号Q(大部分情况下为0)的逻辑(OR)的进程进行仿真的情况。可能有“先计算简单的中间信号Q,由于大部分情况为0,所以不得不再计算复杂的中间信号P,结果就变成了大部分情况下都要计算P和Q两者的困境”的调度,和“中间信号P虽然复杂,但是尝试计算时大部分情况都为1,因此可以跳过认为简单的中间信号Q的计算”的调度。而且,可能有后者的调度比前者的调度更好好的情况。
因此,在跳过自由输入的运算的调度中,最好使用包括下述指示的模板,即指示以跳过概率与跳过后的增益之积(跳过增益的期待值)为最大的评价顺序的方式来再构成(再生成)代码。得到跳跃增益的期待值的方法,包括从用户获得因各中间信号而其他信号成为自由输入的概率、和利用性能分析器自动统计跳过概率和/或跳过后的增益。本发明的方法方式之一,包括并行进行执行仿真和性能分析统计、动态地决定评价顺序进行短路评价、利用发生器12进行代码的生成和/或再构成(再生成)。
“跳跃增益的期待值”的想法(指标)不仅是比较评价顺序,而且也可以使用在比较包含于本发明的利用调度而生成的程序例如图5和图8的程序32a以及32b的短路评价、和图4和图7所示的比较例的程序39a和39b的一律线性评价时,。在虽然计划进行短路评价、但却未发生跳跃的情况下,与一律线性评价相比,代码执行慢条件判定代码和条件分支代码大小的时间。因此,短路评价的增益是负值。即使计划进行短路评价并大量发生跳跃的情况下,比较短路评价的增益和一律线性评价的增益时,短路评价的增益也损耗条件判定条件分支额外开销的大小。因此,根据中间信号的复杂度的不同,也有“跳跃概率不那么高时,增益的期待值不是正值”的情况。对这样的门电路(逻辑电路)进行仿真时,最好是按照时间经过采用一律线性评价的方法。
例如图12所示的模板21,包括在进行调度时,指示“只有在两个输入信号为全局输入信号的情况下,生成一律线性评价代码”的部分21a。取代该部分21a,将进行调度时指示“在两个输入信号的计算逻辑极其简单的情况下,生成一律线性评价代码”的部分包括在模板21中是有效的。但是“极其简单”这一规定是依赖于仿真所使用的计算机的构成等条件的规定,最好还包括这些条件。例如,如果将能够利用1个门的数量级进行计算的输入信号看作极其简单,那么对于图3的逻辑36a,本实施方式的发生器12包括生成图4所示的一律线性评价用的代码块。
此外,在上述说明中,转换源的第1进程的一个例子是门电平的网表31,而且网表31以仅由两个输入基本门及选择器构成的逻辑电路作为对象。但是,本说明书中所包含的跳过自由输入的源的调度方法不限于以仅包括两个输入基本门或选择器的逻辑电路为对象的网表,显然对于以包括多个输入门和/或复合门的运算元件的逻辑电路为对象的网表也可以使用。
下面进一步对有关包括中间信号发生分支的中间级运算的逻辑电路的实施方式、以及具有多个全局输出信号的逻辑电路进行说明。
图14中利用逻辑电路表示包含于网表31的又一不同的运算部分36d。该运算部分36d是三级的组合逻辑运算,包括输入级33的运算33p、中间级35的运算35q和35r、输出级34的运算34y。输入级的运算33p以信号B和信号C作为输入运算逻辑(XOR),输出信号P。运算35q以信号A和信号P作为输入运算逻辑(AND),输出信号Q。运算35r以信号P和信号D作为输入运算逻辑(NOR),输出信号R。输出级的运算34y以信号Q和信号R作为输入,运算逻辑(OR),输出信号Y。
图15中表示为了对运算部分36d进行仿真,图1的模型生成系统6所生成(编译)的仿真程序32的代码块的一个例子。在该代码块32d中,对于作为运算35q和运算35r两者的输入的信号P,在两处生成执行其发生源的运算33p的命令65。在这个例子中,运算33p是输入级,用于执行运算33p的语句65是仅用于执行1个逻辑(XOR)(XOR门)的语句。因此,即使在两个位置进行相同的计算,对代码块32d的执行速度的影响也很小。但是,也有可能是运算33p复杂,或者运算33p不是的输入级并且其前级的运算逻辑复杂的情况。在这种情况下,重复计算信号P的发生源无论在代码量方面,还是在代码执行时间方面都很浪费。
因此,图1所示的模型生成系统6的转换器15,最好包括防止重复生成执行同一运算的命令的单元。但是,不能简单地统一执行这些相同运算的命令。需要考虑执行一方运算的命令因短路评价而被跳过的可能性。
参照图16~图24,对包括防止重复执行同一运算的几个例子进行说明。图16表示运算部分36d的仿真程序32的代码块的不同例子。在该代码块32e中,将运算信号P的发生源的代码作为子程序66独立,以使执行中间信号P的发生源的运算作为代码量不重复。此外,为了不重复执行中间信号P的发生源的运算,在调入子程序之前生成包括“如果已经完成计算信号P,就不调入子程序”这样的判定的语句。为了正确进行该判定,作为初始化处理,将表示中间信号P的变量设定为既不是“0”也不是“1”的称为“UNDEFINED”的值。
在图17所示的程序48中,组装入包括指示生成代码块32e的部分的模板41。模板41指示将相对于后续运算为输入的中间信号全部暂且设定为“UNDEFINED”。另外,模板41指示进行初始设定,以能够对成为中间信号的发生源的运算进行子程序调入。
图17所示的程序48,除了模板41外,也可以包括再构成各运算的执行命令的模板21~25。这些模板21~25可以在程序48的模板41之后的“schedule_real”进程中表述。表述的内容也可以是与图9等所示的程序中包含的“schedule”进程相同的内容。
此外,程序48包括模板42。该模板42,指示在需要执行发生分支的中间信号的发生源的运算的命令代码的位置,取代执行该发生源的运算的命令代码,生成“如果是UNDEFINED,就调入子程序”这样的代码。使用该模板42进行调度时,在“schedule_real”进程的内部递归使用“schedule”进程,所以能够防止对全部运算的重复执行。
图18是运算部分36d的仿真程序32的代码块的又一不同例子。由于在最初的“calc_P子程序调入”时,信号P一定是“UNDEFINED”,所以没有必要进行特地判定。在该代码块32f中,最初的子程序调入时,不进行是否是“UNDEFINED”的判定,而设为无条件地进行子程序调入。
图19是运算部分36d的仿真程序32的代码块的又一不同例子。可以不将输入信号P作为“0”或“1”或“UNDEFINED”处理,而设置表示计算已完成的标记,可以在代码块32g中将信号P作为“0”或“1”两个变量处理。因此在代码块32g中,和表示输入信号的变数P相区别,设置“P_valid”这一“表示计算是否已完成的变量”。
图20是运算部分36d的仿真程序32的代码块的又一不同例子。在该代码块32h中,在calc_P子程序内进行输入信号P的源的运算是否已经计算完成的判定。在代码块32h的主程序中,是在要求信号P的运算的位置,无论如何都调入calc_P子程序的代码方式。
图21是运算部分36d的仿真程序32的代码块的又一不同例子。在代码块32i中,是将calc_P子程序的调入设为经由指针的间接调用,在计算完成后以指针指向nop子程序的方式进行改写的代码方式。
图22是运算部分36d的仿真程序32的代码块的又一不同例子。在该代码组32j中,强制执行信号P的发生源的运算,预先求出信号P的值。适用于即使进行短路评价,在信号P作为输入信号的全部后续(后级)的运算中,信号P成为自由输入的可能性低、信号P的发生源的运算的执行全部被跳过的可能性低的情况。
图23是运算部分36d的仿真程序32的代码块的又一不同例子。在该代码块32k中,在强制执行信号P的发生源的运算、预先求出信号P的值这一点与上述情况相同。此外,由于完成计算的中间信号P可以与全局输入信号同格处理,因此,在后续运算的调度中,不会发生跳过中间信号P的发生源的运算的代码。
在图24所示的程序48中,组装入用于生成图22所示的代码块32j的模板43。该模板43在调度中指示“对全部发生分支的中间信号,递归地再构成执行其发生源的运算的命令,生成代码”。因此,在利用程序48调度运算部分36d时,在执行中间信号的发生源的运算之后,就以从输出级向输入级跳过自由输入的发生源的方式将其余的运算生成代码。并且,在模板43中,最好包括下述指示,即,先处理靠输入级的中间信号的发生源的运算,后处理靠输出级的中间信号的发生源的运算,以即使中间信号彼此之间有依存关系也不要紧。
上面叙述了防止重复进行发生分支的中间信号的运算的几种方法,这些方法,不管是单独还是混合多个方法都能适用于生成程序。例如可以并用图16所示的代码块32e的方式和图22所示的代码块32j的方式。可以生成包括下述内容的代码块:看起来完全被跳过的可能性低的中间信号的发生源的运算,如代码块32j所示地必须进行计算;除此以外的中间信号的发生源的运算,每次边检查是否如代码块32e所示地已完成计算边进行计算。人们考虑了几种估计包含于运算部分中的某一运算被作为自由输入的发生源的运算而跳过的可能性的方法。其中之一是静态地解析运算部分的逻辑,有可以判定为“完全被跳过的可能性为0”的情况。另一种方法是引入用户指定、统计(profiling)等试探方法。
图25所示的程序48中还组装入不同的模板45。该模板45对应于有多个全局输出信号的运算部分的调度。模板45指示按照全局输出信号的数量反复进行调度。可以取代该模板45,以图17所示的模板为基础,利用同样的想法构成与多个全局输出信号对应的模板。
也就是说,如果是不存在跨多个输出信号的共有中间信号的情况,就设置N个完全独立的逻辑。因此,可以将上述一个输出逻辑用的模板分别使用于N个逻辑。在存在共有中间信号的情况下,可以使用图25所示的程序48。如果列表求出全部共有的中间信号,就可以和没有共有信号的独立的N个逻辑一样地处理其余的逻辑。
以上,以组合逻辑门为基础说明了根据第1进程生成考虑了发生自由输入的第2进程的概要。触发器、“用线路将全局输入信号连接到全局输出信号(不进行任何计算)”的运算等不发生自由输入的运算不需要进行再构成,只要是本行业的普通技术人员,根据上面说明,就能够提供指示生成包括上述内容的语句的模板。此外,以上为了进行说明,参照C语言格式的代码(代码块)对生成第2进程的情况(进行调度的情况)进行了说明。通过参照这些说明,实现本申请所包括的发明,不限于C语言,可以生成汇编语言、机器语言等其他语言的代码(代码块),或生成包括这些代码的内容,此外,还可以进行转换。