用于高性能认证加密的硬件加速器和方法与流程

文档序号:18899796发布日期:2019-10-18 21:46阅读:465来源:国知局
用于高性能认证加密的硬件加速器和方法与流程

本公开一般涉及电子设备,并且更具体地,本公开实施例涉及用于执行加密操作的硬件加速器。



背景技术:

处理器或处理器组执行来自指令集(例如,指令集架构(isa))的指令。指令集是与编程有关的计算机架构的部分,并且一般包括原生数据类型、指令、寄存器架构、寻址模式、存储器架构、中断和异常处理、以及外部输入和输出(i/o)。应当注意的是,本文中的术语“指令”可以是指宏指令,例如被提供给处理器以供执行的指令,或者是指微指令,例如由处理器的解码器对宏指令进行解码所得到的指令。

附图说明

在附图中的各图中通过示例而非限制的方式例示了本公开,其中同样的参考标记指示类似的元件,并且其中:

图1例示了根据本公开实施例的包括多个核和硬件加速器的硬件处理器。

图2例示了根据本公开实施例的包括硬件处理器和硬件加速器的系统。

图3例示了根据本公开实施例的chacha硬件加速器。

图4例示了根据本公开实施例的blake硬件加速器。

图5例示了根据本公开实施例的双模式(chacha/blake)硬件加速器。

图6例示了根据本公开实施例的chacha四分之一轮电路。

图7例示了根据本公开实施例的经一体化的chacha四分之一轮和blake轮次电路。

图8例示了根据本公开实施例的硬件加速器电路系统。

图9例示了根据本公开实施例的硬件加速器的一轮加密操作的多个周期。

图10例示了根据本公开实施例的图9中的硬件加速器的关键数据路径。

图11例示了根据本公开实施例的硬件加速器电路系统。

图12例示了根据本公开实施例的图11的硬件加速器的一轮加密操作的多个周期。

图13例示了根据本公开实施例的图12中的硬件加速器的关键数据路径。

图14例示了根据本公开实施例的硬件加速器电路系统。

图15例示了根据本公开实施例的图14的硬件加速器的一轮加密操作的多个周期。

图16例示了根据本公开实施例的图15中的硬件加速器的关键数据路径。

图17例示了根据本公开实施例的流程图。

图18a是例示根据本公开实施例的通用向量友好指令格式及其a类指令模板的框图。

图18b是例示根据本公开实施例的通用向量友好指令格式及其b类指令模板的框图。

图19a是例示根据本公开实施例的用于图18a和18b中的通用向量友好指令格式的字段的框图。

图19b是例示根据本公开的一个实施例的构成全操作码字段的图19a中的特定向量友好指令格式的字段的框图。

图19c是例示根据本公开的一个实施例的构成寄存器索引字段的图19a中的特定向量友好指令格式的字段的框图。

图19d是例示根据本公开的一个实施例的构成扩增操作字段1850的图19a中的特定向量友好指令格式的字段的框图。

图20是根据本公开的一个实施例的寄存器架构的框图。

图21a是例示根据本公开实施例的示例性有序流水线和示例性寄存器重命名、无序发布/执行流水线二者的框图。

图21b是例示根据本公开实施例的要被包括在处理器中的示例性有序架构核实施例和示例性寄存器重命名、无序发布/执行架构核二者的框图。

图22a是根据本公开实施例的单个处理器核、连同其与管芯上互连网络的连接、连同其二级(l2)高速缓存的本地子集的框图。

图22b是根据本公开实施例的图22a中的处理器核的一部分的展开图。

图23是根据本公开实施例的处理器的框图,该处理器可以具有多于一个核,可以具有集成存储器控制器,并且可以具有集成图形装置。

图24是根据本公开的一个实施例的系统的框图。

图25是根据本公开实施例的更具体的示例性系统的框图。

图26示出的是根据本公开实施例的第二更具体的示例性系统的框图。

图27示出的是根据本公开实施例的片上系统(soc)的框图。

图28是根据本公开实施例的对照使用软件指令转换器来将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。

具体实施方式

在以下描述中,阐述了许多具体细节。然而要理解的是,可以在没有这些具体细节的情况下实践本公开的实施例。在其他情况下,没有详细示出公知的电路、结构和技术,以免模糊对本描述的理解。

说明书中对“一个实施例”、“实施例”、“示例实施例”等的引用指示所描述的实施例可以包括特定特征、结构或特性,但是可能并非每个实施例都一定包括所述特定特征、结构或特性。而且,这些短语不一定指的是同一实施例。此外,当结合实施例描述特定特征、结构或特性时,主张无论是否明确描述,结合其他实施例实行此类特征、结构或特性是在本领域技术人员的知识范围内。

(例如,具有一个或多个核的)处理器(例如,硬件处理器)可以执行用来对数据进行操作的指令(例如,指令线程),以例如实行算术、逻辑或其他功能。例如,软件可以请求操作,并且硬件处理器(例如,其一个或多个核)可以响应于该请求来执行操作。在一个实施例中,处理器耦合到(例如,管芯上或管芯外的)加速器(例如,卸载引擎),其用来执行一个或多个操作(例如,卸载操作),例如而不是仅在处理器上执行那些操作。在一个实施例中,处理器包括(例如,管芯上的)加速器(例如,卸载引擎),其用来执行一个或多个操作,例如而不是仅在处理器上执行那些操作。

操作的非限制性示例是加密操作(例如,用于加密和/或解密)。加密操作可以包括使用加密标准(例如,其可以称为加密密码)来加密预期信息或消息(例如,其可以称为明文)以生成只有在解密时才能读取的密文。加密标准可以使用根据加密标准生成的伪随机加密密钥。加密标准可以包括以下中的一个或多个:(例如,在伽罗瓦计数器模式(gcm)中实现的)高级加密标准(aes)、chacha(例如,chachax,其中x是轮数,例如,chacha20将是20轮,即80个四分之一轮)加密标准(例如,流密码)、poly-1305aead、blake(例如,blake2、blake2b或blake2s)或基于那些标准中的任何标准的(例如,未来的)加密标准。加密标准可以是用于例如由一个或多个互联网浏览器使用的传输层安全性(tls)协议中的附加数据的认证加密(aead)的加密标准(例如,密码)。加密操作可以包括确定用于加密操作的(例如,chacha)加密密钥和/或(例如,blake)状态。在某些实施例中可以使用poly或blake型散列算法,例如,blake型可以使用chacha流密码来执行散列,和/或poly型可以与chacha一起用于认证加密。

在一个实施例中,加速器可以例如响应于到处理器(例如,中央处理单元(cpu))和/或针对处理器的要执行加密操作的请求而执行该操作。加速器可以耦合到(例如,与加速器相同的管芯上或管芯外的)一个或多个用来存储数据(例如,输入数据和/或输出数据)的存储设备。在一个实施例中,加速器接收加密输入数据(例如,包括输入密钥)并输出结果(例如,输出密钥(例如,密钥流)或状态)。处理器可以执行指令以将一个或多个操作(例如,指令、指令线程或其他工作)卸载到加速器。处理器可以从加速器获取结果(例如,输出密钥或状态)并使用该结果来执行进一步的动作,例如,以生成经加密的消息(例如,密文)。在一个实施例中,对输出密钥(例如,密钥流)与明文进行异或(xor)操作以产生经加密的消息(例如,密文)作为结果。

本文的某些实施例允许(例如,经由加速硬件)对一个或多个加密操作进行加速(例如,包括对根据chacha和/或blake流加密标准的操作进行加速),以显著改善认证加密的性能。本文的某些实施例涉及用于根据(例如,chacha)加密标准执行(一个或多个)加密操作的(例如,可配置的)硬件加速器,其例如相比于用软件和/或微代码来执行加密操作具有性能优化。本文的某些实施例涉及用于根据(例如,chacha)加密标准执行(一个或多个)加密操作的(例如,可配置的)硬件加速器,其在使用延迟列/对角线状态对齐技术的情况下例如相比于不使用延迟列/对角线状态对齐技术具有(例如,15%的)性能优化。在某些实施例中,扩展硬件加速器以支持诸如可变轮数(例如,chacha)之类的附加特征和/或支持(例如,blake)密码散列函数(例如,使用共享电路系统)。

本文的某些实施例利用硬件加速器而不是使用软件或微代码来执行(一个或多个)加密操作。本文的某些实施例提供具有期望的吞吐量的加密操作的加速(例如,包括多个(例如,串行的)加法),所述期望的吞吐量是在利用软件和/或微代码实现的情况下不可能实现的。本文的某些实施例涉及具有(一个或多个)优化的数据路径的可配置硬件加速器,以在每个时钟周期执行一轮加密标准(例如,chacha加密标准)的一部分(例如,四分之一轮(¼轮(qround)))。在某些实施例中,硬件加速器被配置用于可变轮数,例如,默认为20轮(在chacha-20模式下)。在某些实施例中,硬件加速器被配置成例如通过利用blake轮函数与chacha¼轮操作的相似性来加速(例如,blake)散列函数。在用于chacha20加密标准的硬件加速器的一个实施例中,硬件加速器仅给予小于约80个周期的等待时间和/或提供大约5.3gbps的加密吞吐量(例如,相对于软件实现的性能提高10倍),从而获得显著的性能增益。根据本文公开的硬件加速器的某些实施例采用用于chacha加密标准的专用¼轮计算电路系统,其可以与列/对角线状态对齐技术一起使用以进一步改善性能。本文的某些实施例提供了可完全综合设计的硬件加速器设计,其可以针对并行(例如,¼轮)操作进行缩放以获得吞吐量的进一步增益。硬件加速器的某些实施例可以用于执行具有增加或减少的轮数的chacha加密标准的变型,使得该硬件可灵活用于低级软件实现。在最小限度的改变的情况下,本文的某些实施例提供对blake轮次计算的支持,以在实现blake散列函数时获得相对于软件实现的10倍性能改善。

图1例示了根据本公开实施例的硬件处理器100,其包括多个核(0到n,其中n可以是1或更大)和硬件加速器104。硬件处理器100(例如,加速器104和/或其(一个或多个)核)可以耦合到数据存储设备106(例如,存储器)。在一个实施例中,存储器可以是动态随机存取存储器(dram)、私有(例如,加速器私有的)随机存取存储器(ram)、高速缓存存储器或系统存储器。尽管描绘了单个硬件加速器104,但是可以利用多个硬件加速器(例如,0到m)。尽管描绘了多个核,但是可以利用单个核,例如核0(102)。硬件加速器可以是硬件加密和/或解密电路。

处理器100(例如,核102)可以(例如,从软件)接收请求以执行加密(其可以包括解密)操作,并且可以将加密操作(例如,线程)(例如,加密操作的至少一部分)卸载到硬件加速器104。核、(一个或多个)加速器和数据存储设备106可以与彼此通信(例如,彼此耦合)。箭头指示(例如,去往和来自组件的)双向通信,但是可以使用单向通信。在一个实施例中,(例如,每个)核可以与数据存储设备106通信(例如,与之耦合)例如以访问数据108。在一个实施例中,(例如,每个)加速器可以与数据存储设备106通信(例如,与之耦合)例如以访问数据108。数据108可以是加密数据(例如,如参考图5所讨论的)。在所描绘的实施例中,硬件加速器104在硬件处理器100内。硬件加速器104可以包括本文讨论的电路系统中的任何。硬件处理器100可以包括一个或多个寄存器(例如,与硬件加速器104分离的寄存器110)。寄存器110可以存储加密数据(例如,如参考图5所讨论的)。硬件加速器104可以包括一个或多个寄存器(例如,与(一个或多个)核分离的寄存器112)。寄存器112可以存储加密数据(例如,如参考图5所讨论的)。例如在硬件加速器104执行加密操作之前,可以(例如,由硬件处理器100的一个或多个核)向硬件加速器104的寄存器112加载加密数据。

图2例示了根据本公开实施例的包括硬件处理器201和硬件加速器204的系统。在一个实施例中,硬件加速器204在与硬件处理器201相同的管芯上。在一个实施例中,硬件加速器204在硬件处理器201的管芯外。在一个实施例中,至少包括硬件处理器201和硬件解压加速器204的系统200是片上系统(soc)。硬件处理器201(例如,核202)可以(例如,从软件)接收请求以执行解压(例如,deflate解压)线程(例如,操作),并且可以将解压线程(例如,操作)(例如,解压线程的至少一部分)卸载到硬件加速器(例如,硬件解压加速器204)。硬件处理器201可以包括一个或多个核(0到n)。在一个实施例中,每个核可以与硬件加速器204通信(例如,与之耦合)。在一个实施例中,每个核可以与多个硬件解压加速器中的一个通信(例如,耦合到多个硬件解压加速器中的一个)。(一个或多个)核、(一个或多个)加速器和数据存储设备206可以与彼此通信(例如,彼此耦合)。箭头指示(例如,去往和来自组件的)双向通信,但是可以使用单向通信。在一个实施例中,(例如,每个)核可以与数据存储设备206通信(例如,与之耦合),例如以访问(例如,加载和/或存储)数据208。在一个实施例中,(例如,每个)加速器204可以与数据存储设备206通信(例如,与之耦合),例如,以访问(例如,加载和/或存储)数据208。数据208可以是加密数据(例如,如参考图5所讨论的)。硬件加速器204可以包括本文讨论的电路系统中的任何。硬件处理器201可以包括一个或多个寄存器(例如,寄存器210)。寄存器210可以存储加密数据(例如,如参考图5所讨论的)。硬件加速器204可以包括一个或多个寄存器(例如,寄存器212)。寄存器212可以存储加密数据(例如,如参考图5所讨论的)。例如在硬件加速器204执行加密操作之前,可以(例如,由硬件处理器201)向硬件加速器204的寄存器212加载加密数据。可以为特定的一个或多个加密标准提供硬件加速器。

图3例示了根据本公开实施例的chacha硬件加速器304。所描绘的硬件加速器304包括多个输入301(例如,输入端口)以接收chacha输入值,当chacha硬件加速器304对所述chacha输入值进行操作时,所述chacha输入值在输出303(例如,输出端口)上产生chacha密钥输出值。在一个实施例中,输入301上的输入值包括以下中的一个或多个:(例如,256位的)密钥、(例如,96位的)临时(例如,初始化)值、(例如,32位的)初始计数值(例如,常数值)和用来指示硬件加速器304要执行的轮数的(例如,6位的)值。硬件加速器304可以包括以下各图中描绘的电路系统。

图4例示了根据本公开实施例的blake硬件加速器404。所描绘的硬件加速器404包括多个输入401(例如,输入端口)以接收blake输入值,当blake硬件加速器404对所述blake输入值进行操作时,所述blake输入值在输出403(例如,输出端口)上产生blake状态输出值。在一个实施例中,输入401上的输入值包括以下中的一个或多个:(例如,512位的)blake状态值、第一消息加常数值、以及第二消息加常数值。硬件加速器404可以包括以下各图中描绘的电路系统。

图5例示了根据本公开实施例的双模式(chacha/blake)硬件加速器504。所描绘的硬件加速器504包括多个输入501(例如,输入端口)以接收chacha输入值,当硬件加速器504在chacha模式下对所述chacha输入值进行操作时,所述chacha输入值在输出503(例如,输出端口)上产生chacha密钥输出值。在一个实施例中,输入501上的输入值包括以下中的一个或多个:(例如,256位的)密钥、(例如,96位的)临时(例如,初始化)值、(例如,32位的)初始计数值(例如,常数值)和用来指示硬件加速器504要执行的轮数的(例如,6位的)值。硬件加速器504可以包括以下各图中描绘的电路系统。所描绘的硬件加速器504还包括多个输入505(例如,输入端口)以接收blake输入值,当硬件加速器504在blake模式下对所述blake输入值进行操作时,所述blake输入值在输出507(例如,输出端口)上产生blake状态输出值。在一个实施例中,输入505上的输入值包括以下中的一个或多个:(例如,512位的)blake状态值、第一消息加常数值、以及第二消息加常数值。硬件加速器504还包括输入509(例如,输入端口)以接收(例如,来自处理器的)用于在chacha模式和blake模式之间切换的值。作为利用两个分离的输入501、505(例如,输入端口)的替代,硬件加速器可以使用单个经一体化的输入511(例如,输入端口)。作为利用两个分离的输出503、507(例如,输出端口)的替代,硬件加速器可以使用单个经一体化的输出513(例如,输出端口)。硬件加速器504可以包括可以包括以下各图(例如,图7)中描绘的电路系统。

在一个实施例中,输入509上的单个配置位在chacha(例如,流密码)模式和blake(例如,散列函数)模式之间选择操作模式。在chacha模式的一个实施例中,输入包括(例如,256位的)密钥、(例如,96位的)临时数以及(例如,32位的)初始计数值。在某些实施例中,(例如,6位的)(例如,配置)值指示硬件加速器504根据chacha加密标准要执行的轮数。因此,某些硬件加速器提供了改变(例如,增加或减少)轮数的灵活性,以克服任何易损性。在一个实施例中,硬件加速器默认执行20轮chacha加密标准操作。下面的表1讨论了chacha状态组织的实施例。

在一个实施例中,chacha(例如,chacha20)是流密码,其对于每20轮加密生成(例如,512位的)密钥流(例如,从图3中的加速器304的输出303或从图5中的加速器504的输出503(或513))。在某些实施例中,对密钥流与明文进行异或操作以获得密文。在某些实施例中,密钥流计算作用于(例如,512位的)状态,所述状态被划分成元素(例如,16×32位字)并且被组织为4×4的数据矩阵(例如,32位字),如下面的表1中所示。

表1:示例chacha状态组织。

在一个实施例中,chacha状态的起始元素包括:

1.常数(“c0、c1、c2和c3”)——c0至c3是在每20轮加密之后初始化的(例如,32位的)常数。

2.密钥(“n”)——(例如,256位的)机密密钥。

3.块计数器(“bc”)——每20轮加密递增的(例如,32位的)块计数器。

4.临时数(“n”)——(例如,96位的)临时数或初始化向量。

在一个实施例中,例如由硬件组件将来自表1的数据加载到(例如,单个)打包数据(例如,向量)寄存器中,所述硬件组件正将利用所述数据的操作卸载到硬件加速器。表1包括针对每个数据元素的示例元素位置。尽管以二维矩阵示出,但是数据可以存储在单维阵列(例如,向量)中。本文利用矩阵表示法来例示为什么一些轮(例如,四分之一轮)称为列轮(例如,使用来自表1矩阵的列的数据子集)而其他轮称为对角线轮(例如,使用来自表1矩阵的对角线的数据子集)。硬件加速器可以利用上述数据(例如,被加载到耦合到硬件加速器的向量寄存器中的数据)来执行其(一个或多个)操作。硬件加速器可以利用(例如,专用的)电路来执行一轮(或一轮的一部分,例如一轮的四分之一(四分之一轮)),所述电路例如如图6中的chacha四分之一轮电路或如图7中的经一体化的chacha四分之一轮/blake轮次电路。

针对chacha加密标准的(例如,主要)操作是四分之一轮(¼轮)操作。blake密码散列函数的实施例也可以基于chacha加密标准,其具有与chacha四分之一轮操作类似的一轮操作。可配置加速器可以具有用于(例如,512位的)blake输入值和(例如,384位的)chacha输入值的两个分离的输入端口(例如,如图5中的输入501和输入505所示)或替代地共享共用的(例如,512位的)输入(例如,如图5中的经一体化的输入511所示),例如,在chacha模式期间,从所述输入提取密钥、临时数和初始计数器值。类似地,加速器可以具有用于两种模式的两个分离的输出端口(例如,如图5中的输出503和输出507所示)或者替代地共享共用的512位输出端口(例如,如图5中的经一体化的输出513所示)。在某些实施例中,用于加速器的耦合(例如,输入和输出)(例如,共用的512位输入/输出(i/o)总线)向所选模式提供输入以及例如在操作结束时对输出进行采样。用于¼轮的示例逻辑电路实现如图6中所示。

图6例示了根据本公开实施例的chacha四分之一轮电路600。所描绘的电路600包括四个输入(例如,输入端口)(602、604、606和608)以分别接收四个输入值(例如,本文称为值a、b、c、d)。所描绘的电路600包括四个输出(例如,输出端口)(652、654、656和658)以分别输出四个输出值(例如,本文称为值anew、bnew、cnew和dnew)。在一个实施例中,电路600在单个周期(例如,加速器的周期)中(例如,根据加密标准)执行其计算。电路600包括从输入602到输出652的数据路径a、从输入604到输出654的数据路径b、从输入606到输出656的数据路径c以及从输入608到输出658的数据路径d。数据路径a包括加法器610(例如,模加法器),其耦合到输入602和输入604,加法器610要将值a和值b相加并在其输出上提供此作为结果。加法器610的输出耦合到加法器612的第一输入(例如,模加法器),并且加法器612的第二输入耦合到数据路径b的旋转电路616的输出,加法器612要将那些输入值相加,并在其输出652上提供此作为结果anew。数据路径b包括逻辑异或电路614,逻辑异或电路614耦合到输入604和来自数据路径c中的加法器622的输出,逻辑异或电路614要对那些值进行异或操作,并在其输出上提供此作为结果。逻辑异或电路614的输出耦合到(例如,12位、左)旋转电路616的输入,旋转电路616要旋转该值(例如,向左旋转12位)并在其输出上提供此作为结果。旋转电路616的输出耦合到逻辑异或电路618的第一输入,并且逻辑异或电路618的第二输入耦合到数据路径c中的加法器624的输出,加法器624要将那些值相加并在其输出上提供此作为结果。逻辑异或电路618的输出耦合到(例如,7位、左)旋转电路620的输入,旋转电路620要旋转该值(例如,向左旋转7位)并在其输出654上提供此作为结果bnew。数据路径c包括耦合到输入606和数据路径d的旋转电路628的输出的加法器622(例如,模加法器),加法器622要将那些值相加并在其输出上提供此作为结果。加法器622的输出耦合到加法器624(例如,模加法器)的第一输入,并且加法器624的第二输入耦合到数据路径d的旋转电路632的输出,加法器624要将那些输入值相加,并在其输出656上提供此作为结果cnew。数据路径d包括逻辑异或电路626,逻辑异或电路626耦合到输入608和来自数据路径a中的加法器610的输出,逻辑异或电路626要对那些值进行异或操作,并在其输出上提供此作为结果。逻辑异或电路626的输出耦合到(例如,16位、左)旋转电路628的输入,旋转电路628要旋转该值(例如,向左旋转16位)并在其输出上提供此作为结果。旋转电路628的输出耦合到逻辑异或电路630的第一输入,并且逻辑异或电路630的第二输入耦合到数据路径a中的加法器612的输出,加法器612要将那些输入值相加并在其输出上提供此作为结果。逻辑异或电路630的输出耦合到(例如,8位、左)旋转电路632的输入,旋转电路632要旋转该值(例如,向左旋转8位)并在其输出658上提供此作为结果dnew。

在某些实施例中,当x小于(或等于)模数(例如,模数为2^32或2^64)时,模加法器输出针对结果x的实际结果,否则输出x=x-模数(例如,模数为2^32或2^64)。在某些实施例中,逻辑异或电路仅在其输入不同(一个为真,另一个为假)时输出真值(例如,一),否则输出假值(例如,零)。在一个实施例中,逻辑异或电路是异或门或其他逻辑电路实现。在某些实施例中,旋转电路要在不丢弃任何位的情况下对其输入值(例如,多个位)执行循环移位(例如,从一端绕回另一端而不是丢弃)。旋转电路可以执行针对给定位数的右旋或左旋,例如,图6中的旋转电路616例如基于来自控制电路的控制值而执行12位的左旋。在某些实施例中,移位电路要对其输入值(例如,多个位)执行移位并丢弃从末端掉落的任何位。

在某些实施例中,¼轮电路600对名为a、b、c、d的4个(例如,每个32位的)输入进行操作,并且由四个串行的加法(模数232)、异或和旋转操作组成。在该实施例中,¼轮电路600的输出是四个新计算的(例如,32位的)值anew、bnew、cnew和dnew,其用于更新chacha状态的输入元素。在一个实施例中,控制电路是图8中的控制电路806。

图7例示了根据本公开实施例的经一体化的chacha四分之一轮和blake轮次电路700。所描绘的电路700包括四个输入(例如,输入端口)(702、704、706和708)以分别接收四个输入值(例如,本文称为值a、b、c、d)。与图6中的电路600相比,所描绘的电路700还包括多路复用器701、加法器703(例如,用于将三个或更多个输入相加的进位保存加法器)、多路复用器705、加法器707(例如,用于将三个或更多个输入相加的进位保存加法器)以及用来控制多路复用器的控制线。所描绘的多路复用器701要选择blake状态的第一子集(例如,32位)(例如,32'b0)和第一消息+常数中的一个作为其输出,例如,参见图5。控制线(blake选择)要例如通过由控制电路(例如,图8中的控制电路806)提供的值来从那些输入中进行选择。所描绘的多路复用器705要选择blake状态的第一子集(例如,32位)(例如,32'b0)和第二消息+常数中的一个作为其输出,例如,参见图5。控制线(blake选择)要例如通过由控制电路(例如,图8中的控制电路806)提供的值来从那些输入中进行选择。所描绘的电路700包括四个输出(例如,输出端口)(752、754、756和758)以分别输出四个输出值(例如,本文称为值anew、bnew、cnew和dnew)。在一个实施例中,电路700在单个周期(例如,加速器的周期)中(例如,根据加密标准)执行其计算。电路700包括从输入702到输出752的数据路径a、从输入704到输出754的数据路径b、从输入706到输出756的数据路径c以及从输入708到输出758的数据路径d。数据路径a包括多路复用器701,其要选择blake状态的第一子集(例如,32位)(例如,32'b0)和第一消息+常数中的一个作为其输出。多路复用器701的输出作为第一输入耦合到加法器703(例如,用于将三个或更多个输入相加的进位保存加法器(csa)),并且输入702和输入704也耦合到加法器703,加法器703要将那些值相加并提供此作为结果。携csa加法器703的进位和保存输出可以是到加法器710(例如,模加法器)的输入,并且加法器710要在其输出上提供此作为结果。

在一个实施例中,在chacha模式下,仅将两个值(a和b)相加,但是在blake模式下,要将三个值相加。在某些实施例中,电路700包括进位保存加法器(例如,csa加法器703)以将那三个值项相加以生成和值和进位值二者。加法器710可以将所述和值和进位值相加以完成加法并获得最终的和。在某些实施例中,在chacha模式下,到csa加法器703的三个输入之一为零,并且csa加法器703的输出因此是a+b的和值/进位值,加法器710将它们加在一起以获得a加到b的值。

数据路径a还包括多路复用器705,多路复用器705要选择blake状态的第一子集(例如,32位)(例如,32'b0)和不同的第二消息+常数中的一个作为其输出。多路复用器705的输出作为第一输入耦合到加法器707(例如,用于将三个或更多个输入相加的进位保存加法器),加法器707的第二输入耦合到来自加法器710的输出,并且加法器707的第三输入耦合到(例如,12位、左或右)旋转电路716的输出,加法器707要将那些值相加并提供此作为结果。

在一个实施例中,在chacha模式下,仅将两个值(a和b)相加,但是在blake模式下,要将三个值相加。在某些实施例中,电路700包括另一进位保存加法器(例如,csa加法器707)以将那三个值项相加以生成和值和进位值二者。加法器712可以将所述和值和进位值相加以完成加法并获得最终的和。在某些实施例中,在chacha模式下,到csa加法器707的三个输入之一为零,并且csa加法器707的输出因此是a+b的和值/进位值,加法器712将它们加在一起以获得a加到b的值。

加法器712的输出耦合到数据路径d的逻辑异或电路730的第一输入,并且加法器712的输出在其输出752上被提供为结果anew。数据路径b包括逻辑异或电路714,逻辑异或电路714耦合到输入704和来自数据路径c中的加法器722的输出,逻辑异或电路714要对那些值进行异或操作,并在其输出上提供此作为结果。逻辑异或电路714的输出耦合到(例如,12位、左或右)旋转电路716的输入,旋转电路716要旋转该值(例如,分别向左或向右旋转12位)并在其输出上提供此作为结果。旋转电路716的输出耦合到逻辑异或电路718的第一输入,并且逻辑异或电路718的第二输入耦合到数据路径c中的加法器724的输出,加法器724要将那些值相加并在其输出上提供此作为结果。逻辑异或电路718的输出耦合到(例如,7位、左或右)旋转电路720的输入,旋转电路720要旋转该值(例如,分别向左或向右旋转7位)并在其输出754上提供此作为结果bnew。数据路径c包括加法器722(例如,模加法器),加法器722耦合到输入706和数据路径d的旋转电路728的输出,加法器722要将那些值相加并在其输出上提供此作为结果。加法器722的输出耦合到加法器724(例如,模加法器)的第一输入,并且加法器724的第二输入耦合到数据路径d的旋转电路732的输出,加法器724要将那些输入值相加,并在其输出756上提供此作为结果cnew。数据路径d包括逻辑异或电路726,逻辑异或电路726耦合到输入708和来自数据路径a中的加法器710的输出,逻辑异或电路726要对那些值进行异或操作,并在其输出上提供此作为结果。逻辑异或电路726的输出耦合到(例如,16位、左或右)旋转电路728的输入,旋转电路728要旋转该值(例如,分别向左或向右旋转16位)并在其输出上提供此作为结果。旋转电路728的输出耦合到逻辑异或电路730的第一输入,并且逻辑异或电路730的第二输入耦合到数据路径a中的加法器712的输出,加法器712要将那些值相加并在其输出上提供此作为结果。逻辑异或电路730的输出耦合到(例如,8位、左或右)旋转电路732的输入,旋转电路732要旋转该值(例如,分别向左或向右旋转8位)并在其输出758上提供此作为结果dnew。

在某些实施例中,当x小于(或等于)模数(例如,模数为2^32或2^64)时,模加法器输出针对结果x的实际结果,否则输出x=x-模数(例如,模数为2^32或2^64)。在某些实施例中,逻辑异或电路仅在其输入不同(一个为真,另一个为假)时输出真值(例如,一),否则输出假值(例如,零)。在一个实施例中,逻辑异或电路是异或门或其他逻辑电路实现。在某些实施例中,旋转电路要在不丢弃任何位的情况下对其输入值(例如,多个位)执行循环移位(例如,从一端绕回另一端而不是丢弃)。旋转电路可以执行针对给定位数的右旋或左旋,例如,图7中的旋转电路716例如基于来自控制电路的控制值而执行12位的左旋。在某些实施例中,移位电路要对其输入值(例如,多个位)执行移位并丢弃从末端掉落的任何位。

在某些实施例中,在blake模式下,电路700包括4个(例如,x32位)值a到d的输入,其经历与¼轮类似的操作。然而,在某些实施例中,还在一轮操作期间两次将到散列函数的输入消息和轮常数添加到轮函数状态a,和/或用blake轮函数中的右旋操作来替换chacha中的所有左旋操作。

在blake模式下,可以从硬件加速器(例如,包括电路700的硬件加速器)外部(例如,由处理器核)计算(例如,512位的)状态和这两个附加的消息+常数项,并将它们提供给加速器作为初级输入。因此,可以如图7中所示的那样扩展chacha¼轮电路以支持blake轮函数。在一个实施例中,经一体化的数据路径取决于操作模式而在32'b0和消息+常数之间进行选择。在某些实施例中,旋转电路被配置成通过在每个异或函数的输出处引入2:1多路复用器来执行左旋或右旋。作为参考图7讨论的附加组件中的一个或多个的结果,可配置加速器的实施例可以在对数据路径的最小限度的改变的情况下支持chacha密码和blake散列函数二者。

再次参考表1,在某些实施例中,chacha加密标准(例如,单)轮操作包括四个四分之一轮(¼轮),例如,包括串行的加法、异或和移位操作。在一个实施例中,每个¼轮对在表1的列元素或对角线元素当中选取的四个值(例如,32位值,即字)进行操作,以生成四个新值(例如,32位值)以替换¼轮输入。在某些实施例中,第一轮chacha操作沿着表1的列数据进行操作,并且第一轮的四个¼轮是:

1.¼轮(0,4,8,12)(例如,表1从左数第一列)

2.¼轮(1,5,9,13)(例如,表1从左数第二列)

3.¼轮(2,6,10,14)(例如,表1从左数第三列)

4.¼轮(3,7,11,15)(例如,表1从左数第四列)。

在那些实施例中的某些实施例中,第二轮chacha操作对表1的对角线数据进行操作,并且第二轮的四个¼轮是:

5.¼轮(0,5,10,15)

6.¼轮(1,6,11,12)

7.¼轮(2,7,8,13)

8.¼轮(3,4,9,14)。

在那些实施例中的某些实施例中,在后续轮次中,到¼轮的输入重复通过上面的¼轮1-8(例如,交替地沿着列和对角线元素选取输入),例如,使得要执行20轮,将会以该顺序执行上述八个四分之一轮的十次迭代。在chacha加密标准(例如,chacha20)的某些实施例中,在总轮数(例如,针对chacha20的20轮)结束时,将chacha状态加到初始状态以生成512位密钥流,以将其与明文进行异或操作。在完成chacha操作的总轮数(例如,20轮)时,用常数、密钥、临时数和块计数器(bc)的递增的值(例如,根据表1和相关文本)对chacha状态进行重新初始化。在blake操作的某些实施例中,每个轮函数包括4个列步骤和4个对角线步骤,其匹配在2轮中执行的chacha中的8个¼轮操作。因此,当加速器在blake模式下操作时,以下架构优化也会缩减关键路径。

图8例示了根据本公开实施例的硬件加速器800的电路系统。在一个实施例中,(例如,向量)(例如,16×32位)寄存器802存储加密标准(例如,chacha)轮次的工作状态。在每次加密开始时(例如,针对chacha20的每20轮),对加密标准(例如,chacha)状态进行初始化,例如,(例如,根据表1和相关文本)初始化为常数、机密密钥、更新的块计数、以及临时数。在一个实施例中,通过输入808提供该状态。在某些实施例中,在用于加密的后续轮次中(例如,每轮由4次迭代组成),基于轮次和迭代值来选取列或对角线元素以用于加密标准(例如,chacha)计算。在某些实施例中,使用加密标准(例如,chacha)的(例如,4×32位)输出来更新输入元素,而其余(例如,12×32位)状态保持不变。

硬件加速器800包括输入808(例如,输入端口)以例如从请求硬件加速器执行加密操作的处理器或其他组件接收输入值,例如,控制电路806将控制值发送到多路复用器818,以用于在加密的第一次迭代(例如,¼轮)之前从输入808源发(source),并且针对加密的其他迭代从多路复用器816源发(例如,直到需要不同的输入808为止,例如,针对chacha20的每20轮)。在一个实施例中,提供附加多路复用器820(或并行的多路复用器组)(例如,具有至少16个数据输入)以将(例如,针对加密的初始)输入值置于(例如,任何)期望的顺序(例如,下面参考图12讨论的顺序),例如,在对所述输入数据的第一次轮次(例如,¼轮)电路操作之前。在一个实施例中,多路复用器818包括多个输入(例如,至少16个输入)以例如在对所述输入数据的第一次轮次(例如,¼轮)电路操作之前将输入值置于(例如,任何)期望的顺序(例如,下面参考图12讨论的顺序)。硬件加速器800包括输出810(例如,输出端口)以向例如请求硬件加速器执行加密操作的处理器或其他组件提供输出值。所描绘的输出810耦合到向量寄存器802,向量寄存器802例如要存储输入值和/或存储加密操作的工作状态值。在所描绘的实施例中,控制电路806可以发送就绪存储812中的就绪值以指示所请求的加密操作(例如,期望的轮数)已完成,例如使得请求硬件加速器执行加密操作的处理器或其他组件可以监视就绪存储812并(例如,经由输出810)从向量寄存器802加载该值。在一个实施例中,就绪存储812中的就绪值的设置使得硬件加速器800将值从向量寄存器802(例如,经由输出810)发送到请求硬件加速器执行加密操作的处理器或其他组件。

在某些实施例中,包括控制电路806以提供控制值(例如,多路复用器控制值)以根据加密标准进行控制(例如,迭代)(例如,以执行上面讨论的¼轮1-8)。在一个实施例中,硬件加速器800包括轮次电路804(例如,来自图6的¼轮电路600或来自图7的经一体化的¼轮/blake轮次电路700)。控制电路806可以包括到轮次电路804的控制线(示为虚线)(例如,以提供在chacha四分之一轮电路600或经一体化的chacha四分之一轮和blake轮次电路700中使用的旋转方向和/或值,和/或提供在经一体化的chacha四分之一轮和blake轮次电路700中使用的多路复用器输入和控制值,等等)。在一个实施例中,多路复用器组814(例如,在某些实施例中,其可以是单个多路复用器)要例如根据来自控制电路806的控制值将数据源从向量寄存器802切换到轮次电路804的输入。在一个实施例中,多路复用器组816(例如,在某些实施例中,其可以是单个多路复用器)要例如根据来自控制电路806的控制值将源发自轮次电路804的数据切换到向量寄存器802中。在一个实施例中,图8中的多路复用器816(例如,多路分配器)是多路复用器916a或多路复用器916b,例如当多路复用器916a或多路复用器916b是同一个(例如,单个)电路时。在一个实施例中,控制电路806包括用来执行多个周期的轮次(例如,¼轮)操作的值。

图9例示了根据本公开实施例的硬件加速器900的一轮加密操作的多个周期(例如,¼轮)。在某些实施例中,包括控制电路(例如,来自图8的控制电路806)以提供控制值(例如,多路复用器控制值)以根据加密标准进行控制(例如,迭代)(例如,以执行上面讨论的¼轮1-8)。在一个实施例中,多路复用器916a和多路复用器916b是分离的电路。在另一实施例中,多路复用器916a和多路复用器916b是同一个电路,例如,使得图9例示了循环通过同一电路系统的多次迭代(例如,¼轮)。在多路复用器916a和多路复用器916b是同一个(例如,单个)电路的实施例中,多路复用器可以用作图8中的多路复用器816(例如,多路分配器)。在一个实施例中,多路复用器914a和多路复用器914b是分离的电路。在另一实施例中,多路复用器914a和多路复用器914b是同一个电路,例如,使得图9例示了循环通过同一电路系统的多次迭代(例如,¼轮)。在多路复用器914a和多路复用器914b是同一个(例如,单个)电路的实施例中,多路复用器可以用作图8中的多路复用器814(例如,多路分配器)。在一个实施例中,¼轮电路904a和¼轮电路904b是分离的电路。在另一实施例中,¼轮电路904a和¼轮电路904b是同一个电路,例如,使得图9例示了循环通过同一电路系统的多次迭代(例如,¼轮)。在¼轮电路904a和¼轮电路904b是同一个(例如,单个)电路的实施例中,¼轮电路可以用作图8中的轮次电路804。向量寄存器902a、向量寄存器902b和向量寄存器902c(或其任何组合)可以是同一个向量寄存器。在向量寄存器902a、向量寄存器902b和向量寄存器902c(或其任何组合)是同一个(例如,单个)寄存器的实施例中,向量寄存器电路可以用作图8中的向量寄存器802。注意,r0-r15例示了向量寄存器包括16个元素的实施例。在以下实施例中,注意,仅仅为了此处清楚的目的,元素内部所示的数字(例如,周期0处的分别在元素r0、r1、r2和r3中的0、1、2和3)指示来自表1的值,例如,0是常数c0,并且12是bc[位31:0],而不是其本身的实际值。在某些实施例中,向量寄存器要存储实际值。在一个实施例中,提供可选的附加的并行多路复用器组920a和920b(例如,每个具有至少16个数据输入),以例如在对所述输入数据的第一次轮次(例如,¼轮)电路操作之前将(例如,用于加密的初始)输入值置于(例如,任何)期望的顺序(例如,下面参考图12讨论的顺序)。在一个实施例中,多路复用器920a和多路复用器920b是分离的电路。在另一实施例中,多路复用器920a和多路复用器920b是同一个电路,例如,使得图9例示了循环通过同一电路系统的多次迭代(例如,¼轮)。在多路复用器920a和多路复用器920b是同一个(例如,单个)电路的实施例中,多路复用器可以用作图8中的多路复用器820或多路复用器818。在一个实施例中,多路复用器920a和/或多路复用器920b的new(例如,最右侧的输入)例如从请求硬件加速器执行加密操作的处理器或其他组件接收输入值,例如,由控制电路(例如,图8中的控制电路806)将控制值发送到多路复用器920a和/或多路复用器920b,(i)以例如在加密的第一次迭代(例如,¼轮)之前从新的输入(例如,从图8中的输入808)源发数据,和/或(ii)以针对加密的其他迭代分别从多路复用器916a和/或多路复用器916b源发数据(例如,直到需要不同的“新”输入为止,例如,针对chacha20的每20轮)。

下面以chacha¼轮为例进行讨论,但可预见到其他实现,例如blake轮次等。

在针对周期0的¼轮(0,4,8,12)(例如,表1从左数第一列)的一个实施例中,按表1的元素0-15的顺序将chacha状态存储在向量寄存器902a中。由于¼轮电路904a针对周期1要对数据元素0、4、8和12进行操作,因此多路复用器要将来自向量寄存器902a的r0、r4、r8和r12的值输出到¼轮电路904a中(例如,作为分别用于chacha四分之一轮电路600或经一体化的chacha四分之一轮和blake轮次电路700的值a、b、c、d)。然后,¼轮电路904a根据电路系统对所述数据进行操作以产生新值(本文称为值anew、bnew、cnew和dnew)。然后将这些新值存储到向量寄存器902b的r0、r4、r8和r12中(其可以是与向量寄存器902a相同的物理寄存器)。可以将向量寄存器902a的其他值(例如,不包括来自r0、r4、r8和r12的值)存储(例如,不对它们执行任何操作,例如,仅将相同的值输入传递为输出)到向量寄存器902b中的相同数据元素位置中。注意,仅仅为了此处清楚的目的,针对向量寄存器902b的r0、r4、r8和r12更新所述值,但是元素内部示出的数字(例如,在周期1处分别在元素r0、r4、r8和r12中的0、4、8和12)指示其中的值是基于来自表1的相应值(例如,存储在向量寄存器902b的元素0处的值anew是基于来自表1的作为常数c0的输入a,存储在向量寄存器902b的元素4处的值bnew是基于来自表1的作为密钥[位255:224]的输入b,存储在向量寄存器902b的元素8处的值cnew是基于来自表1的作为密钥[位127:96]的输入c,并且存储在向量寄存器902b的元素12处的值dnew是基于来自表1的作为bc[位31:0]的输入d),而不是其本身的实际值。在某些实施例中,向量寄存器要存储实际值。

由于¼轮电路904b针对周期2要对数据元素1、5、9和13进行操作,因此多路复用器要将来自向量寄存器902b的r1、r5、r9和r13的值输出到¼轮电路904b中(例如,作为分别用于chacha四分之一轮电路600或经一体化的chacha四分之一轮和blake轮次电路700的值a、b、c、d)。然后,¼轮电路904b根据电路系统对所述数据进行操作以产生新值(本文称为值anew、bnew、cnew和dnew)。然后将这些新值存储到向量寄存器902c的r1、r5、r9和r13中(其可以是与向量寄存器902a和/或向量寄存器902b相同的物理寄存器)。可以将向量寄存器902b的其他值(例如,不包括来自r1、r5、r9和r13的值)存储(例如,不对它们执行任何操作,例如,仅将相同的值输入传递为输出)到向量寄存器902c中的相同数据元素位置中。注意,仅仅为了此处清楚的目的,针对向量寄存器902c的r1、r5、r9和r13更新所述值,但是元素内部示出的数字(例如,在周期2处分别在元素r1、r5、r9和r13中的1、5、9和13)指示其中的值是基于来自表1的相应值(例如,存储在向量寄存器902c的元素1处的值anew是基于来自表1的作为常数c1的输入a,存储在向量寄存器902c的元素5处的值bnew是基于来自表1的作为密钥[位223:192]的输入b,存储在向量寄存器902c的元素9处的值cnew是基于来自表1的作为密钥[位95:64]的输入c,并且存储在向量寄存器902c的元素13处的值dnew是基于来自表1的作为临时数[位95:64]的输入d),而不是其本身的实际值。在某些实施例中,向量寄存器要存储实际值。

在这些实施例中,注意,来自表1的元素位置0-15与向量寄存器中的物理寄存器元素匹配。

图10例示了根据本公开实施例的图9中的硬件加速器904a/904b的关键数据路径1000。术语“关键”可以是指花费最长时间的路径,例如,包括要穿过的最多个门级的路径。

在图9中的上述实现中,初始chacha状态以与表1中所示的4×4矩阵匹配的顺序存储在(例如,16×32位)向量寄存器(902a-902c)中。在周期1中(例如,在周期1的开始处),在寄存器元素0、1、2和3处的值的子集之间选取到¼轮(0,4,8,12)的第一输入,并从而利用(例如,4:1的)多路复用器914a(1)来源发用于轮次(例如,¼轮)电路的输入,例如,如图8中的多路复用器814a所示。其他3个输入也通过914处的(例如,4:1的)多路复用器,例如,向关键路径添加至少四个门级。此外,在所描绘的实施例中的¼轮的输出处,仅更新¼轮的子集(例如,四个)输入值,而其余12个状态保持不变。在某些实施例中,多路分配操作在每个状态寄存器的输入处利用(例如,2:1的)多路复用器,例如,在关键路径中添加至少两个附加的门级延迟。在一个实施例中,¼轮计算中的关键路径从来自向量寄存器902a(或902b)的输入a或b(例如,图6或图7中的输入a或b)开始,并且以bnew的计算结束,例如,跨越了通过输入多路复用器914a(或914b)、¼轮电路904a(或904b)和输出多路复用器916a(或916b)的约34个门级,如图10中所示。可选地,提供附加的并行多路复用器组920a(例如,具有至少16个数据输入),以例如在对所述输入数据的第一次轮次(例如,¼轮)电路操作之前将(例如,用于加密的初始)输入值置于(例如,任何)期望的顺序(例如,下面参考图12讨论的顺序)。

在某些实施例中,可能期望减少关键路径中的门级的数量。例如,源发多路复用器(例如,图9中的多路复用器914和/或图8中的多路复用器820),其将输入值(例如,从表1的0-15格式的顺序)以期望的顺序源发到¼轮电路中,例如,以将元素源发到根据上面参考chacha加密标准讨论的8个¼轮操作的¼轮电路。本文的某些实施例利用假设列和对角线自动对齐技术的电路系统,以在多个周期(例如,除了每一轮次的最后一个周期之外的所有周期)中丛发(cluster)同一寄存器中的¼轮的(例如,四个,例如,32位的)输入值,例如,如图11和12中所示。例如,图11-16中所示的实施例移除了原本要用于对输入值重新排序的关键路径中的(例如,4:1的)多路复用器(例如,移除图9和10中的多路复用器914a和914b)。

在某些实施例中,在初始化期间,(例如,16×32位)chacha输入值(例如,状态)以列对齐方式存储在(例如,512位的)寄存器中,使得寄存器[例如,位511:384]存储进入第1轮的第一个¼轮的(例如,4×32位)状态。类似地,寄存器[例如,位383:256]、寄存器[例如,位255:128]和寄存器[127:0]包含分别用于第1轮的第二个、第三个和第四个¼轮的输入字。在周期1中,在第一个¼轮的计算之后,将输出存储在寄存器[例如,位127:0]中,并且将其余的位向左移位(例如,移位相同数量的位,例如,128个位置),以自动对齐寄存器[511:384]中的下一个(例如,4x32位)输入。由于在本实施例中,到¼轮逻辑的输入总是从状态寄存器的相同的128位获得,所以消除了对(例如,4:1的)源发多路复用器的使用。在第四个¼轮操作结束时,在本实施例中,¼轮的输出和其余状态被适当地置乱到寄存器中,以对齐用于下一个对角线对齐的轮次操作的全部(例如,512位的)数据,例如,其中到下一个¼轮的输入存储在寄存器[例如,位511:384]中。接下来的3个周期可以执行类似于列对齐轮次的¼轮操作和状态移位/存储,例如,如图12中所示。在第四个¼轮结束时,可以适当地置乱状态寄存器的内容和¼轮的输出以对齐用于列轮次操作的状态。在某些实施例中,在¼轮的输入处的(例如,4:1的)源发多路复用器的消除使关键路径缩减了10%。

图11例示了根据本公开实施例的硬件加速器1100的电路系统。图12例示了根据本公开实施例的图11的硬件加速器1100的一轮加密操作的多个周期1200。

在一个实施例中,向量寄存器1102被加载有(例如,由处理器输入)以所描绘的元素顺序的来自表1的值,即0、4、8、12、1、5、9、13、2、6、10、14、3、7、11、15。那些值指代仅仅是对表1中的元素的指代,例如,具有它们自己的相应数据值,或者是对由¼轮操作对该输入数据形成的新数据的指代(例如,如果值0表示常数c0,并且其作为值a被输入到¼轮电路中,那么至少基于c0产生的anew在该图中也被指代为值0,以示出通过电路系统的数据流)。r0-r15是对16个寄存器元素本身的指代,例如,而不是对存储在那些元素中的数据的指代。硬件加速器1100包括向量寄存器1102。向量寄存器1102在图11中被示出两次,以例示该电路系统可能反馈到其自身中。例如,到多路复用器的标记为r0-r15的输入可以指示向量寄存器1102的寄存器元素位置(例如,在某些实施例中,要从图11的下半部中的向量寄存器1102源发数据)。在另一实施例中,图11顶部处的可选向量寄存器1102与图11下半部分中的向量寄存器1102不是同一个硬件实例,例如,多路复用器1120的左侧输入可以耦合到用来源发新数据的输入(例如,图8中的输入808),其例如来自请求硬件加速器执行加密操作的处理器或其他组件。在一个实施例中,控制电路(例如,图8中的控制电路806)向多路复用器1120发送控制值,以(i)(例如在加密的第一次迭代(例如,¼轮)之前)从其左侧的输入(例如,从图8中的输入808)源发新数据,和/或(ii)针对加密的其他迭代从¼轮电路1104和/或图11下半部中的向量寄存器1102源发迭代数据(例如,直到需要不同的“新”输入为止,例如,针对chacha20的每20轮)。

图11顶部所示的向量寄存器1102例示了参考表1以列对齐加载到向量寄存器中的初始值(例如,在图12中的周期0处)。例如,仅仅为了此处清楚的目的,在周期0时,寄存器存储位置r0、r1、r2和r3中的元素0、4、8和12分别指示来自表1的值,例如,0是常数c0,且12是bc[位31:0],而非其本身的实际值。在该实施例中,针对一定数量的(例如,所有的)¼轮(例如,多于四个¼轮),¼轮电路1104(例如,来自图6的¼轮电路600或来自图7的经一体化的¼轮/blake轮次电路700)要接收来自向量寄存器1102的第一端处的相邻元素的数据值,例如,要接收来自向量寄存器1102的r0的数据值作为输入值a、来自向量寄存器1102的r1的数据值作为输入值b、来自向量寄存器1102的r2的数据值作为输入值c、以及来自向量寄存器1102的r3的数据值作为输入值d,以用于加密操作的那些周期。在某些实施例中,针对一定数量的(例如,列对齐的)¼轮(例如,前三个¼轮),¼轮电路1104要将结果值anew、bnew、cnew和dnew输出到向量寄存器1102的另一相对端,例如,要将输出数据值anew存储到向量寄存器1102的r12中、将输出数据值bnew存储到向量寄存器1102的r13中、将输出数据值cnew存储到向量寄存器1102的r14中并且将输出数据值dnew存储到向量寄存器1102的r15中。针对相同的、一定数量的(例如,列对齐的)¼轮(例如,前三个¼轮),可以将来自r4-r15的其余值从第二端移位(例如,移位¼轮电路1104所消耗的相同位数)到第一端,例如,如图12中的从周期0到周期1、周期1到周期2以及周期2到周期3的以虚线示出的那样。

在一个周期中(例如,从周期3到周期4),要利用不同的方案。例如,针对一定数量的(例如,对角线对齐的)¼轮(例如,四个¼轮中的最后一个),¼轮电路1104要将结果值anew、bnew、cnew和dnew输出到向量寄存器1102的特定(例如,非相邻)元素,例如,要将输出数据值anew存储到向量寄存器1102的r12中、将输出数据值bnew存储到向量寄存器1102的r9中、将输出数据值cnew存储到向量寄存器1102的r6中并且将输出数据值dnew存储到向量寄存器1102的r3中。例如,来自r4-r15的其余值也可以根据所描绘的模式(例如,从周期3到周期4)散开,以获得完全对角线对齐(例如,如在周期4处在向量寄存器1102中描绘的)。在一个实施例中,在来自前一周期的数据(例如,基于时钟信号)被锁入(latchin)之后立即开始新的周期。

然后可以开始下一个¼轮(例如,上面讨论的8轮中的第5个),例如,其中,针对一定数量的(例如,所有的)¼轮(例如,上面讨论的8个中的¼轮1-8),¼轮电路1104(例如,来自图6的¼轮电路600或来自图7的经一体化的¼轮/blake轮次电路700)要接收来自向量寄存器1102的第一端处的相邻元素的数据值,例如,要接收来自向量寄存器1102的r0的数据值作为输入值a、来自向量寄存器1102的r1的数据值作为输入值b、来自向量寄存器1102的r2的数据值作为输入值c、以及来自向量寄存器1102的r3的数据值作为输入值d,以用于加密操作的那些周期。在某些实施例中,针对一定数量的(例如,列对齐的)¼轮(例如,这接下来的三个¼轮5-7),¼轮电路1104要将结果值anew、bnew、cnew和dnew输出到向量寄存器1102的另一相对端,例如,要将输出数据值anew存储到向量寄存器1102的r12中、将输出数据值bnew存储到向量寄存器1102的r13中、将输出数据值cnew存储到向量寄存器1102的r14中并且将输出数据值dnew存储到向量寄存器1102的r15中。针对相同的、一定数量的(例如,列对齐的)¼轮(例如,这接下来的三个¼轮5-7),可以将来自r4-r15的其余值从第二端移位(例如,移位¼轮电路1104所消耗的相同位数)到第一端,例如,如图12中从周期4到周期5以虚线示出的那样。

可以从控制电路(例如,图8中的控制电路806)向多路复用器1116中的每一个发送¼轮控制值(qrnd)和/或向多路复用器1120中的每一个发送新加密控制值(new_enc)。控制值可以使它们的多路复用器例如根据正在执行哪个¼轮来将输入值输出到它们相应的位置中,参见例如图12。在一个实施例中,针对¼轮的子集(例如,四个¼轮中的前三个)多路复用器1116源发列队齐的值(例如,如图12中的从周期0到周期1、周期1到周期2以及周期2到周期3所示),并且针对其余的¼轮(例如,四个¼轮中的第四个),多路复用器1116源发对角线队齐的值(例如,如图12中从周期3到周期4所示)。在一个实施例中,到多路复用器1120中的每一个的新加密控制值(new_enc)根据加密操作来源发输入数据,例如,根据要执行的操作从向量寄存器1102(其可以是多个物理寄存器或单个物理寄存器)的所描绘的元素提供数据。例如,所描绘的多路复用器1120(1)包括耦合到向量寄存器1102的寄存器元素r1的第一输入和耦合到向量寄存器1102的寄存器元素r9的第二输入,并且第一加密控制值(例如,逻辑0)(new_enc)(例如,指示它是新加密)要使多路复用器1120(1)将来自向量寄存器1102的寄存器元素r1的值输出到多路复用器1116(1)的输入,并且第二加密控制值(例如,逻辑1)(new_enc)(例如,指示它不是新的加密)要使多路复用器1120(1)将来自向量寄存器1102的寄存器元素r9的值输出到多路复用器1116(1)的输入。在所描绘的实施例中,多路复用器1116(1)的另一输入耦合到向量寄存器1102的寄存器元素r5。在一个实施例中,第一多路复用器控制值(例如,逻辑1)要使多路复用器1116(1)将来自向量寄存器1102的寄存器元素r5的输入输出到向量寄存器1102的寄存器元素r1(例如,到¼轮电路1104的输入b),并且第二多路复用器控制值(例如,逻辑0)要使多路复用器1116(1)将来自多路复用器1120(1)的输入输出到向量寄存器1102的寄存器元素r1(例如,到¼轮电路1104的输入b)(例如,根据¼轮电路1104要对该数据执行的(例如,上面讨论的1-8模式中的)哪种¼轮模式)。

在图12中,针对周期0到周期1、周期1到周期2和周期2到周期3,分别从r0、r1、r2和r3生成¼轮的输出值(例如,anew、bnew、cnew和dnew),并将它们分别存储在r12、r13、r14和r15中。在所描绘的实施例中,来自¼轮电路1104的输出(例如,anew、bnew、cnew和dnew)被环回到加速器1100中(例如,作为到多路复用器的输入)。图12中的花括号中的数字可以指示周期数或硬件的不同实例。

在一个实施例中,针对初始周期(例如,新加密),硬件加速器1100要(例如,通过断言逻辑1作为控制值new_enc)源发第一组并行多路复用器1120的左侧输入(例如,源发至向量寄存器1102,向量寄存器1102最初针对其元素0、4、8、12、1、5、9、13、2、6、10、14、3、7、11、15以该顺序存储来自表1中的值),并且(例如,通过断言逻辑0作为控制值qrnd)将那些值通过第二组并行多路复用器(如果存在的话)传递到(例如,传递回到)向量寄存器1102(例如,图11的下半部中示出的向量寄存器实例)中。

在一个实施例中,针对¼轮的列对齐(例如,第一、第二、第三、第五、第六或第七)周期,硬件加速器1100要按照图12中指示的那样操纵数据,例如,要(例如,通过断言逻辑0作为控制值new_enc)选择多路复用器1120的右侧输入,以将值传递到用于多路复用器1120(0)、多路复用器1120(4)、多路复用器1120(8)和多路复用器1120(12)的向量寄存器1102,并且以将值传递到用于其余多路复用器1120的多路复用器1116,并且要(例如,通过断言逻辑1作为控制值qrnd)选择多路复用器1116的左侧输入以将那些值提供给向量寄存器1102,例如,以由¼轮电路1104对其进行操作。本文关于某些功能性讨论了逻辑0和逻辑1,但是它们都可以互换。

在一个实施例中,针对¼轮的对角线对齐(例如,第四或第八)周期,硬件加速器1100要按照图12中指示的那样操纵数据,例如,要(例如,通过断言逻辑0作为控制值new_enc)选择多路复用器1120的右侧输入,以将值传递到用于多路复用器1120(0)、多路复用器1120(4)、多路复用器1120(8)和多路复用器1120(12)的向量寄存器1102,并且以将值传递到用于其余多路复用器1120的多路复用器1116,并且要(例如,通过断言逻辑0作为控制值qrnd)选择多路复用器1116的右侧输入以将那些值提供给向量寄存器1102,例如,以由¼轮电路1104对其进行操作。

向量寄存器实例可以用花括号中的周期数来指代。在一个实施例中,这些是同一个向量寄存器(例如,图11中的向量寄存器1102)。例如,在图12中从周期3到周期4,所描绘的硬件加速器1100要将来自向量寄存器1102(3)的r4的数据存储到向量寄存器1102(4)的r0中、将来自向量寄存器1102(3)的r9的数据存储到向量寄存器1102(4)的r1中、将来自向量寄存器1102(3)的r14的数据存储到向量寄存器1102(4)的r2中、将来自¼轮电路1104的(基于向量寄存器1102(3)的r3的输入作为值d的)dnew存储到向量寄存器1102(4)的r3中、将来自向量寄存器1102(3)的r8的数据存储到向量寄存器1102(4)的r4中、将来自向量寄存器1102(3)的r13的数据存储到向量寄存器1102(4)的r5中、将来自¼轮电路1104的(基于向量寄存器1102(3)的r2的输入作为值c的)cnew存储到向量寄存器1102(4)的r6中、将来自向量寄存器1102(3)的r7的数据存储到向量寄存器1102(4)的r7中、将来自向量寄存器1102(3)的r12的数据存储到向量寄存器1102(4)的r8中、将来自¼轮电路1104的(基于向量寄存器1102(3)的r1的输入作为值b的)bnew存储到向量寄存器1102(4)的r9中、将来自向量寄存器1102(3)的r6的数据存储到向量寄存器1102(4)的r10中、将来自向量寄存器1102(3)的r11的数据存储到向量寄存器1102(4)的r11中、将来自¼轮电路1104的(基于向量寄存器1102(3)的r0的输入作为值a的)anew存储到向量寄存器1102(4)的r12中、将来自向量寄存器1102(3)的r5的数据存储到向量寄存器1102(4)的r13中、将来自向量寄存器1102(3)的r10的数据存储到向量寄存器1102(4)的r14中、以及将来自向量寄存器1102(3)的r15的数据存储到向量寄存器1102(4)的r15中。

在一个实施例中,图11的顶部和底部的向量寄存器1102是分离的寄存器(例如,其中一个是用于在生成输出数据时存储输入数据的临时寄存器(例如,以避免任何覆写))。注意,在所描绘的实施例中,某些路径(例如,多路复用器1120的最左侧的多路复用器)仅包括一个串联的多路复用器而不是两个串联的多路复用器。

图13例示了根据本公开实施例的图12中的硬件加速器的关键数据路径。注意,与图10中的关键路径1000相比,不存在(例如,¼轮电路的输入操纵的)多路复用器914a或914b中的任一者,例如,从而通过改善最耗时的数据生成操作的速度来改善(例如,计算机的)加速器的功能性。术语“关键”可以是指花费最长时间的路径,例如,包括要穿过的最多个门级的路径。在图12中的上述实现中,初始chacha状态以与表1中所示的4×4矩阵的(例如,第一)列匹配的顺序存储在(例如,16×32位)向量寄存器1102中。图13中的关键数据路径要进行源发(例如,在输入a或b上)、穿过¼轮电路1104(例如,在图6或图7中的路径a或b上)、并且然后穿过(一个或多个)多路复用器,例如,多路复用器1120(9)、之后串联有多路复用器1116(9)和/或多路复用器1120(13)、之后串联有多路复用器1116(13)(例如,在耦合到向量寄存器1102之前)。

图14例示了根据本公开实施例的硬件加速器1400的电路系统。图15例示了根据本公开实施例的图14的硬件加速器1400的一轮加密操作的多个周期1500。图15中的花括号中的数字可以指示周期数或硬件的不同实例。

在一个实施例中,向量寄存器1402被加载有以所描绘的元素顺序的来自表1的值,即0、4、8、12、1、5、9、13、2、6、10、14、3、7、11、15。那些值指代仅仅是对表1中的元素的指代,例如,具有它们自己的相应数据值,或者是对由¼轮操作对该输入数据形成的新数据的指代(例如,如果值0表示常数c0,并且其作为值a被输入到¼轮电路中,那么至少基于c0产生的anew在该图中也被指代为值0,以示出通过电路系统的数据流)。r0-r15是对16个寄存器元素本身的指代,例如,而不是对存储在那些元素中的数据的指代。硬件加速器1400包括向量寄存器1402。向量寄存器1402在图14中被示出两次,以例示该电路系统可能反馈到其自身中。例如,到多路复用器的标记为r0-r15的输入可以指示向量寄存器1402的寄存器元素位置(例如,在某些实施例中,要从图14的下半部中的向量寄存器1402源发数据)。在另一实施例中,图14顶部处的可选向量寄存器1402与图14下半部分中的向量寄存器1402不是同一个硬件实例,例如,多路复用器1420的左侧输入可以耦合到用来源发新数据的输入(例如,图8中的输入808),其例如来自请求硬件加速器执行加密操作的处理器或其他组件。在一个实施例中,控制电路(例如,图8中的控制电路806)向多路复用器1420发送控制值,以(i)(例如在加密的第一次迭代(例如,¼轮)之前)从其左侧的输入(例如,从图8中的输入808)源发新数据,和/或(ii)针对加密的其他迭代从¼轮电路1404和/或图14下半部中的向量寄存器1402源发迭代数据(例如,直到需要不同的“新”输入为止,例如,针对chacha20的每20轮)。

图14顶部所示的向量寄存器1402例示了参考表1以列对齐加载到向量寄存器中的初始值(例如,在图15中的周期0处)。例如,仅仅为了此处清楚的目的,在周期0时,寄存器存储位置r0、r1、r2和r3中的元素0、4、8和12分别指示来自表1的值,例如,0是常数c0,且12是bc[位31:0],而非其本身的实际值。在该实施例中,针对一定数量的(例如,所有的)¼轮(例如,多于四个¼轮),¼轮电路1404(例如,来自图6的¼轮电路600或来自图7的经一体化的¼轮/blake轮次电路700)要接收来自向量寄存器1402的第一端处的相邻元素的数据值,例如,要接收来自向量寄存器1402的r0的数据值作为输入值a、来自向量寄存器1402的r1的数据值作为输入值b、来自向量寄存器1402的r2的数据值作为输入值c、以及来自向量寄存器1402的r3的数据值作为输入值d,以用于加密操作的那些周期。在某些实施例中,针对一定数量的(例如,列对齐的)¼轮(例如,前三个¼轮),¼轮电路1404要将结果值anew、bnew、cnew和dnew输出到向量寄存器1402的另一相对端,例如,要将输出数据值anew存储到向量寄存器1402的r12中、将输出数据值bnew存储到向量寄存器1402的r13中、将输出数据值cnew存储到向量寄存器1402的r14中并且将输出数据值dnew存储到向量寄存器1402的r15中。针对相同的、一定数量的(例如,列对齐的)¼轮(例如,前三个¼轮),可以将来自r4-r15的其余值从第二端移位(例如,移位¼轮电路1404所消耗的相同位数)到第一端,例如,如图15中的从周期0到周期1、周期1到周期2以及周期2到周期3的以虚线示出的那样。

例如,图11-12中例示的实施例示出了对角线对齐发生在一个周期(例如,从周期3到周期4)上(例如,一个周期内)。然而,在某些实施例中,这使得在¼轮电路的输出处的(例如,2:1的)多路复用器(例如,图11和13中的多路复用器1116(9))在从列对齐转换至对角线对齐的轮次计算时选择适当的状态寄存器输入。在某些实施例中,通过将列/对角线自对齐延迟一个时钟周期来消除该多路复用器,例如,如图15中所示。向量寄存器实例可以用花括号中的周期数来指代。在一个实施例中,这些都是同一个向量寄存器(例如,图14中的向量寄存器1402)。

在一个实施例中,在第1轮的第4个¼轮的末尾,¼轮的bnew的输出(例如,其是关键路径的一部分)仍然存储在向量寄存器1402(4)中[例如,位95:64]。结果,除了(例如,分别在向量寄存器1402(4)中的寄存器元素r9、r13、r6和r14中的)状态(例如,元素)4、7、9和11之外的所有状态(例如,元素)都是针对列轮次操作适当地对齐的,例如,向量是部分对齐的。由于这4个状态(例如,元素)不参与下一个周期的第一¼轮操作(例如,第2轮,第5周期),因此可以在周期5中适当地使它们移位以将所有状态(例如,元素)完全对齐至对角线轮次操作。在该实施例中,其中¼轮的关键输出bnew总是存储在相同的寄存器中,因此可以消除关键路径中的(例如,2:1的)(例如,¼轮电路的输出操纵的)多路复用器(例如,图11和13中的多路复用器1116(9)),从而在某些实施例中进一步将性能改善5%。当从对角线对齐转换至列对齐的轮次计算时,可以执行类似的延迟对齐。在一个实施例中,加速器1400具有18k门的单元面积,并且当以1.2纳秒(ns)的周期时间操作时具有5.3千兆位每秒(gbps)的吞吐量。

例如,在图15中从周期3到周期4,所描绘的硬件加速器1400要将来自向量寄存器1402(3)的r4的数据存储到向量寄存器1402(4)的r0中、将来自向量寄存器1402(3)的r9的数据存储到向量寄存器1402(4)的r1中、将来自向量寄存器1402(3)的r14的数据存储到向量寄存器1402(4)的r2中、将来自¼轮电路1404的(基于向量寄存器1402(3)的r3的输入作为值d的)dnew存储到向量寄存器1402(4)的r3中、将来自向量寄存器1402(3)的r8的数据存储到向量寄存器1402(4)的r4中、将来自向量寄存器1402(3)的r13的数据存储到向量寄存器1402(4)的r5中、将来自向量寄存器1402(3)的r10的数据存储到向量寄存器1402(4)的r6中、将来自向量寄存器1402(3)的r7的数据存储到向量寄存器1402(4)的r7中、将来自向量寄存器1402(3)的r12的数据存储到向量寄存器1402(4)的r8中、将来自向量寄存器1402(3)的r5的数据存储到向量寄存器1402(4)的r9中、将来自向量寄存器1402(3)的r6的数据存储到向量寄存器1402(4)的r10中、将来自向量寄存器1402(3)的r11的数据存储到向量寄存器1402(4)的r11中、将来自¼轮电路1404的(基于向量寄存器1402(3)的r0的输入作为值a的)anew存储到向量寄存器1402(4)的r12中、将来自¼轮电路1404的(基于向量寄存器1402(3)的r1的输入作为值b的)bnew存储到向量寄存器1402(4)的r13中、将来自¼轮电路1404的(基于向量寄存器1402(3)的r2的输入作为值c的)cnew存储到向量寄存器1402(4)的r14中、以及将来自向量寄存器1402(3)的r15的数据存储到向量寄存器1402(4)的r15中。

可以从控制电路(例如,图8中的控制电路806)向多路复用器1416和1418中的每一个发送¼轮控制值(qrnd)和/或向多路复用器1420中的每一个发送新加密控制值(new_enc)。控制值可以使它们的多路复用器(例如,针对周期)例如根据正在执行哪个¼轮来将输入值输出到它们相应的位置中,参见例如图15。在一个实施例中,到多路复用器1420中的每一个的新加密控制值(new_enc)根据加密操作来源发输入数据,例如,根据要执行的操作从向量寄存器1402(其可以是多个物理寄存器或单个物理寄存器)的所描绘的元素提供数据。在一个实施例中,在图15中从周期3到周期4,所描绘的硬件加速器1400(例如,其控制电路)要断言加密控制值(例如,逻辑0)(new_enc)以使得多路复用器1420(例如,除了多路复用器1420(9)之外,其可以包括其自己的控制线qrnd3)将其右侧输入的输出发送到向量寄存器1402(例如,当在多路复用器1420中的多路复用器的该路径中也没有串行多路复用器1416时),并且断言¼轮控制值(例如,逻辑0)(qrnd)以使得多路复用器1416将其右侧输入的输出发送到向量寄存器1402,断言另一¼轮控制值2(例如,逻辑1)(qrnd2)以使得多路复用器1418将其左侧输入(例如,r5)的输出发送到下游多路复用器1420(9),并且断言另一¼轮控制值3(例如,逻辑0)(qrnd3)以使得多路复用器1420(9)从其右侧输入(例如,从多路复用器1418的输出)源发数据。

在该实施例中,针对某些¼轮(例如,针对在第四或第八¼轮之后的下一个¼轮),¼轮电路1404(例如,来自图6的¼轮电路600或来自图7的经一体化的¼轮/blake轮次电路700)接收来自向量寄存器1402的第一端处的相邻元素的数据值,例如,要接收来自向量寄存器1402(4)的r0的数据值作为输入值a、来自向量寄存器1402(4)的r1的数据值作为输入值b、来自向量寄存器1402(4)的r2的数据值作为输入值c、以及来自向量寄存器1402(4)的r3的数据值作为输入值d,以用于到¼轮电路1404中的加密操作的那些周期,并且针对某些¼轮(例如,针对第五个¼轮),¼轮电路1404将结果值anew、bnew、cnew和dnew输出到向量寄存器1402的另一相对端,例如,要将输出数据值anew存储到向量寄存器1402(5)的r12中、将输出数据值bnew存储到向量寄存器1402(5)的r13中、将输出数据值cnew存储到向量寄存器1402(5)的r14中并且将输出数据值dnew存储到向量寄存器1402(5)的r15中。针对一定数量的(例如,列对齐的)¼轮(例如,一轮中的前三个¼轮),可以将来自r4-r15的其余值从第二端移位(例如,移位¼轮电路1404所消耗的相同位数)到第一端,例如,如图15中的从周期0到周期1、周期1到周期2以及周期2到周期3的以虚线示出的那样。

作为另一示例,在图15中从周期4到周期5,所描绘的硬件加速器1400要将来自向量寄存器1402(4)的r4的数据存储到向量寄存器1402(5)的r0中、将来自向量寄存器1402(4)的r5的数据存储到向量寄存器1402(5)的r1中、将来自向量寄存器1402(4)的r14的数据存储到向量寄存器1402(5)的r2中、将来自向量寄存器1402(4)的r7的数据存储到向量寄存器1402(5)的r3中、将来自向量寄存器1402(4)的r8的数据存储到向量寄存器1402(5)的r4中、将来自向量寄存器1402(4)的r13的数据存储到向量寄存器1402(5)的r5中、将来自向量寄存器1402(4)的r10的数据存储到向量寄存器1402(5)的r6中、将来自向量寄存器1402(4)的r11的数据存储到向量寄存器1402(5)的r7中、将来自向量寄存器1402(4)的r12的数据存储到向量寄存器1402(5)的r8中、将来自向量寄存器1402(4)的r9的数据存储到向量寄存器1402(5)的r9中、将来自向量寄存器1402(4)的r6的数据存储到向量寄存器1402(5)的r10中、将来自向量寄存器1402(4)的r15的数据存储到向量寄存器1402(5)的r11中、将来自¼轮电路1404的(基于向量寄存器1402(4)的r0的输入作为值a的)anew存储到向量寄存器1402(5)的r12中、将来自¼轮电路1404的(基于向量寄存器1402(4)的r1的输入作为值b的)bnew存储到向量寄存器1402(5)的r13中、将来自¼轮电路1404的(基于向量寄存器1402(4)的r2的输入作为值c的)cnew存储到向量寄存器1402(5)的r14中、以及将来自¼轮电路1404的(基于向量寄存器1402(4)的r3的输入作为值d的)dnew存储到向量寄存器1402(5)的r15中。

可以从控制电路(例如,图8中的控制电路806)向多路复用器1416和1418中的每一个发送¼轮控制值(qrnd)和/或向多路复用器1420中的每一个发送新加密控制值(new_enc)。控制值可以使它们的多路复用器(例如,针对周期)例如根据正在执行哪个¼轮来将输入值输出到它们相应的位置中,参见例如图15。在一个实施例中,到多路复用器1420中的每一个的新加密控制值(new_enc)根据加密操作来源发输入数据,例如,根据要执行的操作从向量寄存器1402(其可以是多个物理寄存器或单个物理寄存器)的所描绘的元素提供数据。在一个实施例中,在图15中从周期4到周期5,所描绘的硬件加速器1400(例如,其控制电路)要断言加密控制值(例如,逻辑0)(new_enc)以使得多路复用器1420(例如,除了多路复用器1420(9)之外,其可以包括其自己的控制线qrnd3)将其右侧输入的输出发送到向量寄存器1402(例如,当在多路复用器1420中的多路复用器的该路径中也没有串行多路复用器1416时),并且断言¼轮控制值(例如,逻辑1)(qrnd)以使得多路复用器1416将其左侧输入的输出发送到向量寄存器1402,断言另一¼轮控制值2(例如,逻辑1)(qrnd2)以使得多路复用器1418将其右侧输入(例如,r9)的输出发送到下游多路复用器1420(9),并且断言另一¼轮控制值3(例如,逻辑0)(qrnd3)以使得多路复用器1420(9)从其右侧输入(例如,从多路复用器1418的输出)源发数据。

因此,硬件加速器1400可以(例如,经由控制值)如图15中指示的那样操纵数据,例如,以选择多路复用器1418、多路复用器1420和多路复用器1416的对应输入,以实现图15中描绘的数据操纵和操作。在一个实施例中,图14的顶部和底部的向量寄存器1402是分离的寄存器(例如,其中一个是用于在生成输出数据时存储输入数据的临时寄存器(例如,以避免任何覆写))。注意,在所描绘的实施例中,某些路径(例如,一组中的最左侧的多路复用器)仅包括一个多路复用器而不是两个多路复用器。

对于本文的任何实施例,可以利用分离的控制线(例如,具有独立于其他控制值中的一个或多个的其自己的控制值)(例如,控制电路可以为每个多路复用器控制线生成唯一的控制值)。

图16例示了根据本公开实施例的图15中的硬件加速器的关键数据路径1600。注意,与图10中的关键路径1000相比,不存在(例如,¼轮电路的输入操纵的)多路复用器914a或914b中的任一者,例如,从而通过改善最耗时的数据生成操作的速度来改善(例如,计算机的)加速器的功能性。注意,与图13中的关键路径1300相比,不存在(例如,¼轮电路的输出操纵的)多路复用器1116(9)或1120(9)中的至少一个,例如,从而通过改善最耗时的数据生成操作的速度来改善(例如,计算机的)加速器的功能性。术语“关键”可以是指花费最长时间的路径,例如,包括要穿过的最多个门级的路径。在图15中的上述实现中,初始chacha状态以与表1中所示的4×4矩阵的(例如,第一)列匹配的顺序存储在(例如,16×32位)向量寄存器1402中。图15中的关键数据路径要进行源发(例如,在输入a或b上)、穿过¼轮电路1404(例如,在图6或图7中的路径a或b上)、并且然后穿过多路复用器,例如,单个多路复用器1420(13)、之后没有串联任何其他多路复用器(例如,在耦合到向量寄存器1402之前)。

图17例示了根据本公开实施例的流程图1700。所描绘的流程1700包括将一轮加密操作的输入向量存储在向量寄存器中1702;利用电路通过以下方式对输入向量执行该轮的一部分:在电路的第一数据路径中,所述第一数据路径包括耦合到来自向量寄存器的第一输入和来自向量寄存器的第二输入的第一模加法器以及耦合到第一模加法器和来自向量寄存器的电路的第二数据路径的第二模加法器,利用第一模加法器将源于来自输入向量的第一输入的第一值和源于来自向量寄存器的第二输入的第二值相加以产生第一中间结果,以及利用第二模加法器将第一中间结果和来自第二数据路径的第三中间结果相加以产生第一结果,以及在电路的第二数据路径中,所述第二数据路径包括耦合到第二输入和来自向量寄存器的电路的第三数据路径的第一逻辑异或电路、耦合到第一逻辑异或电路的第一旋转电路、耦合到第一旋转电路和第三数据路径的第二逻辑异或电路、以及耦合到第二逻辑异或电路的第二旋转电路,利用第一逻辑异或电路对源于来自向量寄存器的第二输入的第二值和来自第三数据路径的第三结果进行逻辑异或操作以产生第二中间结果,利用第一旋转电路根据一个或多个控制值旋转第二中间结果以产生第三中间结果,对第三中间结果和来自第三数据路径的第四结果进行逻辑异或操作以产生第五中间结果,以及利用第二旋转电路根据一个或多个控制值旋转第五中间结果以产生第二结果1704;以及将针对该部分的来自第一数据路径的第一结果和针对该部分的来自第二数据路径的第二结果存储到向量寄存器中1706。

在一个实施例中,一种装置包括:向量寄存器,其要存储一轮加密操作的输入向量;电路,其包括:第一数据路径,其包括耦合到来自所述向量寄存器的第一输入和来自所述向量寄存器的第二输入的第一模加法器以及耦合到第一模加法器和来自所述向量寄存器的第二数据路径的第二模加法器,以及第二数据路径,其包括耦合到第二输入和来自所述向量寄存器的第三数据路径的第一逻辑异或电路、耦合到第一逻辑异或电路的第一旋转电路、耦合到第一旋转电路和第三数据路径的第二逻辑异或电路、以及耦合到第二逻辑异或电路的第二旋转电路;以及控制电路,其要使第一数据路径的第一模加法器和第二模加法器以及第二数据路径的第一逻辑异或电路、第二逻辑异或电路、第一旋转电路和第二旋转电路根据一个或多个控制值来执行该轮的一部分(例如,少于该轮的全部),并且(例如,使得所述电路的一个或多个多路复用器)将针对所述部分的来自第一数据路径的第一结果和针对所述部分的来自第二数据路径的第二结果存储到所述向量寄存器中。初始周期中的输入向量可以是存储在第一元素中的第一常数值和存储在与第一元素相邻的第二元素中的第二常数值,并且所述控制电路可以控制耦合在所述向量寄存器与所述电路之间的多路复用器,以源发第一常数值或第二常数值作为在所述初始周期中到所述电路的输入。初始周期(例如,图12和15中的周期1)中的输入向量可以是存储在相邻元素(例如,没有任何介于中间的元素)中的第一常数值、第一密钥值、第二密钥值和第一块计数器值,并且所述控制电路可以提供第一常数值、第一密钥值、第二密钥值和第一块计数器值作为在所述初始周期中到所述电路中的输入(例如,如参考图6和7讨论的a、b、c和d)。在所述初始周期中,所述控制电路可以将第一常数值提供给来自所述向量寄存器的第一输入以用于所述电路的第一数据路径,并将第一密钥值提供给来自所述向量寄存器的第二输入以用于所述电路的第二数据路径。在所述初始周期中,第一常数值、第一密钥值、第二密钥值和第一块计数器值可以被存储在所述向量寄存器的第一端处的相邻元素中,并且所述控制电路可以将第一常数值、第一密钥值、第二密钥值和第一块计数器值输入到所述电路中以产生输出值(例如,如参考图6和7讨论的anew、bnew、cnew和dnew),并将所述输出值存储到所述向量寄存器的第二端的相邻元素中以用于该轮的下一个周期。所述控制电路可以将所述初始周期的除了第一常数值、第一密钥值、第二密钥值和第一块计数器值之外的输入向量移位到开始于所述向量寄存器的第一端处的元素以用于该轮的下一个周期,并且所述输出值被存储在所述向量寄存器的第二端的相邻元素中以用于该轮的下一个周期。所述控制电路可以将用于该轮的附加周期的值从所述向量寄存器的第一端处的多个相邻元素输入到所述电路中以产生用于该轮的所述附加周期的输出值,并且使得将用于该轮的所述附加周期的输出值和来自所述向量寄存器的除了所述多个相邻元素之外的元素的值以完全对齐的状态存储到所述向量寄存器中以用于所述附加周期之后的(例如,紧接着的)下一个周期。所述控制电路可以将用于该轮的附加周期的值从所述向量寄存器的第一端处的多个相邻元素输入到所述电路中以产生用于该轮的所述附加周期的输出值,使得将来自用于该轮的所述附加周期的输出值的子集的值和来自所述向量寄存器的除了所述多个相邻元素之外的元素的值以完全对齐的状态存储到所述向量寄存器的第一端处的相邻元素中以用于所述附加周期之后的下一个周期,并且使得将除了所述子集之外的值以平行对齐的状态存储到所述向量寄存器的除了第一端之外的元素中以用于所述附加周期之后的下一个周期。

在另一实施例中,一种方法,包括:将一轮加密操作的输入向量存储在向量寄存器中;利用电路通过以下方式对所述输入向量执行该轮的一部分:在所述电路的第一数据路径中,所述第一数据路径包括耦合到来自所述向量寄存器的第一输入和来自所述向量寄存器的第二输入的第一模加法器以及耦合到第一模加法器和来自所述向量寄存器的所述电路的第二数据路径的第二模加法器,利用第一模加法器将源于来自所述输入向量的第一输入的第一值和源于来自所述向量寄存器的第二输入的第二值相加以产生第一中间结果,以及利用第二模加法器将第一中间结果和来自第二数据路径的第三中间结果相加以产生第一结果,以及在所述电路的第二数据路径中,所述第二数据路径包括耦合到第二输入和来自所述向量寄存器的所述电路的第三数据路径的第一逻辑异或电路、耦合到第一逻辑异或电路的第一旋转电路、耦合到第一旋转电路和第三数据路径的第二逻辑异或电路、以及耦合到第二逻辑异或电路的第二旋转电路,利用第一逻辑异或电路对源于来自所述向量寄存器的第二输入的第二值和来自第三数据路径的第三结果进行逻辑异或操作以产生第二中间结果,利用第一旋转电路根据一个或多个控制值旋转第二中间结果以产生第三中间结果,对第三中间结果和来自第三数据路径的第四结果进行逻辑异或操作以产生第五中间结果,以及利用第二旋转电路根据一个或多个控制值旋转第五中间结果以产生第二结果;以及将针对所述部分的来自第一数据路径的第一结果和针对所述部分的来自第二数据路径的第二结果存储到所述向量寄存器中。存储输入向量可以包括在初始周期中将第一常数值存储在第一元素中以及将第二常数值存储在与第一元素相邻的第二元素中,并且还包括切换耦合在所述向量寄存器与所述电路之间的多路复用器,以源发第一常数值或第二常数值作为在所述初始周期中到所述电路的输入。存储输入向量可以包括在初始周期中存储第一常数值、第一密钥值、第二密钥值和第一块计数器值,其被存储在所述输入向量的相邻元素中,并且还包括发送第一常数值、第一密钥值、第二密钥值和第一块计数器值作为在所述初始周期中到所述电路中的输入。发送可以包括在所述初始周期中将第一常数值作为第一值发送到来自所述向量寄存器的第一输入以用于所述电路的第一数据路径以及将第一密钥值作为第二值发送到来自所述向量寄存器的第二输入以用于所述电路的第二数据路径。存储输入向量可以包括在初始周期中将第一常数值、第一密钥值、第二密钥值和第一块计数器值存储在所述向量寄存器的第一端处的相邻元素中,发送可以包括将第一常数值、第一密钥值、第二密钥值和第一块计数器值发送到所述电路中以产生包括第一结果和第二结果的输出值,并且将所述输出值存储到所述向量寄存器的第二端的相邻元素中以用于该轮的下一个周期。执行可以包括将所述初始周期的除了第一常数值、第一密钥值、第二密钥值和第一块计数器值之外的输入向量移位到开始于所述向量寄存器的第一端处的元素以用于该轮的下一个周期,并且将所述输出值存储在所述向量寄存器的第二端的相邻元素中以用于该轮的下一个周期。所述方法可以包括将用于该轮的附加周期的输入值从所述向量寄存器的第一端处的多个相邻元素发送到所述电路中以产生用于该轮的所述附加周期的输出值,并且将用于该轮的所述附加周期的输出值和来自所述向量寄存器的除了所述多个相邻元素之外的元素的值以完全对齐的状态存储到所述向量寄存器中以用于所述附加周期之后的下一个周期。所述方法可以包括将用于该轮的附加周期的输入值从所述向量寄存器的第一端处的多个相邻元素发送到所述电路中以产生用于该轮的所述附加周期的输出值,将来自用于该轮的所述附加周期的输出值的子集的值和来自所述向量寄存器的除了所述多个相邻元素之外的元素的值以完全对齐的状态存储到所述向量寄存器的第一端处的相邻元素中以用于所述附加周期之后的下一个周期,并且将除了所述子集之外的值以平行对齐的状态存储到所述向量寄存器的除了第一端之外的元素中以用于所述附加周期之后的下一个周期。

在又一实施例中,一种系统包括:硬件处理器,其要执行线程并卸载加密操作;向量寄存器,其要存储一轮所述加密操作的输入向量;以及硬件加速器,其包括:电路,其包括:第一数据路径,其包括耦合到来自所述向量寄存器的第一输入和来自所述向量寄存器的第二输入的第一模加法器以及耦合到第一模加法器和来自所述向量寄存器的第二数据路径的第二模加法器,以及第二数据路径,其包括耦合到第二输入和来自所述向量寄存器的第三数据路径的第一逻辑异或电路、耦合到第一逻辑异或电路的第一旋转电路、耦合到第一旋转电路和第三数据路径的第二逻辑异或电路、以及耦合到第二逻辑异或电路的第二旋转电路,以及控制电路,其要使第一数据路径的第一模加法器和第二模加法器以及第二数据路径的第一逻辑异或电路、第二逻辑异或电路、第一旋转电路和第二旋转电路根据一个或多个控制值来执行该轮的一部分,并且将针对所述部分的来自第一数据路径的第一结果和针对所述部分的来自第二数据路径的第二结果存储到所述向量寄存器中。初始周期中的输入向量可以包括(例如,可以是)存储在第一元素中的第一常数值和存储在与第一元素相邻的第二元素中的第二常数值,并且所述控制电路可以控制耦合在所述向量寄存器与所述电路之间的多路复用器,以源发第一常数值或第二常数值作为在所述初始周期中到所述电路的输入。初始周期中的输入向量可以是存储在相邻元素中的第一常数值、第一密钥值、第二密钥值和第一块计数器值,并且所述控制电路可以提供第一常数值、第一密钥值、第二密钥值和第一块计数器值作为在所述初始周期中到所述电路中的输入。在所述初始周期中,所述控制电路可以将第一常数值提供给来自所述向量寄存器的第一输入以用于所述电路的第一数据路径,并将第一密钥值提供给来自所述向量寄存器的第二输入以用于所述电路的第二数据路径。在所述初始周期中,第一常数值、第一密钥值、第二密钥值和第一块计数器值可以被存储在所述向量寄存器的第一端处的相邻元素中,并且所述控制电路可以将第一常数值、第一密钥值、第二密钥值和第一块计数器值输入到所述电路中以产生输出值,并将所述输出值存储到所述向量寄存器的第二端的相邻元素中以用于该轮的下一个周期。所述控制电路可以将所述初始周期的除了第一常数值、第一密钥值、第二密钥值和第一块计数器值之外的输入向量移位到开始于所述向量寄存器的第一端处的元素以用于该轮的下一个周期,并且所述输出值被存储在所述向量寄存器的第二端的相邻元素中以用于该轮的下一个周期。所述控制电路可以将用于该轮的附加周期的值从所述向量寄存器的第一端处的多个相邻元素输入到所述电路中以产生用于该轮的所述附加周期的输出值,并且使得将用于该轮的所述附加周期的输出值和来自所述向量寄存器的除了所述多个相邻元素之外的元素的值以完全对齐的状态存储到所述向量寄存器中以用于所述附加周期之后的下一个周期。所述控制电路可以将用于该轮的附加周期的值从所述向量寄存器的第一端处的多个相邻元素输入到所述电路中以产生用于该轮的所述附加周期的输出值,使得将来自用于该轮的所述附加周期的输出值的子集的值和来自所述向量寄存器的除了所述多个相邻元素之外的元素的值以完全对齐的状态存储到所述向量寄存器的第一端处的相邻元素中以用于所述附加周期之后的下一个周期,并且使得将除了所述子集之外的值以平行对齐的状态存储到所述向量寄存器的除了第一端之外的元素中以用于所述附加周期之后的下一个周期。

在另一实施例中,一种装置包括:向量寄存器,其要存储一轮加密操作的输入向量;电路,其包括:第一数据路径,其包括耦合到来自所述向量寄存器的第一输入和来自所述向量寄存器的第二输入的第一模加法器以及耦合到第一模加法器和来自所述向量寄存器的第二数据路径的第二模加法器,以及第二数据路径,其包括耦合到第二输入和来自所述向量寄存器的第三数据路径的第一逻辑异或电路、耦合到第一逻辑异或电路的第一旋转电路、耦合到第一旋转电路和第三数据路径的第二逻辑异或电路、以及耦合到第二逻辑异或电路的第二旋转电路;以及要进行以下操作的部件:使第一数据路径的第一模加法器和第二模加法器以及第二数据路径的第一逻辑异或电路、第二逻辑异或电路、第一旋转电路和第二旋转电路执行该轮的一部分,并且将针对所述部分的来自第一数据路径的第一结果和针对所述部分的来自第二数据路径的第二结果存储到所述向量寄存器中。

在又一实施例中,一种装置包括存储代码的数据存储设备,所述代码在被硬件处理器执行时使得所述硬件处理器实行本文中公开的任何方法。一种装置可以如具体实施方式中描述的那样。一种方法可以如具体实施方式中描述的那样。

指令集可以包括一个或多个指令格式。给定指令格式可以定义用于除其他之外指定要执行的操作(例如操作码)和要对其执行操作的(一个或多个)操作数的各个字段(例如位的数量、位的位置)和/或(一个或多个)其他数据字段(例如掩码)。一些指令格式通过定义指令模板(或子格式)被进一步分解。例如,给定指令格式的指令模板可以被定义成具有指令格式的字段的不同子集(所包括的字段通常是以相同的顺序,但是因为包括了较少的字段,所以至少一些具有不同的位位置)和/或被定义成具有以不同方式解释的给定字段。因此,isa的每个指令使用给定指令格式(并且如果被定义的话,以该指令格式的指令模板中的给定的一个)来表示,并且包括用于指定操作和操作数的字段。例如,示例性add指令具有特定的操作码和指令格式,该指令格式包括用于指定操作码的操作码字段和用于选择操作数(源1/目的地和源2)的操作数字段;并且该add指令在指令流中的出现将在选择特定操作数的操作数字段中具有特定内容。已经发布和/或公布了称为高级向量扩展(advancedvectorextensions,avx)(avx1和avx2)并且使用向量扩展(vex)编码方案的一组simd扩展(例如,参见2018年1月的英特尔®64和ia-32架构软件开发人员手册;并且参见2018年1月的英特尔®架构指令集扩展编程参考)。

示例性指令格式

可以以不同格式来具体化本文描述的(一个或多个)指令的实施例。另外,下面详述示例性系统、架构和流水线。所述(一个或多个)指令的实施例可以在这样的系统、架构和流水线上执行,但是不限于详述的那些。

通用向量友好指令格式

向量友好指令格式是适合于向量指令的指令格式(例如存在专用于向量操作的某些字段)。虽然描述了其中通过向量友好指令格式来支持向量和标量操作二者的实施例,但是替换实施例仅使用向量友好指令格式的向量操作。

图18a-18b是例示根据本公开实施例的通用向量友好指令格式及其指令模板的框图。图18a是例示根据本公开实施例的通用向量友好指令格式及其a类指令模板的框图;而图18b是例示根据本公开实施例的通用向量友好指令格式及其b类指令模板的框图。具体来说,通用向量友好指令格式1800,为其定义了a类和b类指令模板,所述a类和b类指令模板二者都包括无存储器访问1805指令模板和存储器访问1820指令模板。在向量友好指令格式的上下文中的术语“通用”指的是未绑定到任何特定指令集的指令格式。

虽然将描述本公开的以下实施例,即在所述实施例中向量友好指令格式支持以下:具有32位(4字节)或64位(8字节)数据元素宽度(或大小)的64字节向量操作数长度(或大小)(并且因此,64字节向量由16个双字大小的元素或替换地由8个四字大小的元素组成);具有16位(2字节)或8位(1字节)数据元素宽度(或大小)的64字节向量操作数长度(或大小);具有32位(4字节)、64位(8字节)、16位(2字节)或8位(1字节)数据元素宽度(或大小)的32字节向量操作数长度(或大小);以及具有32位(4字节)、64位(8字节)、16位(2字节)或8位(1字节)数据元素宽度(或大小)的16字节向量操作数长度(或大小);但是替换实施例可以支持具有更多、更少或不同数据元素宽度(例如,128位(16字节)数据元素宽度)的更多、更少和/或不同的向量操作数大小(例如,256字节向量操作数)。

图18a中的a类指令模板包括:1)在无存储器访问1805指令模板内,示出无存储器访问、全舍入控制类型操作1810指令模板和无存储器访问、数据变换类型操作1815指令模板;以及2)在存储器访问1820指令模板内,示出存储器访问、临时1825指令模板和存储器访问、非临时1830指令模板。图18b中的b类指令模板包括:1)在无存储器访问1805指令模板内,示出无存储器访问、写掩码控制、部分舍入控制类型操作1812指令模板和无存储器访问、写掩码控制、vsize类型操作1817指令模板;以及2)在存储器访问1820指令模板内,示出存储器访问、写掩码控制1827指令模板。

该通用向量友好指令格式1800包括下文按图18a-18b中例示的顺序列出的以下字段。

格式字段1840——该字段中的特定值(指令格式标识符值)唯一标识向量友好指令格式以及因此的指令以向量友好指令格式在指令流中的出现。照此,该字段在以下意义上是可选的,即该字段对于仅具有通用向量友好指令格式的指令集来说是不需要的。

基础操作字段1842——其内容区分不同的基础操作。

寄存器索引字段1844——其内容直接地或通过地址生成来指定源和目的地操作数的位置(无论它们是在寄存器中还是在存储器中)。这些包括足以从pxq(例如,32x512、16x128、32x1024、64x1024)寄存器文件选择n个寄存器的位数。虽然在一个实施例中n可以是高达3个源和一个目的地寄存器,但是替换实施例可以支持更多或更少的源和目的地寄存器(例如,可以支持高达两个源,其中这些源中的一个也充当目的地;可以支持高达三个源,其中这些源中的一个也充当目的地;可以支持高达两个源和一个目的地)。

修饰符字段1846——其内容将指定存储器访问的通用向量指令格式的指令的出现与不指定存储器访问的那些指令的出现进行区分;也就是说,在无存储器访问1805指令模板和存储器访问1820指令模板之间进行区分。存储器访问操作读取和/或写入存储器层级(在一些情况下使用寄存器中的值来指定源和/或目的地地址),而非存储器访问操作不读取和/或写入存储器层级(例如,源和目的地是寄存器)。虽然在一个实施例中,该字段也在用于执行存储器地址计算的三种不同方式之间进行选择,但替换实施例可以支持用于执行存储器地址计算的更多、更少或不同的方式。

扩增操作字段1850——其内容区分除了基础操作之外要执行多个不同操作中的哪一个。该字段是上下文特定的。在本公开的一个实施例中,该字段被划分成类别字段1868、α字段1852、和β字段1854。扩增操作字段1850允许在单个指令中而不是在2个、3个或4个指令中执行共同的操作组。

比例字段1860——其内容允许对于存储器地址生成(例如,对于使用2比例*索引+基址的地址生成)的索引字段内容进行缩放。

位移字段1862a——其内容被用作存储器地址生成的一部分(例如,对于使用2比例*索引+基址+位移的地址生成)。

位移因数字段1862b(注意,位移字段1862a直接在位移因数字段1862b上的并置指示一个或另一个被使用)——其内容被用作地址生成的一部分;它指定要按存储器访问的大小(n)进行缩放的位移因数,其中n是存储器访问中的字节数(例如,对于使用2比例*索引+基址+经缩放的位移的地址生成)。忽略冗余低阶位并且因此使位移因数字段的内容乘以存储器操作数总大小(n)以便生成要在计算有效地址中使用的最终位移。由处理器硬件在运行时基于全操作码字段1874(在本文中稍后描述)和数据操纵字段1854c来确定n的值。位移字段1862a和位移因数字段1862b在以下意义上是可选的,即它们不被用于无存储器访问1805指令模板,和/或不同实施例可以实现两个中的仅一个或者两个都不实现。

数据元素宽度字段1864——其内容区分要使用多个数据元素宽度中的哪一个(在一些实施例中针对所有指令;在其他实施例中仅针对指令中的一些)。该字段在以下意义上是可选的,即如果仅支持一个数据元素宽度和/或使用操作码的一些方面来支持数据元素宽度则该字段是不需要的。

写掩码字段1870——其内容基于每数据元素位置来控制目的地向量操作数中的该数据元素位置是否反映基础操作和扩增操作的结果。a类指令模板支持归并写掩蔽,而b类指令模板支持归并写掩蔽和归零写掩蔽二者。当归并时,向量掩码允许目的地中的任何元素集受保护以免在(由基础操作和扩增操作指定的)任何操作的执行期间更新;在另一实施例中,保留目的地的每个元素的旧值,其中对应的掩码位具有0。相比之下,当归零时,向量掩码允许目的地中的任何元素集在(由基础操作和扩增操作指定的)任何操作的执行期间被归零;在一个实施例中,当对应的掩码位具有0值时,目的地的元素被设置成0。该功能性的子集是用于控制被执行的操作的向量长度的能力(即被修改的元素的跨距,从第一个到最后一个);然而,被修改的元素不一定是连续的。因此,写掩码字段1870允许部分向量操作,包括加载、存储、算术、逻辑等等。虽然描述了其中写掩码字段1870的内容选择包含要被使用的写掩码的多个写掩码寄存器之一(并且因此写掩码字段1870的内容间接地标识要执行的该掩蔽)的本公开的实施例,但是替换实施例替代地或附加地允许掩码写字段1870的内容直接指定要执行的掩蔽。

立即数字段1872——其内容允许对立即数的指定。该字段在以下意义上是可选的,即它在不支持立即数的通用向量友好格式的实现中是不存在的并且它在不使用立即数的指令中是不存在的。

类别字段1868——其内容在不同类别的指令之间进行区分。参考图18a-b,该字段的内容在a类和b类指令之间进行选择。在图18a-b中,使用圆角方形来指示在字段中存在特定值(例如,在图18a-b中分别对于类别字段1868的a类1868a和b类1868b)。

类指令模板

在a类非存储器访问1805指令模板的情况下,α字段1852被解释为rs字段1852a,其内容区分要执行不同扩增操作类型中的哪一个(例如,为无存储器访问、舍入类型操作1810和无存储器访问、数据变换类型操作1815指令模板分别指定舍入1852a.1和数据变换1852a.2),而β字段1854区分要执行所指定的类型的操作中的哪一个。在无存储器访问1805指令模板中,不存在比例字段1860、位移字段1862a和位移比例字段1862b。

无存储器访问指令模板——全舍入控制类型操作

在无存储器访问、全舍入控制类型操作1810指令模板中,β字段1854被解释为舍入控制字段1854a,其(一个或多个)内容提供静态舍入。虽然在本公开的所描述的实施例中,舍入控制字段1854a包括抑制所有浮点异常(sae)字段1856和舍入操作控制字段1858,但是替换实施例可以支持可以将这两个概念编码到同一字段中或者仅具有这些概念/字段中的一个或另一个(例如,可以仅具有舍入操作控制字段1858)。

sae字段1856——其内容区分是否禁用异常事件报告;当sae字段1856的内容指示启用抑制时,给定指令不报告任何种类的浮点异常标志并且不引发任何浮点异常处理程序。

舍入操作控制字段1858——其内容区分要执行一组舍入操作中的哪一个(例如,向上舍入、向下舍入、向零舍入和就近舍入)。因此,舍入操作控制字段1858允许基于每个指令改变舍入模式。在其中处理器包括用于指定舍入模式的控制寄存器的本公开的一个实施例中,舍入操作控制字段1850的内容覆写该寄存器值。

无存储器访问指令模板——数据变换类型操作

在无存储器访问数据变换类型操作1815指令模板中,β字段1854被解释为数据变换字段1854b,其内容区分要执行多个数据变换中的哪一个(例如,无数据变换、拌和、广播)。

在a类存储器访问1820指令模板的情况下,α字段1852被解释为驱逐提示字段1852b,其内容区分要使用驱逐提示中的哪一个(在图18a中,为存储器访问、临时1825指令模板和存储器访问、非临时1830指令模板分别指定临时1852b.1和非临时1852b.2),而β字段1854被解释为数据操纵字段1854c,其内容区分要执行多个数据操纵操作(也被称为基元)中的哪一个(例如,无操纵;广播;源的向上转换;以及目的地的向下转换)。存储器访问1820指令模板包括比例字段1860、以及可选地位移字段1862a或位移比例字段1862b。

向量存储器指令在转换支持的情况下执行从存储器中的向量加载和至存储器的向量存储。就规则的向量指令来说,向量存储器指令以按数据元素的方式从存储器/向存储器传递数据,其中实际上传递的元素由被选择为写掩码的向量掩码的内容来决定。

存储器访问指令模板——临时

临时数据是可能很快地被再次使用以便受益于高速缓存的数据。然而,这是提示,并且不同的处理器可以以不同的方式来实现它,包括完全地忽略该提示。

存储器访问指令模板——非临时

非临时数据是不太可能很快地被再次使用以受益于第一级高速缓存中的高速缓存并且应被给予驱逐优先级的数据。然而,这是提示,并且不同的处理器可以以不同的方式来实现它,包括完全地忽略该提示。

类指令模板

在b类指令模板的情况下,α字段1852被解释为写掩码控制(z)字段1852c,其内容区分由写掩码字段1870控制的写掩蔽应当是归并还是归零。

在b类非存储器访问1805指令模板的情况下,β字段1854的一部分被解释为rl字段1857a,其内容区分要执行不同扩增操作类型中的哪一个(例如,为无存储器访问、写掩码控制、部分舍入控制类型操作1812指令模板和无存储器访问、写掩码控制、vsize类型操作1817指令模板分别指定舍入1857a.1和向量长度(vsize)1857a.2),而β字段1854的其余部分区分要执行所指定的类型的操作中的哪一个。在无存储器访问1805指令模板中,不存在比例字段1860、位移字段1862a和位移比例字段1862b。

在无存储器访问、写掩码控制、部分舍入控制类型操作1810指令模板中,β字段1854的其余部分被解释为舍入操作字段1859a并且禁用异常事件报告(给定指令不报告任何种类的浮点异常标志并且不引发任何浮点异常处理程序)。

舍入操作控制字段1859a——正如舍入操作控制字段1858,其内容区分要执行一组舍入操作中的哪一个(例如,向上舍入、向下舍入、向零舍入和就近舍入)。因此,舍入操作控制字段1859a允许基于每个指令改变舍入模式。在其中处理器包括用于指定舍入模式的控制寄存器的本公开的一个实施例中,舍入操作控制字段1850的内容覆写该寄存器值。

在无存储器访问、写掩码控制、vsize类型操作1817指令模板中,β字段1854的其余部分被解释为向量长度字段1859b,其内容区分要执行多个数据向量长度中的哪一个(例如,128、256、或512字节)。

在b类存储器访问1820指令模板的情况下,β字段1854的部分被解释为广播字段1857b,其内容区分是否要执行广播类型数据操纵操作,而β字段1854的其余部分被解释成向量长度字段1859b。存储器访问1820指令模板包括比例字段1860、以及可选地位移字段1862a或位移比例字段1862b。

关于通用向量友好指令格式1800,示出包括格式字段1840、基础操作字段1842和数据元素宽度字段1864的全操作码字段1874。虽然示出其中全操作码字段1874包括所有这些字段的一个实施例,但是在不支持所有它们的实施例中,全操作码字段1874包括少于所有这些字段。全操作码字段1874提供操作代码(操作码)。

扩增操作字段1850、数据元素宽度字段1864和写掩码字段1870允许以通用向量友好指令格式基于每个指令来指定这些特征。

写掩码字段和数据元素宽度字段的组合创建类型化指令,因为它们允许基于不同的数据元素宽度来应用掩码。

在a类和b类内找到的各种指令模板在不同情形下是有益的。在本公开的一些实施例中,不同处理器或处理器内的不同核可以仅支持a类、仅支持b类或支持两个类别。例如,意图用于通用计算的高性能通用无序核可以仅支持b类、意图主要用于图形和/或科学(吞吐量)计算的核可以仅支持a类,并且意图用于二者的核可以支持二者(当然,具有来自两个类别的模板和指令、但不是来自两个类别的所有模板和指令的某一混合的核在本公开的范围内)。而且,单个处理器可以包括多个核,所述核的全部都支持相同的类别或者其中不同的核支持不同类别。例如,在具有单独图形和通用核的处理器中,意图主要用于图形和/或科学计算的图形核中的一个可以仅支持a类,而通用核中的一个或多个可以是具有意图用于仅支持b类通用计算的无序执行和寄存器重命名的高性能通用核。不具有单独图形核的另一处理器可以包括支持a类和b类二者的一个或多个通用有序或无序核。当然,来自一个类别的特征在本公开的不同实施例中也可以在另一类别中被实现。以高级语言写的程序将会被安置(例如,仅仅及时编译或静态编译)成多种不同的可执行形式,其包括:1)仅具有为了执行由目标处理器支持的(一个或多个)类别的指令的形式;或2)具有使用所有类别的指令的不同组合写的替换例程且具有选择例程用于基于由当前正执行代码的处理器支持的指令来执行的控制流代码的形式。

示例性特定向量友好指令格式

图19a是例示根据本公开实施例的示例性特定向量友好指令格式的框图。图19a示出特定向量友好指令格式1900,其在该特定向量友好指令格式指定位置、大小、解释和字段顺序、以及用于那些字段中的一些的值的意义上是特定的。该特定向量友好指令格式1900可以被用于扩展x86指令集,并且因此所述字段中的一些与在现有x86指令集以及其扩展(例如,avx)中使用的那些是类似的或相同的。该格式保持与前缀编码字段、实操作码字节字段、modr/m字段、sib字段、位移字段和具有扩展的现有x86指令集的立即数字段一致。例示了来自图18的字段,其中来自图19a的字段中映射成所述来自图18的字段。

应当理解的是,尽管为了例示的目的在通用向量友好指令格式1800的上下文中参考特定向量友好指令格式1900描述了本公开的实施例,但是本公开不限于该特定向量友好指令格式1900,除了被声明的地方之外。例如,该通用向量友好指令格式1800预期对于各种字段的各种各样的可能大小,而特定向量友好指令格式1900被示出为具有特定大小的字段。通过特定示例,尽管数据元素宽度字段1864被例示为特定向量友好指令格式1900中的一位字段,但是本公开不限于此(也就是说,该通用向量友好指令格式1800预期数据元素宽度字段1864的其他大小)。

该通用向量友好指令格式1800包括下文按图19a中例示的顺序列出的以下字段。

evex前缀(字节0-3)1902——其是以四字节形式编码的。

格式字段1840(evex字节0,位[7:0])——第一字节(evex字节0)是格式字段1840并且它包含0x62(在本公开的一个实施例中被用于区分向量友好指令格式的唯一值)。

第二至第四字节(evex字节1-3)包括提供特定能力的多个位字段。

rex字段1905(evex字节1,位[7-5])——由evex.r位字段(evex字节1,位[7]-r)、evex.x位字段(evex字节1,位[6]-x)和1857bex字节1,位[5]-b)组成。evex.r、evex.x、和evex.b位字段提供与对应的vex位字段相同的功能性,并且使用补充1的形式进行编码,即zmm0被编码为1111b,zmm15被编码为0000b。如本领域中已知的,指令的其他字段对寄存器索引的下三个位进行编码(rrr、xxx和bbb),使得可以通过添加evex.r、evex.x和evex.b形成rrrr、xxxx和bbbb。

rex'字段1910——这是rex'字段1910的第一部分并且是用于对扩展的32寄存器集的上16或下16编码的evex.r'位字段(evex字节1,位[4]-r')。在本公开的一个实施例中,以位倒置格式存储该位连同如下文指示的其他位以便(以众所周知的x8632位模式)与bound指令区分,所述bound指令的实操作码字节是62,但是在(下文描述的)modr/m字段中不接受mod字段中的11的值;本公开的替换实施例不以倒置格式来存储该位以及下文指示的其他位。为1的值被用于对下16寄存器编码。换言之,通过组合evex.r'、evex.r和来自其他字段的其他rrr来形成r'rrrr。

操作码映射字段1915(evex字节1,位[3:0]-mmmm)——其内容对隐含前导操作码字节(0f、0f38或0f3)进行编码。

数据元素宽度字段1864(evex字节2,位[7]-w)——通过标号evex.w表示。evex.w被用于定义数据类型的粒度(大小)(32位数据元素或者64位数据元素)。

evex.vvvv1920(evex字节2,位[6:3]-vvvv)——evex.vvvv的作用可以包括以下内容:1)evex.vvvv对以倒置(补充1)形式指定的第一源寄存器操作数进行编码并且对于具有2个或更多源操作数的指令是有效的;2)evex.vvvv对以补充1形式为某些向量移位指定的目的地寄存器操作数进行编码;或者3)evex.vvvv不对任何操作数进行编码,字段被保留并且应当包含1111b。因此,evex.vvvv字段1920对以倒置(补充1)形式存储的第一源寄存器指定符的4个低阶位编码。取决于指令,使用额外的不同evex位字段来将指定符大小扩展至32个寄存器。

evex.u1868类别字段(evex字节2,位[2]-u)——如果evex.u=0,则它指示a类或者evex.u0;如果evex.u=1,则它指示b类或者evex.u1。

前缀编码字段1925(evex字节2,位[1:0]-pp)——提供对于基础操作字段的附加位。除了为处于evex前缀格式的旧有sse指令提供支持之外,这还具有压缩simd前缀的益处(并非需要一个字节来表示simd前缀,而是evex前缀仅需要2个位)。在一个实施例中,为了支持以旧有格式和以evex前缀格式二者使用simd前缀(66h、f2h、f3h)的旧有sse指令,将这些旧有simd前缀编码成simd前缀编码字段;并且在被提供给解码器的pla之前在运行时间被扩展成旧有simd前缀(所以pla可以在没有修改的情况下执行这些旧有指令的旧有格式和evex格式二者)。尽管较新的指令能够将evex前缀编码字段的内容直接用作操作码扩展,但是某些实施例为了一致性以类似的方式扩充而允许通过这些旧有simd前缀来指定不同含义。替换实施例可以重新设计pla以支持2位simd前缀编码,并且因此不需要扩充。

α字段1852(evex字节3,位[7]-eh;也被称为evex.eh、evex.rs、evex.rl、evex.写掩码控制,和evex.n;也用α例示)——如先前描述的那样,该字段是上下文特定的。

β字段1854(evex字节3,位[6:4]-sss,也被称为evex.s2-0、evex.r2-0、evex.rr1、evex.ll0、evex.llb;也用βββ例示)——如先前描述的那样,该字段是上下文特定的。

rex'字段1910——这是rex'字段的其余部分并且是可以被用于对扩展的32寄存器集的上16或下16进行编码的evex.v'位字段(evex字节3,位[3]——v')。以位倒置格式来存储该位。使用值1来对下16寄存器进行编码。换言之,通过组合evex.v'、evex.vvvv来形成v'vvvv。

写掩码字段1870(evex字节3,位[2:0]-kkk)——如先前描述的,其内容指定寄存器在写掩码寄存器中的索引。在本公开的一个实施例中,特定值evex.kkk=000具有暗示没有写掩码被用于特定指令的特殊行为(这可以以各种各样的方式(包括使用硬接线至所有的一的写掩码或绕过掩蔽硬件的硬件)来实现)。

实操作码字段1930(字节4)也被称为操作码字节。在该字段中指定操作码的部分。

modr/m字段1940(字节5)包括mod字段1942、reg字段1944、和r/m字段1946。如先前描述的,mod字段1942的内容在存储器访问和非存储器访问操作之间进行区分。reg字段1944的作用可以被总结成两个情形:对目的地寄存器操作数或源寄存器操作数进行编码,或者被视为操作码扩展并且不被用于对任何指令操作数进行编码。r/m字段1946的作用可以包括以下内容:对参考存储器地址的指令操作数进行编码,或对目的地寄存器操作数或源寄存器操作数进行编码。

比例、索引、基址(sib)字节(字节6)——如先前描述的,比例字段1850的内容被用于存储器地址生成。sib.xxx1954和sib.bbb1956——先前已经关于寄存器索引xxxx和bbbb涉及了这些字段的内容。

位移字段1862a(字节7-10)——当mod字段1942包含10时,字节7-10是位移字段1862a,并且它与旧有的32位位移(disp32)以相同方式工作并且以字节粒度工作。

位移因数字段1862b(字节7)——当mod字段1942包含01时,字节7是位移因数字段1862b。该字段的位置是与以字节粒度工作的旧有x86指令集8位位移(disp8)的位置相同的位置。因为disp8是符号扩展的,所以它可以仅在-128和127字节偏移之间寻址;就64字节高速缓存行来说,disp8使用可以被设置成仅四个真正有用的值-128、-64、0和64的8个位;因为常常需要更大的范围,所以使用disp32;然而,disp32需要4个字节。与disp8和disp32相比,位移因数字段1862b是disp8的重新解释;当使用位移因数字段1862b时,通过乘以存储器操作数访问的大小(n)的位移因数字段的内容来确定实际位移。这种类型的位移被称为disp8*n。这降低平均指令长度(被用于位移但具有大得多的范围的单个字节)。这样的经压缩的位移是基于以下假设:有效位移是存储器访问的粒度的倍数,并且因此不需要对地址偏移的冗余低阶位编码。换言之,该位移因数字段1862b代替旧有x86指令集8位位移。因此,以与x86指令集8位位移相同的方式来对位移因数字段1862b编码(所以modrm/sib编码规则没有变化),仅有的例外是使disp8过载成disp8*n。换言之,在编码规则或编码长度中不存在变化,但是仅在通过硬件对位移值的解释上存在变化(这需要使位移缩放存储器操作数的大小以获得按字节的地址偏移)。立即数字段1872如先前描述的那样操作。

全操作码字段

图19b是例示根据本公开的一个实施例的构成全操作码字段1874的特定向量友好指令格式1900的字段的框图。具体来说,全操作码字段1874包括格式字段1840、基础操作字段1842和数据元素宽度(w)字段1864。该基础操作字段1842包括前缀编码字段1925、操作码映射字段1915和实操作码字段1930。

寄存器索引字段

图19c是例示根据本公开的一个实施例的构成寄存器索引字段1844的特定向量友好指令格式1900的字段的框图。具体来说,寄存器索引字段1844包括rex字段1905、rex'字段1910、modr/m.reg字段1944、modr/m.r/m字段1946、vvvv字段1920、xxx字段1954和bbb字段1956。

扩增操作字段

图19d是例示根据本公开的一个实施例的构成扩增操作字段1850的特定向量友好指令格式1900的字段的框图。当类别(u)字段1868包含0时,它意味着evex.u0(a类1868a);当它包含1时,它意味着evex.u1(b类1868b)。当u=0并且mod字段1942包含11(意味着无存储器访问操作)时,α字段1852(evex字节3,位[7]-eh)被解释为rs字段1852a。当rs字段1852a包含a1(舍入1852a.1)时,β字段1854(evex字节3,位[6:4]-sss)被解释为舍入控制字段1854a。该舍入控制字段1854a包括一位sae字段1856和两位舍入操作字段1858。当rs字段1852a包含0(数据变换1852a.2)时,β字段1854(evex字节3,位[6:4]-sss)被解释为三位数据变换字段1854b。当u=0且mod字段1942包含00、01或10(意味着存储器访问操作)时,β字段1852(evex字节3,位[7]-eh)被解释为驱逐提示(eh)字段1852b,并且β字段1854(evex字节3,位[6:4]-sss)被解释为三位数据操纵字段1854c。

当u=1时,α字段1852(evex字节3,位[7]-eh)被解释为写掩码控制(z)字段1852c。当u=1并且mod字段1942包含11(意味着无存储器访问操作)时,β字段1854的一部分(evex字节3,位[4]-s0)被解释为rl字段1857a;当它包含1(舍入1857a.1)时,β字段1854的其余部分(evex字节3,位[6-5]-s2-1)被解释为舍入操作字段1859a,而当rl字段1857a包含0(vsize1857.a2)时,β字段1854的其余部分(evex字节3,位[6-5]-s2-1)被解释为向量长度字段1859b(evex字节3,位[6-5]-l1-0)。当u=1且mod字段1942包含00、01或10(意味着存储器访问操作)时,β字段1854(evex字节3,位[6:4]-sss)被解释为向量长度字段1859b(evex字节3,位[6:5]-l1-0)和广播字段1857b(evex字节3,位[4]-b)。

示例性寄存器架构

图20是根据本公开的一个实施例的寄存器架构2000的框图。在所例示的实施例中,存在具有512位宽的32个向量寄存器2010;这些寄存器被称为zmm0至zmm31。下16个zmm寄存器的低阶256位覆盖在寄存器ymm0-16上。下16个zmm寄存器的低阶128位(ymm寄存器的低阶128位)覆盖在寄存器xmm0-15上。如在下面的表中例示的那样,该特定向量友好指令格式1900在这些覆盖的寄存器文件上操作:

换言之,该向量长度字段1859b在最大长度与一个或多个其他较短长度之间选择,其中每个这样的较短长度是在前长度的长度的一半;并且不具有向量长度字段1859b的指令模板在最大向量长度上操作。此外,在一个实施例中,特定向量友好指令格式1900的b类指令模板对打包或标量单/双精度浮点数据以及打包或标量整数数据进行操作。标量操作是在zmm/ymm/xmm寄存器中的最低阶数据元素位置上执行的操作;根据实施例,较高阶数据元素位置与它们在指令之前相同地在左侧或者被归零。

写掩码寄存器2015——在所例示的实施例中,存在8个写掩码寄存器(k0至k7),每个在大小上都是64位。在替换实施例中,写掩码寄存器2015在大小上是16位。如先前描述的,在本公开的一个实施例中,该向量掩码寄存器k0不能被用作写掩码;当将会正常指示k0的编码被用于写掩码时,它选择0xffff的硬接线写掩码,有效地禁用对于该指令的写掩蔽。

通用寄存器2025——在所例示的实施例中,存在连同现有的x86寻址模式一起用于对存储器操作数寻址的十六个64位通用寄存器。通过名称rax、rbx、rcx、rdx、rbp、rsi、rdi、rsp和r8至r15来参考这些寄存器。

标量浮点堆栈寄存器文件(x87堆栈)2045(其别名为mmx打包整数平面寄存器文件2050)——在所例示的实施例中,该x87堆栈是被用于使用x87指令集扩展来对32/64/80位浮点数据执行标量浮点操作的八元素堆栈;而mmx寄存器被用于对64位打包整数数据执行操作以及对于在mmx和xmm寄存器之间执行的一些操作保持操作数。

本公开的替换实施例可以使用更宽或更窄的寄存器。另外,本公开的替换实施例可以使用更多、更少或不同的寄存器文件和寄存器。

示例性核架构、处理器和计算机架构

为了不同目的可以以不同的方式并且在不同处理器中实现处理器核。例如,这样的核的实现可以包括:1)意图用于通用计算的通用有序核;2)意图用于通用计算的高性能通用无序核;3)意图主要用于图形和/或科学(吞吐量)计算的专用核。不同处理器的实现可以包括:1)包括意图用于通用计算的一个或多个通用有序核和/或意图用于通用计算的一个或多个通用无序核的cpu;以及2)包括意图主要用于图形和/或科学(吞吐量)的一个或多个专用核的协处理器。这样的不同处理器导致不同的计算机系统架构,其可以包括:1)来自cpu的单独芯片上的协处理器;2)与cpu相同的封装中的单独管芯上的协处理器;3)与cpu相同的管芯上的协处理器(在其情况下,这样的协处理器有时被称为专用逻辑(诸如集成图形和/或科学(吞吐量)逻辑),或被称为专用核);以及4)片上系统,其可以在相同的管芯上包括所述cpu(有时被称为(一个或多个)应用核或(一个或多个)应用处理器)、上述协处理器和附加功能性。接下来描述示例性核架构,之后是示例性处理器和计算机架构的描述。

示例性核架构

有序和无序核的框图

图21a是根据本公开实施例的例示了示例性有序流水线以及示例性寄存器重命名、无序发布/执行流水线二者的框图。图21b是根据本公开实施例的例示了有序架构核的示例性实施例以及要被包括在处理器中的示例性寄存器重命名、无序发布/执行架构核二者的框图。图21a-b中的实线框例示有序流水线和有序核,而虚线框的可选附加项例示寄存器重命名、无序发布/执行流水线和核。考虑到有序方面是无序方面的子集,将描述无序方面。

在图21a中,处理器流水线2100包括提取阶段2102、长度解码阶段2104、解码阶段2106、分配阶段2108、重命名阶段2110、调度(也已知为派遣或发布)阶段2112、寄存器读取/存储器读取阶段2114、执行阶段2116、写回/存储器写入阶段2118、异常处理阶段2122以及提交阶段2124。

图21b示出处理器核2190,其包括被耦合到执行引擎单元2150的前端单元2130,并且这两个单元都被耦合到存储器单元2170。核2190可以是精简指令集计算(risc)核、复杂指令集计算(cisc)核、超长指令字(vliw)核或者混合或替换的核类型。作为又一选项,核2190可以是专用核,诸如例如,网络或通信核、压缩引擎、协处理器核、通用计算图形处理单元(gpgpu)核、图形核等。

前端单元2130包括分支预测单元2132,其被耦合到指令高速缓存单元2134,指令高速缓存单元2134被耦合到指令转译后备缓冲器(tlb)2136,指令转译后备缓冲器(tlb)2136被耦合到指令提取单元2138,指令提取单元2138被耦合到解码单元2140。解码单元2140(或解码器或解码器单元)可以解码指令(例如,宏指令),并生成解码自原始指令、或以其他方式反映原始指令、或导出自原始指令的一个或多个微操作、微代码进入点、微指令、其他指令或其他控制信号作为输出。可以使用各种不同机制来实现解码单元2140。合适机制的示例包括但不限于查找表、硬件实现、可编程逻辑阵列(pla)、微代码只读存储器(rom)等等。在一个实施例中,核2190包括微代码rom或存储用于某些宏指令的微代码的其他介质(例如,在解码单元2140中或以其他方式在前端单元2130内)。解码单元2140被耦合到执行引擎单元2150中的重命名/分配器单元2152。

执行引擎单元2150包括重命名/分配器单元2152,其被耦合到引退单元2154和一组一个或多个调度器单元2156。(一个或多个)调度器单元2156表示任何数量的不同调度器,包括保留站、中央指令窗口等等。(一个或多个)调度器单元2156被耦合到(一个或多个)物理寄存器文件单元2158。(一个或多个)物理寄存器文件单元2158中的每一个表示一个或多个物理寄存器文件,其中的不同物理寄存器文件存储一个或多个不同的数据类型,诸如标量整数、标量浮点、打包整数、打包浮点、向量整数、向量浮点、状态(例如,作为要执行的下一指令的地址的指令指针)等等。在一个实施例中,(一个或多个)物理寄存器文件单元2158包括向量寄存器单元、写掩码寄存器单元以及标量寄存器单元。这些寄存器单元可以提供架构向量寄存器、向量掩码寄存器以及通用寄存器。(一个或多个)物理寄存器文件单元2158被引退单元2154重叠以说明可以以其实现寄存器重命名和无序执行的各种方式(例如,使用(一个或多个)重排序缓冲器和(一个或多个)引退寄存器文件;使用(一个或多个)未来文件、(一个或多个)历史缓冲器以及(一个或多个)引退寄存器文件;使用寄存器映射和寄存器池等等)。引退单元2154和(一个或多个)物理寄存器文件单元2158被耦合到(一个或多个)执行集群2160。(一个或多个)执行集群2160包括一组一个或多个执行单元2162以及一组一个或多个存储器访问单元2164。执行单元2162可以实行各种操作(例如,移位、加法、减法、乘法)并且对各种数据类型(例如,标量浮点、打包整数、打包浮点、向量整数、向量浮点)。虽然一些实施例可以包括专用于特定功能或功能集的数个执行单元,但是其他实施例可以包括全部实行所有功能的仅一个执行单元或多个执行单元。(一个或多个)调度器单元2156、(一个或多个)物理寄存器文件单元2158以及(一个或多个)执行集群2160被示出为可能是复数的,因为某些实施例针对某些数据/操作类型创建分离的流水线(例如,标量整数流水线、标量浮点/打包整数/打包浮点/向量整数/向量浮点流水线、和/或存储器访问流水线,它们各自具有其自己的调度器单元、(一个或多个)物理寄存器文件单元和/或执行集群——并且在分离的存储器访问流水线的情况下,实现其中该流水线的仅执行集群具有(一个或多个)存储器访问单元2164的某些实施例)。还应理解的是,在使用分离的流水线的情况下,这些流水线中的一个或多个可以是无序发布/执行而其余的有序。

该组存储器访问单元2164被耦合到存储器单元2170,存储器单元2170包括数据tlb单元2172,数据tlb单元2172被耦合到数据高速缓存单元2174,数据高速缓存单元2174被耦合到2级(l2)高速缓存单元2176。在一个示例性实施例中,存储器访问单元2164可以包括负载单元、存储地址单元以及存储数据单元,它们中的每一个都被耦合到存储器单元2170中的数据tlb单元2172。指令高速缓存单元2134进一步被耦合到存储器单元2170中的2级(l2)高速缓存单元2176。l2高速缓存单元2176被耦合到高速缓存的一个或多个其他级并最终被耦合到主存储器。

通过示例的方式,示例性寄存器重命名、无序发布/执行核架构可以如下实现流水线2100:1)指令提取2138实行提取和长度解码阶段2102和2104;2)解码单元2140实行解码阶段2106;3)重命名/分配器单元2152实行分配阶段2108和重命名阶段2110;4)(一个或多个)调度器单元2156实行调度阶段2112;5)(一个或多个)物理寄存器文件单元2158和存储器单元2170实行寄存器读取/存储器读取阶段2114;执行集群2160实行执行阶段2116;6)存储器单元2170和(一个或多个)物理寄存器文件单元2158实行写回/存储器写入阶段2118;7)在异常处理阶段2122中可能涉及到各种单元;以及8)引退单元2154和(一个或多个)物理寄存器文件单元2158实行提交阶段2124。

核2190可以支持一个或多个指令集(例如,x86指令集(以及被添加有较新版本的某些扩展);加利福尼亚州桑尼维尔的mips科技的mips指令集;加利福尼亚州桑尼维尔的arm控股公司的arm指令集(以及诸如neon之类的可选附加扩展)),包括本文中描述的(一个或多个)指令。在一个实施例中,核2190包括用以支持打包数据指令集扩展(例如,avx1、avx2)的逻辑,从而允许使用打包数据来实行由许多多媒体应用使用的操作。

应当理解的是,核可以支持多线程(执行两个或更多个并行的操作集或线程集),并且可以以各种方式来这样做,所述方式包括时间切片多线程、同时多线程(其中单个物理核为物理核正同时进行多线程的线程中的每一个提供逻辑核)或者它们的组合(例如,时间切片提取和解码以及其后的同时多线程,诸如在英特尔®超线程技术中那样)。

虽然在无序执行的情境中描述了寄存器重命名,但是应理解的是,寄存器重命名可以用在有序架构中。虽然所说明的处理器的实施例还包括单独的指令和数据高速缓存单元2134/2174以及共享l2高速缓存单元2176,但是替换实施例可以具有用于指令和数据二者的单个内部高速缓存,诸如例如,1级(l1)内部高速缓存或多级内部高速缓存。在一些实施例中,系统可以包括内部高速缓存和在核和/或处理器外部的外部高速缓存的组合。替换地,所有高速缓存都可以在核和/或处理器外部。

特定示例性有序核架构

图22a-b例示更具体的示例性有序核架构的框图,其核将会是芯片中的(包括相同类型和/或不同类型的其他核的)若干逻辑块中的一个。逻辑块通过具有某些固定功能逻辑、存储器i/o接口以及其他必要i/o逻辑(取决于应用)的高带宽互连网络(例如,环形网络)进行通信。

图22a是根据本公开的实施例的单个处理器核、连同其到管芯上互连网络2202的连接以及其2级(l2)高速缓存的本地子集2204的框图。在一个实施例中,指令解码单元2200支持具有打包数据指令集扩展的x86指令集。l1高速缓存2206允许到标量和向量单元中的对高速缓存存储器的低延迟访问。虽然(为了简化设计)在一个实施例中标量单元2208和向量单元2210使用分离的寄存器集(分别为标量寄存器2212和向量寄存器2214)并且在它们之间传输的数据被写入到存储器并然后从1级(l1)高速缓存2206读回来,但是本公开的替换实施例可以使用不同的方法(例如,使用单个寄存器集或包括允许在两个寄存器文件之间传输数据而无需写入和读回的通信路径)。

l2高速缓存的本地子集2204是被每个处理器核一个地划分成单独的本地子集的全局l2高速缓存的一部分。每个处理器核具有到其自己的l2高速缓存的本地子集2204的直接访问路径。由处理器核读取的数据被存储在其l2高速缓存子集2204中并且可以被快速访问,与其他处理器核访问它们自己的本地l2高速缓存子集并行地进行。由处理器核写入的数据被存储在其自己的l2高速缓存子集2204中并且如果必要的话从其他子集中被清除。环形网络确保了共享数据的一致性。该环形网络是双向的以允许诸如处理器核、l2高速缓存以及其他逻辑块之类的代理在芯片内与彼此通信。每个环形数据路径在每个方向上都是1024位宽。

图22b是根据本公开的实施例的图22a中的处理器核的部分的展开图。图22b包括l1数据高速缓存2206a(l1高速缓存2204的一部分)以及关于向量单元2210和向量寄存器2214的更多细节。具体来说,向量单元2210是16宽向量处理单元(vpu)(参见16宽alu2228),其执行整数指令、单精度浮动指令以及双精度浮动指令中的一个或多个。vpu支持用拌和单元2220来拌和寄存器输入、用数值转换单元2222a-b来数值转换以及用复制单元2224来对存储器输入进行复制。写掩码寄存器2226允许预测所得到的向量写入。

图23是根据本公开实施例的可以具有多于一个核、可以具有集成存储器控制器并且可以具有集成图形装置的处理器2300的框图。图23中的实线框例示具有单个核2302a、系统代理2310、一组一个或多个总线控制器单元2316的处理器2300,而虚线框的可选附加例示具有多个核2302a-n、系统代理单元2310中的一组一个或多个集成存储器控制器单元2314以及专用逻辑2308的替换处理器2300。

因此,处理器2300的不同实现可以包括:1)具有专用逻辑2308的cpu被集成有图形装置和/或科学(吞吐量)逻辑(其可以包括一个或多个核),并且核2302a-n是一个或多个通用核(例如,通用有序核、通用无序核、二者的组合);2)具有核2302a-n的协处理器,所述核2302a-n是大量的专用核,其主要用于图形和/或科学(吞吐量);以及3)具有核2302a-n的协处理器,所述核2302a-n是大量的通用有序核。因此,处理器2300可以是通用处理器、协处理器或专用处理器,诸如例如,网络或通信处理器、压缩引擎、图形处理器、gpgpu(通用图形处理单元)、高吞吐量多集成核(mic)协处理器(包括30或更多个核)、嵌入式处理器等等。可以在一个或多个芯片上实现处理器。处理器2300可以是一个或多个基板的一部分,或者可以使用多种工艺技术(诸如例如,bicmos、cmos或nmos)中的任何一种将处理器2300实现在一个或多个基板上。

存储器层级包括核内的高速缓存的一个或多个级,一组一个或多个共享高速缓存单元2306以及被耦合到该组集成存储器控制器单元2314的外部存储器(未示出)。该组共享高速缓存单元2306可以包括一个或多个中间级高速缓存,诸如2级(l2)、3级(l3)、4级(l4)或其他级的高速缓存、末级高速缓存(llc)和/或其组合。虽然在一个实施例中基于环形的互连单元2312互连集成图形逻辑2308、该组共享高速缓存单元2306以及系统代理单元2310/(一个或多个)集成存储器控制器单元2314,但是替换实施例可以使用任何数量的公知技术来互连此类单元。在一个实施例中,在一个或多个高速缓存单元2306和核2302a-n之间维持一致性。

在一些实施例中,核2302a-n中的一个或多个能够实现多线程。系统代理2310包括协调和操作核2302a-n的那些组件。系统代理单元2310可以包括例如功率控制单元(pcu)和显示单元。pcu可以是或者包括调节核2302a-n和集成图形逻辑2308的功率状态所需的逻辑和组件。显示单元用于驱动一个或多个外部连接的显示器。

就架构指令集而言,核2302a-n可以是同构的或是异构的;即,核2302a-n中的两个或更多个可以能够执行相同的指令集,而其他核可以能够执行该指令集的仅子集或者执行不同的指令集。

示例性计算机架构

图24-27是示例性计算机架构的框图。在针对膝上型计算机、台式计算机、手持式pc、个人数字助理、工程工作站、服务器、网络设备、网络中枢、交换机、嵌入式处理器、数字信号处理器(dsp)、图形设备、视频游戏设备、机顶盒、微控制器、蜂窝电话、便携式媒体播放器、手持式设备以及各种其他电子设备的领域中已知的其他系统设计和配置也是合适的。一般来说,能够并入如本文中公开的处理器和/或其他执行逻辑的大量的各种各样的系统或电子设备一般都是合适的。

现在参考图24,示出了根据本公开的一个实施例的系统2400的框图。系统2400可以包括一个或多个处理器2410、2415,它们被耦合到控制器集线器2420。在一个实施例中,控制器集线器2420包括图形存储器控制器集线器(gmch)2490以及输入/输出集线器(ioh)2450(其可以在分离的芯片上);gmch2490包括存储器和图形控制器,存储器2440和协处理器2445被耦合到所述存储器和图形控制器;ioh2450将输入/输出(i/o)设备2460耦合到gmch2490。替换地,存储器和图形控制器中的一个或二者被集成在(如本文中描述的)处理器内,存储器2440和协处理器2445被直接耦合到处理器2410和与ioh2450在单个芯片中的控制器集线器2420。存储器2440可以包括加密模块2440a例如以存储代码,所述代码在被执行时使得处理器实行本公开的任何方法。

在图24中用折线标明了附加处理器2415的可选性质。每个处理器2410、2415可以包括本文中描述的处理核中的一个或多个并且可以是处理器2300的某一版本。

存储器2440可以例如是动态随机访问存储器(dram)、相变存储器(pcm)或二者的组合。针对至少一个实施例,控制器集线器2420经由多点总线2495与(一个或多个)处理器2410、2415通信,所述多点总线诸如前侧总线(fsb)、点到点接口(诸如快速路径互连(qpi))或者类似连接。

在一个实施例中,协处理器2445是专用处理器,诸如例如,高吞吐量mic处理器、网络或通信处理器、压缩引擎、图形处理器、gpgpu、嵌入式处理器等等。在一个实施例中,控制器集线器2420可以包括集成图形加速器。

就包括架构、微架构、热学、功率消耗特性等的优点的度量谱而言,在物理资源2410、2415之间可以有各种差异。

在一个实施例中,处理器2410执行控制通用类型的数据处理操作的指令。嵌入在指令内的可以是协处理器指令。处理器2410将这些协处理器指令识别为应由附连的协处理器2445来执行的类型。因而,处理器2410在协处理器总线或其他互连上将这些协处理器指令(或表示协处理器指令的控制信号)发给协处理器2445。(一个或多个)协处理器2445接受并执行接收到的协处理器指令。

现在参考图25,示出了根据本公开的实施例的第一更具体的示例性系统2500的框图。如图25中所示,多处理器系统2500是点到点互连系统,并且包括经由点到点互连2550进行耦合的第一处理器2570和第二处理器2580。处理器2570和2580中的每一个可以是处理器2300的某一版本。在本公开的一个实施例中,处理器2570和2580分别是处理器2410和2415,而协处理器2538是协处理器2445。在另一实施例中,处理器2570和2580分别是处理器2410和协处理器2445。

处理器2570和2580被示出为分别包括集成存储器控制器(imc)单元2572和2582。处理器2570还包括点到点(p-p)接口2576和2578作为其总线控制器单元的一部分;类似地,第二处理器2580包括p-p接口2586和2588。处理器2570、2580可以使用p-p接口电路2578、2588经由点到点(p-p)接口2550交换信息。如图25中所示,imc2572和2582将处理器耦合到相应的存储器、即存储器2532和存储器2534,它们可以是本地附连到相应处理器的主存储器的部分。

处理器2570、2580可以使用点到点接口电路2576、2594、2586、2598经由单独的p-p接口2552、2554与芯片集2590交换信息。芯片集2590可以可选地经由高性能接口2592与协处理器2538交换信息。在一个实施例中,协处理器2538是专用处理器,诸如例如,高吞吐量mic处理器、网络或通信处理器、压缩引擎、图形处理器、gpgpu、嵌入式处理器等等。

共享高速缓存(未示出)可以被包括在任一处理器中或者在两个处理器外部,又或者经由p-p互连与处理器连接,使得如果处理器被置入到低功率模式中则任一或两个处理器的本地高速缓存信息可以被存储在共享高速缓存中。

芯片集2590可以经由接口2596被耦合到第一总线2516。在一个实施例中,第一总线2516可以是外围组件互连(pci)总线,或者是诸如pci快速总线或另一第三代i/o互连总线之类的总线,但是本公开的范围不限于此。

如图25中所示,各种i/o设备2514可以被耦合到第一总线2516以及总线桥2518,总线桥2518将第一总线2516耦合到第二总线2520。在一个实施例中,诸如协处理器、高吞吐量mic处理器、gpgpu、加速器(诸如例如,图形加速器或数字信号处理(dsp)单元)、现场可编程门阵列或任何其他处理器的一个或多个附加处理器2515被耦合到第一总线2516。在一个实施例中,第二总线2520可以是低引脚数(lpc)总线。各种设备可以被耦合到第二总线2520,所述设备包括例如,键盘和/或鼠标2522、通信设备2527以及诸如盘驱动或其他大容量存储设备之类的存储单元2528,其在一个实施例中可以包括指令/代码和/或数据2530。此外,音频i/o2524可以被耦合到第二总线2516。注意,其他架构也是可能的。例如,作为图25的点到点架构的替代,系统可以实现多点总线或其他此类架构。

现在参考图26,示出了根据本公开的实施例的第二更具体的示例性系统2600的框图。图25和26中的相似元件具有相似的附图标记,并且从图26中省略了图25的某些方面以便避免模糊图26的其他方面。

图26例示处理器2570、2580可以分别包括集成存储器和i/o控制逻辑(“cl”)2672和2682。因此,cl2672、2682包括集成存储器控制器单元并且包括i/o控制逻辑。图26例示不仅存储器2532、2534被耦合到cl2572、2582,而且i/o设备2614也被耦合到控制逻辑2572、2582。旧有i/o设备2615被耦合到芯片集2590。

现在参考图27,示出了根据本公开的实施例的soc2700的框图。图23中的类似元件具有相似的附图标记。而且,虚线框是更高级的soc上的可选特征。在图27中,(一个或多个)互连单元2702被耦合到:应用处理器2710,其包括一组一个或多个核2302a-n和(一个或多个)共享高速缓存单元2306;系统代理单元2310;(一个或多个)总线控制器单元2316;(一个或多个)集成存储器控制器单元2314;一组一个或多个协处理器2720,其可以包括集成图形逻辑、图像处理器、音频处理器和视频处理器;静态随机访问存储器(sram)单元2730;直接存储器访问(dma)单元2732;以及用于耦合到一个或多个外部显示器的显示单元2740。在一个实施例中,(一个或多个)协处理器2720是专用处理器,诸如例如,网络或通信处理器、压缩引擎、gpgpu、高吞吐量mic处理器、嵌入式处理器等等。

可以以硬件、软件、固件或此类实现方法的组合来实现本文中公开的实施例(例如,机制的实施例)。本公开的实施例可以被实现为计算机程序或程序代码,其在包括至少一个处理器、存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备以及至少一个输出设备的可编程系统上执行。

可以应用诸如图25中例示的代码2530之类的程序代码来输入指令以实行本文中描述的功能并生成输出信息。可以以已知方式将输出信息应用于一个或多个输出设备。出于本申请的目的,处理系统包括具有处理器的任何系统,诸如例如:数字信号处理器(dsp)、微控制器、专用集成电路(asic)或微处理器。

可以以高级程序语言或面向对象的编程语言来实现程序代码以便与处理系统通信。如果期望的话,也可以以汇编语言或机器语言来实现程序代码。事实上,本文中描述的机制在范围上不限于任何特定的编程语言。在任何情况下,语言可以是编译语言或解释语言。

可以通过存储在机器可读介质上的表示处理器内的各种逻辑的代表性指令来实现至少一个实施例的一个或多个方面,所述指令当被机器读取时促使所述机器制作逻辑以实行本文中描述的技术。已知为“ip核”的这样的表示可以被存储在有形的机器可读介质上并被供应给各种客户或制造设施来加载到实际上制造逻辑或处理器的制作机器中。

这样的机器可读存储介质可以在没有限制的情况下包括由机器或设备制造或形成的非暂时性有形的制品布置,包括诸如硬盘的存储介质、任何其他类型的盘(包括软盘、光盘、紧凑盘只读存储器(cd-rom)、紧凑盘可重写设备(cd-rw)以及磁光盘)、半导体设备(诸如只读存储器(rom)、随机访问存储器(ram)(诸如动态随机访问存储器(dram)、静态随机访问存储器(sram))、可擦可编程只读存储器(eprom)、闪速存储器、电可擦可编程只读存储器(eeprom)、相变存储器(pcm))、磁卡或光卡、或者适合于存储电子指令的任何其他类型的介质。

相应地,本公开的实施例还包括包含指令或包含设计数据(诸如硬件描述语言(hdl))的非暂时性有形机器可读介质,所述设计数据定义本文中描述的结构、电路、装置、处理器和/或系统特征。这样的实施例也可以称为程序产品。

仿真(包括二进制转译、代码变形等)

在一些情况下,可以使用指令转换器来将指令从源指令集转换成目标指令集。例如,指令转换器可以将指令转译(例如,使用静态二进制转译、包括动态编译的动态二进制转译)、变形、仿真或以其他方式转换成要由核处理的一个或多个其他指令。可以以软件、硬件、固件或其组合来实现指令转换器。指令转换器可以是在处理器上、处理器外、或者部分在处理器上而部分在处理器外。

图28是根据本公开的实施例的对照使用软件指令转换器来将源指令集中的二进制指令转换成目标指令集中的二进制指令的框图。在所例示的实施例中,指令转换器是软件指令转换器,但是替换地,指令转换器可以以软件、固件、硬件和其各种组合来实现。图28示出高级语言2802形式的程序可以使用x86编译器2804来编译以生成x86二进制代码2806,所述x86二进制代码2806可以原生地由具有至少一个x86指令集核的处理器2816来执行。具有至少一个x86指令集核的处理器2816表示基本上可以通过互相兼容地执行或以其他方式处理以下内容来实行与具有至少一个x86指令集核的英特尔处理器相同的功能的任何处理器:(1)英特尔x86指令集核的指令集的实质部分或者(2)目标为在具有至少一个x86指令集核的英特尔处理器上运行的应用或其他软件的目标代码版本,以便基本上实现与具有至少一个x86指令集核的英特尔处理器相同的结果。x86编译器2804表示可操作用于生成x86二进制代码2806(例如,目标代码)的编译器,所述二进制代码2806可以在有附加链接处理或没有附加链接处理的情况下在具有至少一个x86指令集核的处理器2816上执行。类似地,图28示出了高级语言2802形式的程序可以使用替换指令集编译器2808来进行编译以生成替换指令集二进制代码2810,其可以原生地由不具有至少一个x86指令集核的处理器2814来执行(例如,具有执行加利福尼亚州桑尼维尔的mips科技的mips指令集和/或执行加利福尼亚州桑尼维尔的arm控股公司的arm指令集的核的处理器)。使用指令转换器2812来将x86二进制代码2806转换成可以原生地由不具有x86指令集核的处理器2814来执行的代码。该经转换的代码很可能不与替换指令集二进制代码2810相同,因为能够这样做的指令转换器难以制造;然而,经转换的代码将完成一般操作并且由来自替换指令集的指令构成。因此,指令转换器2812表示通过仿真、模拟或任何其他过程而允许不具有x86指令集处理器或核的处理器或其他电子设备执行x86二进制代码2806的软件、固件、硬件或其组合。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1