本发明涉及处理机和操作处理机的方法。本发明在并行流水线处理机, 如非常长的指令字(VLIW)处理机中有特殊的应用。 高性能处理机用称为流水线式的技术增加处理指令的速率。流水线是 通过在若干个阶段中执行一个指令,在单个流水线级中执行每个阶段进 行工作的。指令通过连续的流水线级流动,所有部分地完成的指令在每 个处理机的时钟周期上向前移动一级。当诸指令到达流水线的终端时完 成对它们的执行。 诸处理机试图使诸流水线在所有的时间中都是满的,这样来保证指令 完成的高速率。然而,由于某种原因一个指令可能在单个时钟周期中不 能通过一条流水线的诸级中的一级,例如,因为它需要接入慢存储器或 许者计算一个多周期工作。我们将这种情况称为失速(stall)。当一条流水 线的级i失速时,就会阻止在级i-1的指令向前行进,即便在级i-1的指 令本身并不失速。反过来这又使级i-2失速,如此一直到级0(第1级)。 当在级i有失速时,一个信号流动到在流水线中的所有的从0到i-1的级, 使它们在流水线时钟信号的下一个有效边沿前失速。 一些处理机结构提供两条或更多条并行流水线,用于同时处理不同的 指令(或一个指令的不同部分)。在这种情形中,必须将失速信号分布 到所有的流水线,以便保证并行地发出的诸指令也能并行地完成。然而, 传播这样一个全局的失速信号的延迟可能限制处理机的工作时钟频率。 而且,这样一个信号必须经过的距离随着加入更多的流水线而增加。所 以一个具有较多流水线的处理机需要一个较慢时钟频率,于是使进一步 增加流水线实现高的总处理能力的努力受到挫折。 本发明就是要力图克服上述的诸缺点。 根据本发明的第1方面,我们提供包括下列装置的处理机: 多条流水线,每条流水线都具有多个流水线级用于在连续的时钟周期 上执行指令;和 失速装置,用于响应在任何一条流水线中产生的失速信号在所有的流 水线中使指令的执行失速。 其中用失速装置使在一条不产生失速信号的流水线中的一个指令的执 行在一条产生失速信号的流水线中的一个指令的执行后面至少一个时钟 周期上失速,并在这条不产生失速信号的流水线中在这条产生失速信号 的流水线中的失速后面至少一个时钟周期上解除失速。 在不同的时钟周期在不同的流水线中使指令执行失速可以得到附加的 时间,利用该时间使失速信号从这条产生失速信号的流水线分布到其它 的流水线。这样可以使处理机以比其它情况更高的速度运行。通过比在 流水线中产生失速信号的失速晚至少一个时钟周期释放在流水线中不产 生失速信号的失速,在不同的流水线中的各指令在一个或多个时钟周期 的不同步之后可以回到对准状态。优先地,从失速释放的相应的流水线 之间的时钟周期的数目与被失速的相应的流水线之间的时钟周期的数目 相等。 本发明可以用于一个处理机流水线的全部或任何一部分。作为例子, 每条流水线可以包括一个或多个地址计算级,一个指令提取级,一个指 令解码级,一个指令执行级,和/或其它的级或子级。 如果两个或更多的流水线同时产生一个失速信号,不必响应于另一流 水线产生的失速信号对每一流水线进行失速。这是因为每一流水线可以 实现适当的失速。如果每一条流水线也响应于由另一流水线产生的失速 信号被失速,可能发生多于需要的失速。于是,失速装置可以被安排成 使得当在第一流水线的一个流水线级从第二流水线接收到一个失速信号 时,如果该流水线级响应于由第一流水线产生的失速信号在前一周期中 失速,在第一流水线中的该流水线级中的指令的执行不被失速。 失速装置可以被安排成使得当一条流水线在级i产生一个失速信号时, 使包括那条流水线的级i在内的所有的级都失速。在这种方式中,使在一 条流水线中的诸较前面的诸级失速以便防止在一条流水线中的诸指令相 互复盖。不需要使较后面的诸级失速,从而较后面的诸级中的诸指令可 以如通常那样地继续通过流水线前进,虽然,如果需要的话,也可以使 所有的或一些较后面的级失速。 可以如此安排失速装置,使得当一条流水线在级i产生失速信号时, 在一个给定的时钟周期上使直到和包括那条流水线的级i的所有的级都失 速,在所述给定的时钟循后面的m个时钟周期上使直到和包括一条不产 生失速信号的流水线的级i+m的所有的级都失速,其中m是大于或等于 1的整数。假定在一条不产生失速信号的流水线中后面的m个时钟周期 上使直到级i+m的所有的级都失速,则使在那条流水线中的与在产生失 速信号的流水线中的诸失速的指令相对应的诸指令失速。 处理机可以包括多个流水线群集,每个群集包括多条流水线。在这种 情形中,可以安排失速装置使在同一个时钟周期中在一个群集内的诸流 水线中的指令执行失速。 优先地,在工作中,并行地(也就是说在一个特定的时间周期中)进 入各条流水线中的诸指令并行地离开诸流水线。可以在不同流水线中执 行不同的指令。例如,处理机可以是一个VLIW处理机,其中将来自一 个VLIW指令包的诸指令并行地发送给诸流水线。 每条流水线可以包括至少一个执行级,在该执行级中一个指令至少可 以被部分地执行。可以使诸流水线响应失速信号不被清洗那样地安排处 理机。 优先地将失速控装置分布在两个或更多个流水线级之间。这能够允许 每个流水线级对它自己的失速进行控制。这样一种安排能够容易地使失 速机构按比例放大以便根据需要包括更多的流水线或流水线级。 于是,两个或多个流水线级的每个都可以与用于控制那个流水线级的 失速的失速控制电路结合起来。可以安排在每个流水线级中的失速控制 电路产生一个用于使另一条流水线失速的全局失速信号,并接收来自另 一条流水线的一个全局失速信号用于使与失速控制电路结合的流水线级 失速。可以这样安排失速控制电路,如果结合的流水线级受到来自在另 一条流水线中的同一个级或后面的级的全局失速,则不产生全局失速信 号。这能够有助于保证在不同流水线中的诸指令在两条或多条流水线同 时产生诸失速信号的情形中正确地对准。优先地在两条或多条流水线中 的每一条中的失速控制电路基本上是相同的。 可以这样安排处理机使得如果在一个流水线级中存在一个泡则不使那 个流水线级失速。甚至当在其它情况下使诸指令失速时,这也能够允许 诸指令向前移动进入一个泡。 根据本发明的第2方面,我们提供一个包括多条流水线的处理机,每 条流水线都具有多个流水线级用于对通过诸流水线的信息执行一系列工 作,两个或多个流水线级每个都有相结合的失速控制电路用于控制那个 流水线级的失速,该控制电路包括: 用于产生一个保持信号的装置,该保持信号或者响应由那个流水线级 产生的一个局域失速信号或者响应由另一条流水线产生的一个全局失速 信号使结合的流水线级失速; 用于产生全局失速信号的装置,该全局失速信号响应所述的局域失速 信号使另一条流水线失速;和 用于延迟全局失速信号的装置,使得在认定保持信号后面的一个给定 数目的时钟周期上认定全局失速信号,而且在解除保持信号后面的相同 数目的时钟周期上解除全局失速信号。 第1方面的任何特点都可以加到第2方面中。 我们也提供相应的诸方法,这样在本发明的第3方面提供了一个操作 处理机的方法,该处理机包括多条流水线,每条流水线都有多个用于在 诸连续时钟周期上执行诸指令的流水线级,每条流水线都能够产生一个 失速信号,该方法包括: 在一条流水线中产生一个失速信号; 在产生失速信号的流水线中使一个指令的执行失速; 在不产生失速信号的流水线中在后面的至少一个时钟周期上使一个指 令的执行失速; 解除在产生失速信号的流水线中的失速;和 在后面的至少一个时钟周期上解除在不产生失速信号的流水线中的失 速。 处理机的任何特点都可以作为方法的特点并且反之亦然。 根据本发明的第4方面,我们提供一个处理机,它包括: 多条流水线,每条流水线都具有多个流水线级用于在诸连续的时钟周 期上执行指令;和 失速控制电路,它对诸流水线中的诸指令的失速进行控制; 其中用失速控制电路在一条产生失速信号的流水线中的一个指令的执 行后面至少一个时钟周期上使在一条不产生失速信号的流水线中的一个 指令的执行失速,和在这条产生失速信号的流水线中的失速后面至少一 个时钟周期上解除在这条不产生失速信号的流水线中的失速。 根据本发明的第5方面,我们提供一个处理机,它包括多条流水线, 每条流水线都具有多个流水线级,这些流水线级对通过诸流水线的信息 进行一系列工作,两个或多个流水线级每个都有相结合的失速控制电路, 该电路控制那个流水线级的失速,该控制电路包括: 一个产生保持信号的电路部分,该保持信号或者响应由那个流水线级 产生的一个局域失速信号或者响应由另一条流水线产生的一个全局失速 信号使结合的流水线级失速; 一个产生一个全局失速信号的电路部分,该全局失速信号响应所述的 局域失速信号使另一条流水线失速;和 一个延迟全局失速信号的电路部分,使得在认定保持信号后面的给定 数目的时钟周期上认定全局失速信号,而且在解除保持信号后面的相同 数目的时钟周期上解除全局失速信号。 现在我们将参照所附诸图单纯用例子描述本发明的诸优先的特点,其 中: 图1是在本发明的第1实施例中一个处理机的诸部分的方框图; 图2是一条7级流水线的示意图; 图3表示在本发明的第1实施例中失速控制电路的诸部分; 图4是在本发明的第2实施例中一个处理机的诸部分的方框图; 图5表示在第2实施例中失速控制电路的诸部分; 图6是表示图5的流水线级的部分工作的状态变迁的图; 图7到10表示第2实施例的工作的一个例子; 图11到14表示第2实施例的工作的另一个例子; 图15表示在本发明的第3实施例中失速控制电路的诸部分;和 图16到41表示第3实施例的工作的诸例子。 第1实施例 图1是根据本发明的第1实施例一个处理机的诸部分的方框图。在这 个实施例中,处理机是一个非常长的指令字(VLIW)处理机,它被设计 得能够执行可以分成诸较短的指令的长指令。 参照图1,处理机1包括指令发出装置10,调度存储装置12,第1和 第2执行装置14,16以及第1和第2寄存器队列18,20。指令发出装置 10具有两个发出槽IS1,IS2分别与执行装置14,16连接。第1执行装 置14与第1寄存器队列18连接,第2执行装置16与第2寄存器队列20 连接。寄存器队列18,20通过一条总线22相互连接。作为通过一条总 线连接的两个寄存器队列的一个替换物,可以提供单个寄存器队列。每 个执行装置14,16也通过总线26与一个外部存储器24连接。在这个例 子中,外部存储器24是随机存取存储器(RAM),虽然它也可以是任何 其它类型的存储器。 在工作中,将一个为了执行的指令包从调度存储装置12传送到指令 发出装置10。指令发出装置10将指令包分成它的诸构成指令,并分别通 过发出槽IS1,IS2将两个指令发送到执行装置14,16。然后执行装置14, 16同时执行不同的指令。在这种方式中,并行地处理一个长指令的不同 部分。 每个执行装置14,16用一种流水线技术使处理指令的速率达到最大。 通过完成指令执行的多个阶段中的每一个,流水线就像单个流水线级一 样地进行工作。诸指令以一种生产线的方式,通过诸连续的流水线级流 动,所有部分完成的指令在每个处理机时钟周期上向前移动一级。当它 们达到流水线的终端时完成诸指令的执行。 图2是一条7级流水线的示意图。在这个示意图中,每级的内容是已 经到达流水线的那一级的指令的序号。诸流水线级可以包括,例如,诸 指令读取级,诸指令解码级,和诸指令执行级。在流水线中的诸指令从 左向右,从级0到6流动。 希望流水线在所有的时间中都是满的,这样来保证指令完成的高速率。 然而,由于某种原因一个指令可能在单个时钟周期中不能通过一条流水 线的诸级中的一个级,例如,因为它需要接入慢存储器或者计算一个多 周期工作。我们将这种情况称为失速。当级i失速时,就会阻止在级i-1 的指令向前行进,即便在i-1级的指令本身并不失速。反过来这又使级i- 2失速,如此一直到级0(第1级)。如果级0到i在时间T失速,则在 时间T+1,没有指令通过级i+1。如果在另一个周期中失速继续存在,则 在时间T+2,没有指令通过级i+1和i+2。这些空的流水线级称为泡 (bubble)。在图2中,在级和4中显示出2周期的泡。 这样设计VLIW处理机,使得并行地发送给不同流水线的诸指令也并 行地完成它们的执行。如果放松这个规则,则已经证明很难清楚地停止 一个运行过程和在某个以后的时间中再开始。于是,如果在一条流水线 中存在一个失速,则每条其它的流水线必须也失速,以便保证不同指令 并行地离开诸流水线。例如,如果在图1中的执行装置14中在流水线中 存在一个失速,则在执行装置16中的流水线也必须失速。 当在一条流水线的级i上存在一个失速时,那个级就产生一个失速信 号。这个失速信号被分布到在流水线中的从0到i-1的所有级中,使它们 在流水线时钟信号的下一个有效边沿前失速。 一个可能的用于使图1的处理机中的其它流水线失速的方案是取来自 两条流水线的每一级的失速信号的逻辑或(“或”),并将结果分配给 两条流水线。然而,这需要在流水线时钟信号的下一个有效边沿前将一 个全局失速信号发射给所有的流水线级。对于高速处理机,在传播这样 一个全局失速信号中的延迟可能限制处理机的工作时钟频率。而且,如 果为了增大处理速率而加入更多的流水线,则全局失速信号必须经过的 物理距离将增加,从而甚至进一步限制了工作时钟频率。 根据第1实施例,通过各条流水线的诸指令可能相互不同步地到达一 个级,这样就为一个从一条流水线到另一条流水线的失速信号提供一个 满的时钟周期。 现在参照图3描述第1实施例的工作。图3表示第1流水线(流水线 1)的两个级,级i和级i+1,和第2流水线(流水线2)的诸对应的级。 流水线1的级i包括流水线寄存器40,处理电路42,或门44,寄存器45, 46,与(“与”)门47和或门48;流水线1的级i+1包括流水线寄存器 50,处理电路52,或门54,寄存器55,56,与门57和或门58;流水线 2的级i包括流水线寄存器60,处理电路62,或门64,寄存器65,66, 与门67和或门68;流水线2的级i+1包括流水线寄存器70,处理电路72, 或门74,寄存器75,76,与门77和或门78。在这个例子中,寄存器45, 55,65,75和46,56,66,76是由多个D型触发器作成的。由一个共 同的时钟信号馈送所有的时钟输出。流水线1的级i和i+1是图1中的执 行装置14的一部分,流水线2的级i和i+1是图1中的执行装置16的 一部分。 在正常的工作中,每个处理电路42,52,62,72执行一个保持在对 应的寄存器40,50,60,70中的指令的一个阶段。级i的处理电路42和 62并行地执行两个属于一个VLIW指令包的指令的阶段i,级i+1的处 理电路52和72同时执行两个属于另一个VLIW指令包的指令的阶段 i+1。在每个时钟周期上,将保持在诸寄存器中的诸指令传送到诸流水线 中的下一个寄存器以便进一步处理。在这种方式中,诸指令通过诸流水 线流动而所有的部分完成的指令在每个时钟周期上向前移动一级。 如果需要使它正在执行的指令的前进失速,则每个处理电路42,52, 62,72都能够认定一个失速信号。分别将来自处理电路42,52,62,72 的诸失速信号馈送到或(或)门44,54,64,74。分别将或门44,54, 64,74的诸输出信号馈送到或门48,58,68,78。或门48,58,68,78 分别将诸保持信号输出到处理电路42,52,62,72。这样,如果诸处理 电路中的一个认定一个失速信号,则通过诸对应的或门认定那个处理电 路的保持信号。如果设置了输入到一个处理电路的保持信号,则那个处 理电路将失速。 也将每个或门44,54,64,74的输出作为一个波纹(ripple)信号馈送 到在同一条流水线的前一级中的相应的或门。于是诸波纹信号波纹地通 过诸流水线,使得如果一个处理电路认定一个失速信号,则也认定输入 到同一条流水线中的所有前面的处理电路的诸保持信号。 也将每个或门44,54,64,74的输出作为一个全局信号馈送到其它 流水线的下一级。每个寄存器46,56,66,76从其它流水线的前一级接 收这样一个全局信号。例如,将或门44的输出馈送到寄存器76和将或 门64的输出馈送到寄存器56。 每个寄存器46,56,66,76在它的输入端延迟信号直到下一个时钟 周期。于是,每个寄存器46,56,66,76的输出是来自其它流水线的前 一级的全局信号,被延迟到下一个时钟周期。通过各个与门47,57,67, 77将每个寄存器46,56,66,76的输出馈送到各个或门48,58,68,78, 各个或门48,58,68,78分别将诸保持信号输出到处理电路42,52,62, 72。于是,假定设置了到与门47,57,67,77的诸其它输出,如果一个 处理电路认定一个失速信号,则将在下一个时钟周期认定输入到其它流 水线的下一个处理电路的保持信号。 分别也将处理电路42,52,62,72的诸失速信号馈送到寄存器45,55, 65,75。分别将寄存器45,55,65,75的倒相输出馈送到与门47,57, 67,77。于是,如果相应的处理电路在前一个时钟周期中认定一个失速 信号,则使每个与门47,57,67,77的输出复位而与寄存器46,56,66, 76的状态无关。如果对应的流水线级由于一个局域产生的失速信号在前 一个时钟周期中失速,则这防止寄存器46,56,66,76产生一个失速信 号。在这种方式中,如果两条流水线在同一个时钟周期中产生一个失速 信号,则只完成一个失速。 作为一个例子,如果处理电路42在一个给定的时钟周期中设置失速 信号,则或门44和48保证那个级的保持信号被设置。一个波纹信号通 过那些级的诸相应的或门流到所有的级i-1到0,使那些级中的每一个都 设置保持信号。于是,在流水线时钟信号的下一个有效边沿前在第1流 水线的所有的级0到i上设置一个保持信号,使那些级失速。然而,因为 或门44的输出被寄存器76延迟,所以不设置输入到处理电路72的保持 信号直到流水线时钟信号信号的下下个有效边沿为止。类似地,由于寄 存器66,输入到处理电路62的保持信号被延迟一个时钟周期,如此等等 直到第2流水线的级1。这样,第2流水线的级0到i+1在第1流水线的 级0到i后面的一个时钟周期失速。因为当使第1流水线中的诸指令失速 时在那条流水线中的诸指令将前进一级,所以需要使第2流水线的级0 到i+1失速。当一条流水线的级1失速时,安排那条流水线的级0失速。 当维持对来自处理电路42的失速信号被设置时,到第1流水线的级0 到i的保持信号和到第2流水线的级0到i+1的保持信号维持被设置,使 那些级保持失速。当解除失速信号时,也解除到第1流水线的级0到i的 保持信号,使得在那条流水线中进行通常的工作。然而,由于寄存器66, 76(和在前面的诸流水线级中的诸相应的寄存器)的工作,到第2流水 线的级0到i+1的诸保持信号只在下一个时钟周期上被解除。于是,在第 2流水线中在下一个时钟周期上进行通常的工作。这个在解除失速中的一 个周期延迟允许两条流水线回到相互同步的状态。 这样,我们看到在两条流水线内的各个指令可以变得不同步到一个周 期,从而为在诸流水线之间传播的失速信号提供一个满的时钟周期。 第1实施例具有下列主要特点: 1.无论哪条流水线都能够在任何本身不是失速主体的周期中认定一个 失速信号。 2.在同一条流水线中的失速级前的诸级将在与失速级相同的周期中失 速,但是将使在其它流水线中的诸级在一个周期后失速。 3.当解除失速时,在那条流水线中的所有的失速级立即向前行进,但 是在一个周期后才解除在其它流水线中的诸失速级。它的纯效应是诸失 速工作在当失速时不同步到一个级后回到对准的状态。 4.用于控制每级失速的逻辑值对于那个级来说是局域的。可以用一个 满的时钟周期将全局失速信号分布到其它流水线中。 我们将看到因为一条流水线的最后一级不能及时地使其它流水线失速 以便防止在最后一级中的指令离开流水线,所以流水线的最后一级不能 认定一个失速信号。这个问题可以或者通过使一条流水线的最后一级永 远不需要认定一个失速信号那样地安排处理机和指令集,或者通过将一 个最后的伪级加到每条流水线上来解决。 如希望的话,通过安排寄存器45,55,65,75和46,56,66,76在 它们的输入端使诸信号延迟两个或多个时钟周期,可以为在诸流水线之 间传播诸失速信号引入两个或多个时钟周期。例如,可以用两个或多个 串联连接的D型触发器代替图3中的每个触发器45,46,55,56,65, 66,75,76。在这种情形中,处理机可以保证流水线的最后m级不认定 一个失速信号,其中m是时钟周期延迟数,或是可以加入的m个伪级数, 或者可以用这两个方法的组合。 第2实施例 图4表示根据第2实施例的一个处理机的诸部分。参照图4,处理机 100包括一个指令发出装置102,一个调度存储装置104,第1到第8执 行装置(E.U.)106,108,110,112,114,116,118,120和第1到第 4寄存器队列122,124,126,128。指令发出装置102具有8个分别与 执行装置106到120连接的发出槽IS1到IS8。第1到第2执行装置106, 108与第1寄存器队列122连接,第3到第4执行装置110,112与第2 寄存器队列124连接,第5和第6执行装置114,116与第3寄存器队列 126连接,第7和第8执行装置118,120与第4寄存器队列128连接。 每个执行装置通过总线134也与一个外部存储器132,如一个RAM器件 连接。 在工作中,将一个为了执行的指令包(VLIW指令包)从调度存储装 置104发送到指令发出装置102。指令发出装置102将指令包分成它的诸 结构指令,并通过发出槽IS1到IS8将诸指令发送到执行装置106到120。 然后执行装置106到120同时执行属于该指令包的不同的指令。 将执行装置106到120分成4组,每组都有它自己的寄存器队列。这 样做是为了减少到任何一个寄存器队列的接入槽(slot)的数目。如果提供 单个寄存器队列,则寄存器队列可能有太多的接入槽,这将增加到寄存 器队列的接入时间。可以将每组有一个共同寄存器队列的执行装置称为 一个群集。在图4中,由执行装置106,108和寄存器队列122形成第1 群集,由执行装置110,112和寄存器队列124形成第2群集,由执行装 置114,116和寄存器队列126形成第3群集,由执行装置118,120和 寄存器队列128形成第4群集。如果在一个群集中需要保持在另一个群 集中的一个值,则通过总线130在诸群集之间传送该值。虽然在图4中 画出4个群集,但是按照需要可以提供或多或少的群集。每个群集可以 有一个,两个或更多个执行装置。 如在第1实施例中那样,每个执行装置106到120都用流水线增加它 处理指令的速率。在一个群集内的诸流水线保持相互同步,而允许在不 同群集内的流水线相互有一个或多个周期的不同步。 图5是表示在两个流水线群集内第i级的结构的方框图。群集的级i 包括在群集内的第1流水线(流水线0)的级i,在群集内的第2流水线 (流水线1)的级i,和用于控制这两个流水线级的共同控制电路。流水 线0的级i包括流水线寄存器140和处理电路142,流水线1的级i包括 流水线寄存器144和处理电路146。控制电路是由失速控制逻辑电路148, 寄存器150,152,154和或门156形成的。 在工作中,群集的级i可以或者是有效的,或者被在同一个群集中的 级j失速,其中j≥i,或者被在另一个群集中的级l失速,其中l≥i-1。所 以,群集的级i有一个状态可变的CurrentState(当前状态)i,该状态 指示级是活性的(A),局域失速的(L)还是全局失速的(G)。 将可变的CurrentState i的值保持在寄存器150中。寄存器150的输 入是信号的NextState(下一个状态)i,该状态确定级在下一个时钟周期 中处于哪个状态。 失速控制逻辑电路148的工作受到一组状态变迁的控制,如表1所示。 在表1中,每一行表示能够实现的一个可能的变迁,并清楚地说明了变 迁能够发生的条件。每个变迁都是从当前状态到下一个状态,如果讨论 中的级对于一个给定变迁是在当前状态中,则发生变迁,并且诸布尔变 量local(局域)和global in(全局内)的诸值如在对于那个变迁的表列 值指出的那样。当存在一个局域失速时设置局域变量,即起源于局域群 集的局域变量。当当前级有一个未决失速时或如果在当前级后面的任何 级将在下一个周期处于局域失速状态,则该变量等于true(真)。如果 任何其它的群集在前一个周期中认定它的局域信号,则设置global_in变 量。 表1 变迁 当前状态 global_in local 下一个状态 1 A 0 0 A 4 A 0 1 L 6 A 1 0 G 6 A 1 1 G 5 L 0 0 A 3 L 0 1 L 5 L 1 0 A 3 L 1 1 L 7 G 0 0 A 8 G 0 1 L 2 G 1 0 G 2 G 1 1 G 一个对于每个流水线级的行为的状态变迁图如图6所示。在图6中, 变迁数与表1的第1列中的数字对应。对于熟练的技术人员来说显然可 以从状态变迁图和/或表例行地导出适当的逻辑电路,因此在这里不特别 对其进行描述。 在工作中,流水线寄存器140保持为了用处理电路142执行的诸指令 和数据,流水线寄存器144保持为了用处理电路146执行的诸指令和数 据。如果由图5中的处理电路142,146中的一个在时钟周期T执行的一 个指令的阶段为了执行需要多于一个的周期,则那个处理电路认定一个 失速信号。将来自两条流水线的级i的诸失速信号馈送到或门156。或门 156的输出是一个信号stall(失速)i,它指示在那个群集中一条或多条 流水线的级i是否已经认定一个失速信号。将信号stall i馈送到失速控制 逻辑电路148。 根据失速i信号,失速控制逻辑电路148产生一个如下的局域信号i: local i=(stall i或ripple i+1) 当群集的级i的下一级将是L(即局域失速)时设置信号ripple(波 纹)i。所以: ripple i=(NextState i=L) 信号ripple i+1是由群集的级i+1产生的相应信号。 如果当周期T时认定ripple i,则在同一个周期中认定ripple i-1,i- 2,……,i-k,作为在级i中局域失速的结果。局域化的失速信号的波纹 将在流水线最左边的终端结束,或者如果在周期T+1(即NextState i-k= L)中某个级将不在L级中,则将较早结束。这能够由在周期T-1中的级 i-k-1上在另一个群集中的一个局域化失速产生,并在周期T中被认定的 级i-k上产生global_in信号。 根据local i信号,CurrentState i信号和global_in i信号产生NextState i信号,如表1的最后一列所示。在时钟信号的下一个有效(active)边沿上, 将信号NextState i寄存在寄存器150中,使得在周期T+1中的信号 CurrentState i等于在周期T中的信号NextState i。 如果在任何时钟周期中的NextState i的值或为L或为G(与局域地或 全局地失速相对应),则认定hold(保持)i信号。对应地,在寄存器142 和144中的诸指令和数据在下一个时钟周期中保持相同。 不同的群集通过ripple和global_in信号相互通报它们的失速状态。 对于群集C的next_global_in(下一个全局内)i信号是来自所有群集除 了C的诸ripple i-1信号的逻辑或。在每个时钟周期结束时将 next_global_in i信号寄存在寄存器154中,给出信号global_in i。对于 所有群集的级0的诸global_in信号总是false(假)。在每条流水线中, 当那条流水线的级1失速时,安排级0失速。 例如,如果在另一个群集的级h(h≥i-1)中由处理电路在时钟周期T 中执行的指令的阶段需要多于一个的周期,则在周期T中认定它的local h 信号。这使在所有其它的群集中的所有级1到h+1的诸next_global_in 信号在周期T结束前被认定。这反过来使失速控制逻辑电路148的 global_in i信号在周期T+1中被认定。 用valid(有效)i信号指示在群集的级i中存在一个泡。例如,如果 使级i-1失速,则将信号valid_out(无效)i-1设置在false,指示在级i- 1中存在一个泡。在下一个时钟周期上,将信号valid_out i-1寄存在寄存 器152中,给出信号valid i。如果将valid i设置成false,则处理电路142, 146不管在寄存器140,144中的指令。 这样我们能够看到第2实施例提供一个分布的失速方案,其中每个级 局域地确定它是否需要在程序执行的每个周期上使处理机失速,并且如 果在级i需要一个失速则认定失速i。如果对于级i失速逻辑值确定失速 的三个原因中的任何一个需要在当前周期中使级i失速,则它认定保持信 号i。对应地,级i将指令和数据保存在它的输入寄存器中。 第2实施例具有下列主要特点: 1.在任何群集中的任何流水线级都能够认定在任何本身不是失速主体 的周期中的一个失速信号。 2.在同一个群集中的一个失速级前的诸级将在与该失速级相同的周期 中失速,但是将使在诸其它流水线中的诸级在一个周期后失速。 3.当解除失速时,在那条流水线中的所有的失速级立即向前行进,但 是在一个周期后才解除在诸其它流水线中的诸失速级。 4.用于控制每级失速的逻辑值对于那个级来说是局域的。在全局地(从 一个群集到另一个)进行失速信号通信的地方,可以用一个满的时钟周 期计算全局失速条件并将它分布到所有的群集中。 现在我们参照图7到10描述第2实施例工作的一个例子。图7表示 在时间T=1在群集1中在指示包103上在级3中发生一个失速的情形。 这时,立即从级3到级0,群集1失速,而其它的群集不失速。 图8表示在T=2一个周期后的情形。因为通知应该在级3失速的诸其 它级的一个周期延迟,直到诸其它群集被失速的这个时间都不是这样。 在指令包103已经移动到级4的那个时间前,在那些群集中从级4开始 必须失速。在这个时钟周期中,解除在群集1中的失速,所以在群集1 中的诸指令可以自由地在下一个时钟周期中向前行进。 图9说明在时间T=3一个周期后的情形。在群集1中,指令包103到 106已经向前移动和已经插入指令包107,而由于在解除全局失速中的延 迟在群集0,2和3中的诸指令还没有移动。于是在这个时钟周期中再次 使在所有的群集中的诸指令对准。如图10所示,在时间T=4后的一个周 期上,在所有群集中的诸指令如通常那样地自由地向前行进。 现在我们参照图11到14描述第2实施例工作的另一个例子,其中由 两个不同的群集产生一个失速信号。在这个例子中,在时间T=1由在群 集1中的级3和在群集2中的级1两者产生一个局域失速信号。 参照图11,在T=1,的情形。群集1的级3到级0和群集2的级1和 级0使局域信号被设置和使global_in信号被再设置,所以,参照图1(变 迁4),这些级的下一个状态将被局域地失速(L)。 在时间T=2后的一个周期(图12),群集1的级3到0和群集2的 级1和0处于局域地失速状态,而诸其它的级都处于活性状态(A)。于 是在群集1的级4中和群集2的级2中形成诸泡。由于在前一个周期中 在群集1和2中发生失速,所以也在时间T=2,在群集0,2和3的级4 到0和在群集1的级2到0使它们的诸global_in信号被设置。在这个例 子中失速只持续一个周期。于是,参照表1,群集0和3的级4到0和群 集2的级4和3将被全局地失速(G),而群集1中的级3到0和群集2 中的级1到0将是活性的(A)。 在时间T=3(图13),群集0和3的级4到0和群集2的级4和3处 于全局地失速状态。群集2的级1到0处于活性状态,所以在这些级中 的诸指令向前移动一级,以便充填在时间T=2在群集2的级2中发生的 泡。因为群集2的级3和4处于全局失速状态,在群集2的级5中形成 一个新泡。由于级4到0处于全局失速状态,所以也在群集0和3的级5 中形成诸泡。因为整个群集1都处于活性状态,所以在群集1的级4中 的泡向前移动到群集1的级5。于是,在这个时钟周期中,在所有流水线 中的诸指令被再次对准。又在这个时钟周期中,解除在群集0,2和3中 余下的诸失速(即,下一个状态是活性的)。图14表示在T=14在所有 的群集中如通常那样地向前行进的情形。 我们从上面所述的看到如果在同一个时钟周期中在两个不同的群集中 产生一个失速信号,则这只是导致在诸流水线中发生一个泡。这是因为 如果一个级有它的局域失速的当前状态(L),而没有设置局域信号,则 那个级的下一个状态是活性的(A),而与是否设置了global_in信号无 关。这由表1和图6中的变迁5表示出来。 在上述的诸例子中,我们假定在失速开始后的一个时钟周期解除失速, 使形成一个级的诸泡。然而,失速可以在一个不确定的时间周期内持续, 于是与失速持续的时钟周期数有关地可以形成两级或多级的诸泡。 如在第1实施例中那样,第2实施例的延迟失速方案不允许在最后一 级中产生失速。这个问题可以或者通过使一条流水线的最后一级永远不 需要认定一个失速信号那样地安排处理机和指令集,或者通过将一个最 后的伪级加到每条流水线上,或者通过上述两者来解决。 如在第1实施例中那样,在诸群集之间分布一个全局失速信号中的延 迟可以是一个或多个时钟周期。 第3实施例 图15表示在本发明的第3实施例中失速控制电路的诸部分。图15所 示的电路200用于在一个群集p中的一个流水线级i;将类似的电路提供 给在诸其它的群集中的诸其它的流水线级。电路200接收来自群集p中 的流水线级i的一个信号stall(i),该信号在那个级中的指令已经认定 一个失速,并产生一个指示群集p中的流水线级i要失速的信号hold(保 持)(i)。在对每个群集提供两条或多条流水线的地方,通常将信号hold (i)发送到在群集中所有流水线的级i,并从来自群集中所有流水线的级 i的诸失速信号的逻辑或形成stall(i)。 参照图15,失速控制逻辑电路200包括有一个倒相输入和一个非倒相 输入的与门202,或门204,有一个倒相输入和一个非倒相输入的与门 206,局域保持指示器208,泡指示器210,有一个倒相输入和一个非倒 相输入的与门212,寄存器214,或门216,或门218和有一个倒相输入 和一个非倒相输入的与门220。 为了方便起见,将图15所示的诸信号简单地描述如下: ·b(i)是一个指示流水线级i是否包含一个泡的信号。这个信号与 在第2实施例中的信号valid i的倒相对应。 ·lh(i)是一个指示流水线级i是否被局域地保持,即响应在前一个 周期中一个局域产生的失速信号被失速的信号。 ·gs(i)是一个当存在来自在另一个群集中的流水线级i-1的全局失 速时被认定的信号。 ·stall(i)是一个指示是否在流水线级i中内部认定一个失速的信 号。 ·hold(i)是一个指示是否流水线级i被失速的信号。也将hold(i) 馈送到流水线级i-1,提供一个机构,通过该机构将失速要求传播回到较 前面的流水线级。 ·gp(i)是一个用于指示一个来自另一个群集的全局失速要求正在 传播回到流水线级i-1的信号。 ·gr(i)是一个全局失速要求信号,将它发送回到诸其它地群集的 级i-1,指示它们应该在下一个周期中失速。 ·gd(i)是一个延迟的全局失速要求信号,它被延迟一个时钟周期 以便得到信号在诸群集之间传播的时间。 在工作中,如果流水线级i不包含一个泡和下列条件中的一个是ture (真),则信号hold(i)被认定,它指示在下一个时钟周期上流水线级 i被失速: ·在流水线级i内局域地认定一个失速 ·在同一个群集中的流水线级i+1被失速 ·在另一个群集中的流水线级(i-1)在前一个周期中被失速和当前 的流水线级已经没有被局域地保持。 这可以通过与门202,或门204,与门206,局域地保持指示器208和 泡指示器210来实现。 泡指示器210输出一个信号b(i),如果级i包含一个泡则b(i)为 true。泡指示器210的状态变迁表如下列的表2所示。 表2 b(i) hold(i-1) hold(i) 下一个b (i) 0 0 0 b(i-1) 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 b(i-1) 1 0 1 n/a 1 1 0 1 1 1 1 n/a 我们可以看到如果使级i-1失速而不使级i不失速,则设置下一个b(i) (它指示级i将在下一个时钟周期中有一个泡)。如果使级i和级i-1都 不失速,则将b(i)的值传送到下一个流水线级。这由下一个b(i)等 于在表2的行1和5中的b(i-1)指示出来。 局域保持指示器208输出一个信号lh(i),如果流水线级i被局域地 保持,则lh(i)为ture。如果使级i响应在前一个周期中它自己局域产 生的失速信号而失速,则我们说级i被局域地保持。局域保持指示器208 的状态变迁表如下列的表3所示。 表3 lh(i) gs(i) stall(i) 下一个lh(i) 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 可以看到如果当存在一个局域产生的失速,设置下一个lh(i)(即在 下一个时钟周期中lh(i)取的值),除了如果存在一个全局失速和现在 使lh(i)复位外。在这种情形中,因为已经存在一个全局失速所以不需 要产生一个局域失速。 在第3实施例中,如果下列两个条件都是ture,则将一个全局失速 要求gr(i)传送到所有其它的群集,使那些群集从流水线级i+1开始在 后面一个周期中失速: ·在流水线级i局域地认定一个失速 ·没有一个全局失速从流水线级k,其中k>i,正在传播出来。 这样,如果在那个流水线级中局域地认定一个失速,则流水线级i产 生一个全局失速要求gr(i),那个流水线级不受到一个也对一个或多个 后面的级起作用的全局失速。这可以通过与门212来实现。 信号gr(i)在寄存器214中被延迟一个时钟周期,产生延迟失速要 求信号gd(i)。流水线级i收集来自在诸其它群集中的前一个流水线级 的诸延迟的失速要求信号,并在或门216中将它们组合起来,产生全局 失速信号gs(i)。 如上面提到的,如果一个来自另一个群集的全局失速正在从诸后面的 流水线级沿流水线向下传播,则流水线级i不产生一个全局失速要求。这 防止在那些已经受到来自另一个群集的全局失速的级中产生第2个全局 失速。这允许当一个局域失速被解除时在一个已经受到那个局域失速的 (和产生了最初的全局失速的)群集中的诸指令向前行进。然后这些指 令能够向前进入当最初认定局域失速时形成的诸泡中,从而使不同的群 集回到对准的状态。 为了确定是否一个全局失速正在从一个后面的级传播过来,将信号gp (i)从级i发送到级i-1。当流水线级i不包含一个泡和下列两个条件中 至少一个是ture时设置信号gp(i): ·将一个来自另一个群集的全局失速加到这个流水线级并且不局域地 保持这个流水线级。 ·从级i+1将一个来自另一个群集的全局失速传播到这个流水线级。 这可以通过图15中的或门218和与门220来实现。 现在我们用不同的失速条件的各种不同的例子说明第3实施例的工 作。图16到20表示如何处理两个周期失速。图16表示在这个时间T=1 的情形。在这个时间,群集1的级3认定它的失速信号。群集1立即从 级3到级0失速,如由图中的阴影线表示的那样。然而,因为在分布全 局失速信号中有一个周期的延迟,所以在这个时间其它的群集不失速。 第3实施例的工作的诸例子。 图17表示在T=2一个时钟周期后的情形。现在由于延迟的全局失速 信号从级4开始使群集0,2和3失速。因为当指令级0,1,2和3失速 时在这个群集的级4,5和6中的诸指令已经向上移动一级,所以已经在 群集1的级4中形成一个泡。我们假定在这个时钟周期中仍然认定群集1 的级3中的失速信号。 图18表示在T=3在下一个时钟周期中的情形。仍然从级3开始保持 群集1,所以在那个群集的级3中已经进一步出现一个泡。从级4开始保 持群集0,2和3,在那些群集的级5中出现诸泡。我们假定在这个时钟 周期中解除失速。所以从群集1移去失速,使在那个群集中的诸指令在 下一个时钟周期中自由地向前行进。然而,由于在全局失速信号中有一 个周期的延迟,所以群集0,2和3保持从级4开始的失速。 图19表示在T=4的情形。因为在前一个周期中从群集1移去失速, 所以在群集1中的诸指令都向前移动一级。然而,因为群集0,2和3从 级4开始失速,所以在那些群集的级0到4中的指令不移动,在级5中 进一步出现一个泡。这使不同的群集回到对准的状态。图20表示在T=5 的情形并且在锁定步骤中的所有指令如通常那样地进行。 图21到24说明失速控制逻辑值如何对应多个失速要求,这些失速要 求是由在不同的群集中的诸相同的流水线级同时认定的。我们假定群集1 和3两者在同一个时间认定在级3中的一个两周期失速信号。图21表示 当失速被认定时在时间T=1的情形。群集1和3两者立即从级3开始失 速。图22表示在时间T=2的情形。保持在群集1和3中的失速,群集0 和2两者从级4开始失速。图23表示在时间T=3的情形。从群集1和3 中移去失速,但是不从群集0和2移去失速。图24表示在时间T=4的情 形。现在在群集1和3中的诸指令已经向前移动,使它们再次与在群集0 和2中的诸指令对准。已经从群集0和3移去失速,使得所有群集中的 诸指令能在下一个时钟周期上如通常那样地自由地向前行进。 图25和26说明如果不同的群集在不同的时间解除它们的失速要求则 如何处理多个失速要求。我们假定群集1和3两者在时间T=1在级3中 认定一个失速信号如图21所示,和群集0和2在后面一个周期中失速如 图22所示。图25表示在时间T=3的情形。在这个周期中群集1解除它 的失速,所以不再是一个局域失速的主体。然而,群集3保持它的失速, 所以也保持了分布到诸其它群集的全局失速信号。因为群集1不再局域 失速,所以群集1的级0到3中的诸指令需要前进一级使它们与群集0 和2中的诸指令对准。这使得当解除群集3中的失速时所有的群集将对 准。所以,在这个时钟周期中群集1不失速。如上面参照图15所作的描 述那样,这可以通过安排只有一个群集的级i被一个来自另一个群集的级 i-1的全局失速所失速如果那个级不被局域地保持来实现。 图26表示在时间T=4的情形。已经允许群集1中的诸指令前进一级, 使它们现在与群集0和2中的诸指令对准。在这个周期中,在群集1中 的信号lh(被局域地保持)不再是ture,所以现在将来自群集3的全局 失速加到群集1以及群集0和2。然后当在将来某个时间解除群集3中的 失速时,不同的群集再次以通常的方式达到对准。 图27到30说明当从不同群集的不同级同时认定多个失速要求时失速 控制逻辑值的工作。我们假定在群集0的级4和群集2的级2中同时认 定失速要求。这两个群集同时在时间T=1失速如图27所示。 图28表示在时间T=2的情形。由于在群集0的级4中的失速,从级 5开始使群集1,2和3失速。由于这个失速在群集0的级5中已经形成 一个泡。因为在这个群集中在级2中的内部失速不使在指令包102和103 中的指令停止前进,所以也在群集2的级3中形成一个泡。 图29表示在一个较后面的时间,T=6,当我们假定在群集0和2中的 诸失速都被同时解除时的情形。在群集0的所有的级中立即解除失速。 然而,在群集2中,只从级2开始解除失速,而级4和5保持失速。这 是因为群集2的级0,1和2被局域地保持,而级4和5不是。如上面参 照图15所作的描述那样,如果一个流水线级不被局域地保持,则这个流 水线级只在响应一个全局失速信号时失速。 图30表示在时间T=7的情形。在群集2中以前在级0到2中诸指令 已经前进到级1到3,从而移去以前在级3中的泡。类似地,在群集0中 以前在级0到4中的诸指令前进到级1到5,使所有的群集现在再次对准。 已经移去所有的失速,使得所有群集中的指令能如通常那样地在下一个 时钟周期上自由地向前行进。 图31和32表示如果在同一个时间不解除诸失速要求则如何处理诸失 速要求。图18表示在T=6的情形,其中我们假定只解除了在群集2中的 内部失速。结果,在这个群集中从级3开始解除失速,而级4和5保持 失速。图32表示在时间T=7的情形。因为在级2和较早的级中的诸指令 向前移动,所以消除了在群集2的级3中的泡。现在响应来自群集0的 级4的失速信号使群集1,2和3都失速。然后当在将来某个时间解除群 集0中的失速时,不同的群集再次以通常的方式达到对准。 图33和34表示如果在群集2中的失速前解除在群集0中的失速则上 述情况将如何发生改变。我们假定在T=6解除在群集0中的失速,如图 33所示。结果,在这个周期中,群集0不失速,而群集1,2和3从级5 开始失速。没有它的内部失速,必须使群集0与群集1和3再次对准, 使得当群集2解除它的失速时,所有的群集将对准。 图34表示在时间T=7的情形。在群集0中的诸指令已经向前移动一 级,使得群集0现在与群集1和3再次对准。响应来自群集2的级2的 失速信号从级3开始使群集0,1和3失速。然后当在将来某个时间解除 群集2中的失速时,不同的群集再次以通常的方式达到对准。 图35到41表示两个进一步的序列,在这些序列中产生交错的失速要 求。 图35表示当在群集1中的级3上认定一个失速时在时间T=1的情形。 图36表示当所有其它的群集都被来自群集1的所得到的延迟失速所失速 时在T=2的情形。在这个时间,群集3中的级4也认定一个失速。当任 何其它的群集已经失速时,这个来自群集3的新的失速要求不需要与那 些群集进行通信。如上面参照图15所作的描述那样,如果在那个流水线 级局域地认定一个失速,和那个流水线级不受到来自在另一个群集中的 相同的级或较后面的级的一个全局失速,一个流水线级产生一个全局失 速要求。于是,只要认定了来自群集1的全局失速,群集3响应在级4 中的局域失速不产生一个全局失速要求。实际上,如果在群集1中的失 速前解除在群集3中的失速,则整个处理机就像一个失速已经在时间T=1 只从群集1产生那样地进行工作。 图37表示在T=3的情形。在这个时间,同时解除在群集1和3中的 内部失速要求。结果,立即解除群集0中的失速。然而,因为来自群集1 的延迟的全局失速仍然是有效的,所以群集3保持失速。图38表示在T=4 的情形。现在群集1已经与所有其它的群集再次对准,并且解除了在所 有群集中的诸失速。于是在所有群集中的诸指令能如通常那样地在下一 个时钟周期中向前行进。 图39和41表示如果在群集3中的失速前解除在群集1中的失速则上 述情况将如何发生改变。图39表示在T=3的情形。在这个时间,解除在 群集1中的内部失速,但是不解除在群集3中的内部失速。因为群集3 不产生一个全局失速,所以现在群集1不受到任何失速。 图40表示在T=4的情形。在群集1中的诸指令已经向前移动,使得 群集1现在与其它的诸群集再次对准。来源于群集1的全局失速现在已 经从群集0和2移去。然而,群集3由于它自己的内部失速而保持失速。 在这个时间,因为群集3仍然受到一个局域失速,但不是一个全局失速, 所以群集3产生一个全局失速要求。这个全局失速要求被延迟一个时钟 周期(被图15中的寄存器214延迟)使得它在后面的一个时钟周期上对 诸其它群集产生作用。 图41表示在T=5一个时钟周期后的情形。在群集0,1和2中的诸指 令已经向前移动了一级,现在将来自群集3的全局失速加到从级5开始 的群集0,1和2上。从这点向前,当在将来某个时间解除群集3中的失 速时,不同的群集再次以通常的方式达到对准。 虽然上述描述作为例子涉及一个VLIW处理机,但是我们认识到本发 明可应用于不同于VLIW处理机的诸处理机。可以将一个体现本发明的 处理机作为一个处理机“芯”包括在一个高度集成的“在一块芯片上的 系统”(SOC)中以便用于多媒体应用,网络路由器,视频移动电话, 智能汽车,数字电视,声音识别,3D游戏等中。 我们将懂得上面已经单纯通过例子对本发明进行了描述,并能够在本 发明的范围内作出细节上的修改。 我们能够独立地或以任何适当的组合提供在上述描述中揭示的每个特 点,(其中适当的)权利要求书和所附诸图。