用于处理器指令缓冲与循环缓冲的装置及其操作方法转让专利

申请号 : CN201510604477.5

文献号 : CN105242904B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王琪张志伟丁光新薛晓军史明霞侯化成李阳郭旭龙

申请人 : 中国科学院自动化研究所

摘要 :

本发明提供了一种用于处理器指令缓冲与循环缓冲的装置,包括:指令缓冲器、对齐缓冲器、循环缓冲器、以及可选地包括多路选择器。其中,指令缓冲器与对齐缓冲器相连,对齐缓冲器与循环缓冲器相连,对齐缓冲器和循环缓冲器都与多路选择器相连。本发明还提供了一种操作该装置的方法。

权利要求 :

1.一种处理器指令缓冲与循环缓冲的装置操作方法,包括:

从对齐缓冲器中读取指令;以及

检测循环缓冲器是否开启:若没有开启,继续从对齐缓冲器中读取下一条指令;若开启了,进一步判断当前拆包的指令地址是否等于循环体的首执行包的指令地址,若否,则继续从对齐缓冲器中读取下一条指令,若是,开启循环缓冲器加载模式,其中,循环缓冲器加载包括:

从对齐缓冲器中读取循环体指令送入后续译码模块的同时,将读取的指令同时也写入循环缓冲器中;以及判断循环体加载是否完成:若当前拆包指令的地址等于循环体尾执行包的地址,循环体加载完毕,否则,继续循环缓冲器的加载,其中:

所述装置包括:指令缓冲器,包括第一多个缓冲行;对齐缓冲器,包括第二多个缓冲行;

循环缓冲器,包括排成一行的第三多个缓冲单元;以及多路选择器,其中:指令缓冲器的输出端连接到对齐缓冲器的输入端,对齐缓冲器的输出端连接到循环缓冲器的输入端,对齐缓冲器的输出端和循环缓冲器的输出端分别连接到多路选择器的两个输入端;或者所述装置包括:指令缓冲器,包括第一多个缓冲行;对齐缓冲器,包括第二多个缓冲行;

循环缓冲器,包括第三多个缓冲行;以及多路选择器,其中:指令缓冲器的输出端和循环缓冲器的输出端分别连接到多路选择器的两个输入端,多路选择器的输出端连接到对齐缓冲器的输入端,对齐缓冲器的输出端连接到循环缓冲器的输入端;或者所述装置包括:指令缓冲器,包括第一多个缓冲行;对齐缓冲器,包括第二多个缓冲行;

循环缓冲器,包括第三多个缓冲行;以及多路选择器,其中:指令缓冲器的输出端连接到对齐缓冲器的输入端,对齐缓冲器的输出端连接到循环缓冲器的输入端,对齐缓冲器的输出端和循环缓冲器的输出端分别连接到多路选择器的两个输入端。

2.根据权利要求1所述的方法,还包括:

从循环缓冲器中读取指令,送到后续的译码模块;以及

判断循环体是否执行完毕,如果循环体执行完毕,则清空循环缓冲器,切换读取指令的位置到对齐缓冲器中。

3.一种处理器指令缓冲与循环缓冲的装置操作方法,包括:

从指令对齐缓冲器中读取指令;以及

检测循环缓冲器是否开启:若没有开启,继续从指令对齐缓冲器中读取下一条指令;若开启了,进一步判断当前拆包的指令地址是否等于循环体的首执行包的指令地址,若否,则继续从指令对齐缓冲器中读取下一条指令,若是,开启循环缓冲器加载模式,其中,循环缓冲器加载包括:从指令对齐缓冲器中读取循环体指令送入后续译码模块的同时,将读取的指令同时也写入循环缓冲器中;以及判断循环体加载是否完成:若当前拆包指令的地址等于循环体尾执行包的地址,循环体加载完毕,否则,继续循环缓冲器的加载,其中,所述装置包括:指令缓冲器,包括第一多个缓冲行;指令对齐缓冲器,包括第二多个缓冲行;循环缓冲器,包括第三多个缓冲行;循环对齐缓冲器,包括第四多个缓冲行;以及多路选择器,其中:指令缓冲器的输出端连接到指令对齐缓冲器的输入端,指令对齐缓冲器的输出端连接到循环缓冲器的输入端和循环对齐缓冲器的输入端,循环缓冲器的输出端连接到循环对齐缓冲器的输入端,循环对齐缓冲器的输出端连接到循环缓冲器的输入端,指令对齐缓冲器的输出端和循环对齐缓冲器的输出端分别连接到多路选择器的两个输入端。

4.根据权利要求3所述的方法,还包括:

将循环体的指令从循环缓冲器中依次读取到循环对齐缓冲器,循环对齐缓冲器的指令被读取的同时写入循环缓冲器;以及判断循环体是否执行完毕,如果循环体执行完毕,则清空循环缓冲器,切换读取指令的位置到循环对齐缓冲器中。

说明书 :

用于处理器指令缓冲与循环缓冲的装置及其操作方法

技术领域

[0001] 本发明涉及处理器设计领域,尤其涉及一种用于处理器指令缓冲与循环缓冲的装置及该装置的操作方法。

背景技术

[0002] 现代微处理器一般采用多级流水的方式执行指令。典型的超长指令字结构的处理器流水线一般包括取值、拆包、译码、执行、写回几部分。从指令高速缓冲存储器(Cache)中取回指令后,一般会存入指令缓冲器中。通过从指令缓冲器读取指令,进行指令的拆包、译码等操作。指令Cache的访问频率很高,消耗的功耗也很大。现代微处理器越来越多地应用到电池供电的设备中,因而,处理器的低功耗设计也越来越重要。
[0003] 在嵌入式应用程序中,图像处理、视频编解码等数据密集型应用占比很高。在这些应用的核心代码中,循环所占比重也很大。因而,若处理器在执行循环时,能够将循环指令保存到处理器内核之中,进而可以关闭取指令单元,并减少对指令Cache的访问次数,就能降低取指令的功耗。
[0004] 现有技术中,一般采用在处理器内部添加循环缓冲器的方法来保存循环体,以降低循环执行时对指令Cache的访问次数,进而达到降低功耗的目的。
[0005] 现有的循环缓冲器技术解决方案中,大多数都只能存储单个的循环体,不支持嵌套循环,也没有对处理器中原有指令缓冲器和新增的循环缓冲器如何交替工作提出对应的解决方案。
[0006] 专利CN201310100176.X《一种循环缓冲装置以及循环缓冲方法》中,重点描述了如何用硬件实现循环体的识别,然后加载并读取循环体。但其也存在如下缺点:
[0007] 1.循环缓冲器中只能存放单个的循环体,不支持嵌套循环。
[0008] 2.没有说明指令缓冲器与循环缓冲器的切换方法。
[0009] 3.没有提出对变长指令,或超长指令字的处理器的支持方法。

发明内容

[0010] 为了降低循环执行时对指令Cache的访问次数,从而降低处理器的取指令功耗,本发明改进了循环缓冲器的设计方法,提供了一种适用于VLIW:(Very Long Instruction Word,超长指令字)处理器或部分变长指令编码(即指令编码的长度为指令寻址宽度的整数倍)处理器的循环缓冲器设计方法。
[0011] 为实现上述目的,本发明的一个方面提供了一种用于处理器指令缓冲与循环缓冲的装置,包括:指令缓冲器IB、对齐缓冲器AB、循环缓冲器LB、以及多路选择器MUX2_1。并且提供了多种实施方式。其中,指令缓冲器与对齐缓冲器相连,对齐缓冲器与循环缓冲器相连,对齐缓冲器和循环缓冲器都与多路选择器相连。
[0012] 处理器从指令存储器中取回来的指令包可以直接存入对齐缓冲器或指令缓冲器中。处理器启动时,从对齐缓冲器中读取指令,根据指令编码的特点对指令包进行拆包,得到执行包。执行过程中,若循环缓冲器使能(lb_en)有效,进而判断循环缓冲器的状态,若还未加载循环体,则将执行包的地址与循环体的首尾地址进行比较,若大于等于首地址,小于等于尾地址,则说明当前拆包的指令为循环体内的指令,则将其从对齐缓冲器读出的同时,也写入循环缓冲器中。直到执行包地址等于循环体尾地址,则说明循环体加载完成。循环体加载完成后,切换读缓冲器区标志(read_buffer),从循环缓冲器中读取指令,直到循环体执行完毕,再切换读缓冲器区标志,重新从对齐缓冲器中读取指令。
[0013] 本发明另一方面提供了一种操作操作上述用于处理器指令缓冲与循环缓冲的装置的方法,包括:(1)从对齐缓冲器中读取指令;(2)检测循环缓冲器是否开启,若没有开启,继续从对齐缓冲器中读取下一条指令;若开启了,进一步判断当前拆包的指令地址是否等于循环体的首执行包的指令地址,若否,则继续从对齐缓冲器中读取下一条指令,若是,开启循环缓冲器加载模式;(3)循环缓冲器加载:从对齐缓冲器中读取循环体指令送入后续译码模块的同时,将读取的指令同时也写入循环缓冲器中;(4)判断循环体加载是否完成:若当前拆包指令的地址等于循环体尾执行包的地址,若是,循环体加载完毕,否则,继续循环缓冲器的加载。
[0014] 根据本发明的实施例,该方法还可以包括:(5)从循环缓冲器中读取指令,送到后续的译码模块;以及(6)判断循环体是否执行完毕,如果循环体执行完毕,则清空循环缓冲器,切换读取指令的位置到对齐缓冲器中。具体地,步骤(6)可以包括:首先判断循环次数是否大于1,若是,进一步判断当前从循环缓冲器中读取的拆包指令地址是否等于循环体尾执行包地址,若不是,则从循环缓冲器中继续按顺序读取后续指令;否则,切换循环缓冲器的读指针,读取循环体的首指令,并将循环次数减1。然后,再次通过循环次数判断循环是否执行完毕:若循环次数等于1,进一步判断当前从循环缓冲器中读取的拆包指令地址是否等于循环体尾执行包地址,若不是,则从循环缓冲器中继续按顺序读取后续指令,否则,说明最后一遍循环体执行到最后一个执行包,从循环缓冲器中读取循环体数据完毕,清空循环缓冲器,切换读取指令的位置到对齐缓冲器中。
[0015] 根据本发明的指令缓冲器与循环缓冲器的装置及其对循环缓冲器的处理方法,能够在指令拆包的过程中识别循环体指令,并且装载进入循环缓冲器中,在循环缓冲器装载完毕后,从循环缓冲器中读取循环体指令并执行,通过循环缓冲器指针的变换实现循环体指令的反复执行。当循环体执行完毕后,再次从对齐缓冲器中读取指令。本发明能够有效的实现超长指令字处理器的循环体加载,执行等过程,能有效减少循环体执行时,访问指令Cache的次数,从而大大降低处理器的取指令功耗。

附图说明

[0016] 图1是根据本发明第一实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图;
[0017] 图2是根据本发明实施例的用于处理器指令缓冲与循环缓冲的装置在执行普通指令与循环指令时的切换流程图;
[0018] 图3是根据本发明实施例支持双层嵌套循环的循环缓冲器控制逻辑的状态机转换图;
[0019] 图4是根据本发明第二实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图;
[0020] 图5是根据本发明第三实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图;以及
[0021] 图6是根据本发明第四实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图。
[0022] 附图标记说明:
[0023] insn_pak:输入指令包
[0024] lb_en:循环缓冲器使能信号
[0025] read_buffer:多路选择器控制信号
[0026] exe_pak:输出指令包
[0027] rst_n:复位信号,低电平有效

具体实施方式

[0028] 为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明做进一步详细说明。
[0029] 图1是根据本发明第一实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图。如图1所示,该装置包括:指令缓冲器(Instruction Buffer,IB)101、对齐缓冲器(Align Buffer,AB)102、循环缓冲器(Loop Buffer,LB)103、以及多路选择器(MUX2_1)104。IB的输出端连接到AB的输入端,AB的输出端连接到LB的输入端,AB的输出端和LB的输出端分别连接到MUX2_1的两个输入端。其中,IB和AB均包括多个缓冲行,其中每个缓冲行的位宽(即,能存放的比特数)为宽度,缓冲行的个数为深度。IB的深度可调节,此处设为正整数m。
AB的深度一般为2,用于指令对齐。当从指令包中根据指令编码的特点读取执行包时,执行包可能为1条或多条指令,一个执行包有可能跨越2个指令包,因而设置AB的深度为2。IB和AB的缓冲区的宽度(即其缓冲行的位宽)为指令包的宽度(即指令包所包含的比特数),标识为正整数b。例如,根据本发明的实施例,处理器的单条指令的编码为16位或32位,并且支持多发射,取指令宽度为64位,指令包的宽度也为64位,同时,允许16,32或64位的执行包,因而,对应这款处理器,AB和IB的宽度等于指令包的宽度,即64位。LB采用扁平化的结构,以最小指令宽度为单位(标识为正整数a),长度可调节,设总长度为正整数n。对应上述处理器,LB的单位长度为16位,长度为n。MUX2_1为1个2选1的多路选择器,根据读缓冲区标志信号read_buffer选择从AB或LB中读出执行包,送到处理器中的译码模块。处理器启动时,默认循环缓冲器关闭,从指令存储器中读取返回的指令存入IB或AB中,当IB和AB都为空时,默认存入AB中,当AB满后,依次再存入IB中。根据本发明的实施例,在AB和IB中均为从低编号缓冲行向高编号缓冲行存储。AB中的指令读取后,将IB中的缓冲行发送到AB中。根据本发明的实施例,在发送缓冲行时,从高编号缓冲行向低编号缓冲行依次传输,每次“下沉”一个缓冲行,如AB[1]写入AB[0],IB[0]写入AB[1],IB[1]写入IB[0],IB[n]写入IB[n-1]。同时,只有当AB[0]整行读取完成后,才执行上述操作。循环缓冲器的使能或禁用由lb_en信号控制,该信号例如可由专用的循环处理器单元产生。循环缓冲器未使能时,识别执行包时,读取指令包的位置始终为AB。当循环缓冲器使能后,即lb_en信号有效后,从AB中读取执行包的同时,将执行包的地址与循环体的首执行包的首指令地址进行比较,若相等,则同时将该执行包依次写入LB中。直到从AB读取的执行包的地址等于循环体的尾执行包的首指令地址时,将循环体尾执行包也写入LB中,此时循环体指令在执行第一遍的同时,也完成了循环体在LB中的加载。那么,从执行第二遍循环体开始,就从LB中依次读取循环体的指令。此时,IB和AB可以关闭,停止工作,以降低功耗;或者,也可以继续向存储器发起循环体外的后续指令读请求,并依次写入IB中,直到IB满时,再关闭IB和AB,节省功耗。LB中需要设定读写指针,并在装载循环体时,记录循环体的首/尾执行包的首地址在LB中对应的单元编号,设标号分别为ltn_rp和lbn_rp,其中n可以为0,1,2等数字,用于分别标识各个循环体的首/尾执行包的首地址在LB中对应的单元编号,以支持嵌套循环。从LB中读取循环体时,当读指针等于lbn_rp且同时该循环体对应的循环次数lcn大于1时,说明循环体还需要执行多次,此时,切换读指针到循环体首执行包首指令的编号处,开始读取新一轮的循环体。如此循环执行,直到读指针等于lbn_rp且lcn也等于1时,说明循环体执行到最后一遍,在该最后一遍执行之后应当继续执行循环体外的后续指令。此时,清空循环缓冲器(若是单层循环,则清空整个循环器;若是嵌套循环,则需要等待外层循环执行完毕后,再清空整个循环缓冲器),禁止循环缓冲器使能信号lb_en,并切换read_buffer,从AB中继续读取后续的指令。对IB、AB、LB和MUX2_1的各种读写和控制操作均由其所在的模块执行。
[0030] 图2是根据本发明实施例的指令缓冲器与循环缓冲器执行流程图,适用于仅单层循环能放入循环缓冲器的情况,即循环缓冲器中存储的循环体不存在循环嵌套。该方法的步骤包括201-212:
[0031] 在步骤201:从对齐缓冲器中读取指令,发送到译码模块。
[0032] 步骤202:判断循环缓冲器是否开启,若未开启,返回步骤201,若开启,进入步骤203。
[0033] 步骤203:判断当前指令包到执行包的首地址是否等于循环体首执行包的首地址,若是,则需要在读取循环体的同时,将循环体写入到循环缓冲器中,则进入步骤204;否则,返回步骤201。
[0034] 步骤204:加载循环体:从对齐缓冲器中读取执行包的同时,将循环体指令也写入到循环缓冲器中。并记录循环体首执行包首指令在循环缓冲器中存入的位置。
[0035] 步骤205:加载循环体的过程中,判断当前指令包到执行包的首地址是否等于循环体尾执行包的首地址,若是,说明执行到循环体的最后一个执行包了,进入步骤206,否则,返回步骤204。
[0036] 步骤206:加载循环体尾执行包。从对齐缓冲器中读取执行包的同时,将循环体尾执行包也写入到循环缓冲器中。并记录循环体尾执行包首指令在循环缓冲器中存入的位置,切换缓冲器区读取位置标记到循环缓冲器。然后进入步骤207。
[0037] 步骤207:从循环缓冲器中读取按序读取循环体的执行包。
[0038] 步骤208:判断当前读取执行包的循环缓冲器读指针位置是否等于步骤206中记录的循环体尾执行包首指令在循环缓冲器中存入的位置,若是,进入步骤209,否则,循环缓冲器读指针根据执行包的长度进行自动累加,返回步骤207。
[0039] 步骤209:判断循环体对应的循环次数是否大于1,若是,说明循环体还需要反复执行,进入步骤210;否则,说明最后一遍循环体执行完毕,进入步骤211。
[0040] 步骤210:切换循环缓冲器的读指针到步骤204中记录的循环体首执行包首指令在循环缓冲器中存入的位置,准备读取循环体的首执行包。同时控制循环次数减1。然后,进入步骤207。
[0041] 步骤211:清空循环缓冲器的内容,并进入步骤201。
[0042] 指令缓冲器与循环缓冲器的读写控制等采用状态机的方法进行控制,图3是本发明一实施例支持双层循环的循环缓冲器控制逻辑的状态机转换图。该状态机转换图中各状态的含义及选择读出指令的缓冲器区域如表1所示。设支持的两组循环分别叫LOOP0和LOOP1,当两个循环体的结束地址相等时,LOOP1的优先级更高。下表1到表10中,IF3流水级代表从指令存储区读回指令包,写回指令缓冲器的流水级。bcs代表状态机的当前状态,bns代表状态机的下一周期将要进入的状态。fpc代表当前读出并发送到译码级的执行包的首指令地址。
[0043] 若当前状态为AB_READ,状态改变列表的条件及其示意图如表2所示;
[0044] 若当前状态为S_LB_LOAD,状态改变列表的条件及其示意图如表3所示;
[0045] 若当前状态为S_LB_READ,状态改变列表的条件及其示意图如表4所示;
[0046] 若当前状态为LB_FLUSH,状态改变列表的条件及其示意图如表5所示;
[0047] 若当前状态为DI_LB_LOAD,状态改变列表的条件及其示意图如表6所示;
[0048] 若当前状态为DI_LB_READ,状态改变列表的条件及其示意图如表7所示;
[0049] 若当前状态为DO_LB_LOAD,状态改变列表的条件及其示意图如表8所示;
[0050] 若当前状态为D_LB_READ,状态改变列表的条件及其示意图如表9所示;
[0051] 若当前状态为DE_LB_READ,状态改变列表的条件及其示意图如表10所示;
[0052] 表1循环缓冲器状态机的状态说明
[0053]
[0054]
[0055] 表2 AB_READ状态改变列表
[0056]
[0057]
[0058] 表3 S_LB_LOAD状态改变列表
[0059]
[0060]
[0061] 表4 S_LB_READ状态改变列表
[0062]
[0063] 表5 LB_FLUSH状态改变列表
[0064]
[0065] 表6 DI_LB_LOAD状态改变列表
[0066]
[0067]
[0068] 表7 DI_LB_READ状态改变列表
[0069]
[0070] 表8 DO_LB_LOAD状态改变列表
[0071]
[0072] 表9 D_LB_READ状态改变列表
[0073]
[0074] 表10 DE_LB_READ状态改变列表
[0075]
[0076]
[0077] 图4是根据本发明第二实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图。该装置包括:指令缓冲器(Instruction Buffer,IB)401,循环缓冲器(Loop Buffer,LB)402,对齐缓冲器(Align Buffer,AB)403,选择器(MUX2_1)404。IB和LB的输出端分别连接到MUX2_1的两个输入端,MUX2_1的输出端连接到AB的输入端,AB的输出端连接到LB的输入端。其中,IB、AB和LB均包括多个缓冲行,其中每个缓冲行的位宽(即,能存放的比特数)为宽度,缓冲行的个数为深度。IB、LB深度可调节,此处分别设为正整数m和正整数n。AB的深度一般为2,用于指令对齐,即从指令包中根据指令编码的特点读取执行包,执行包可能为1条或多条指令,一个执行包有可能跨越2个指令包,因而设置AB的深度为2。IB、AB和LB的缓冲器区的宽度(即其缓冲行的位宽)为指令包的宽度,标识为正整数b。根据本发明的实施例,处理器的单条指令的编码为16位或32位,并且支持多发射,允许64位的执行包,因而,对应这款处理器,IB、AB和LB的宽度均为64位。从AB中读出执行包并送到处理器中的译码模块。处理器启动时,默认循环缓冲器关闭,从指令存储器中读取返回的指令存入IB或AB中,当IB、AB都为空时,默认存入AB中,当AB满后,依次再存入IB中。在对齐缓冲器和指令缓冲器中均为从低编号缓冲行向高编号缓冲行存储。AB中的指令读取后,将IB中的缓冲行发送到AB中。根据本发明的实施例,在发送缓冲行时,从高编号缓冲行向低编号缓冲行依次传输,每次“下沉”一个缓冲行,如AB[1]写入AB[0],IB[0]写入AB[1],IB[1]写入IB[0],IB[n]写入IB[n-1]。同时,只有当AB[0]整行读取完成后,才执行上述操作。当循环缓冲器使能后,从AB中读取执行包的同时,需要将执行包的地址与循环体的首执行包的首指令地址进行比较,若相等,则同时将该执行包所在的指令包,即AB中的一行,依次写入LB的行中。直到从AB读取的执行包的地址等于循环体的尾执行包的首指令地址时,将循环体尾执行包所在的指令包行也写入LB的行中。循环体指令在执行第一遍的同时,也完成了循环体在LB中的加载。此时,IB可以关闭,停止工作,以降低功耗;或者,也可以继续向存储器发起循环体外的后续指令读请求,并依次写入IB中,直到IB满时,再关闭IB以节省功耗。接下来,进行循环体从循环缓冲器中的读取:此时LB中的指令需要依次写入AB中,在AB中进行执行包的读取,AB中每读取完一行的同时,也将读出的缓冲行写入LB中最后一缓冲行的位置,同时LB中原有缓冲行依次向下前进一行,如LB[1]的内容写入LB[0];LB[0]的内容写入AB[1],AB[1]的内容写入AB[0],即将LB与AB首尾相接,形成一个循环的缓冲器区。当从AB中读出的执行包地址等于循环体尾执行包的首指令地址时,若此时对应的循环次数大于1,说明循环体还需要反复执行,则LB与AB组成的缓冲器区再依次前进一行,下一周期,继续从AB[0]缓冲行中读取循环体的首执行包的首指令;若此时的循环次数等于1,说明循环体执行到最后一遍,接下来需要读取循环体外的后续指令,因而,此时清空AB和LB中的内容,关闭循环缓冲器lb_en,切换读缓冲器区域指示信号read_buffer到IB。并将IB中的内容依次写入到AB中,从AB中读取指令送往译码级。对IB、AB和LB的各种读写和控制操作均由其所在的模块执行[0078] 图5是根据本发明第三实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图。该装置包括:指令缓冲器(Instruction Buffer,IB)501,循环缓冲器(Loop Buffer,LB)502,对齐缓冲器(Align Buffer,AB)503,选择器(MUX2_1)504。IB的输出端连接到AB的输入端,AB的输出端连接到LB的输入端,AB的输出端和LB的输出端分别连接到MUX2_1的两个输入端。其中,IB、AB和LB均包括多个缓冲行,其中每个缓冲行的位宽(即,能存放的比特数)为宽度,缓冲行的个数为深度。IB、LB深度可调节,此处分别设为m、n,AB的深度一般为2,用于指令对齐,即从指令包中根据指令编码的特点读取执行包,执行包可能为1条或多条指令,一个执行包有可能跨越2个指令包,因而设置AB的深度为2。IB、AB和LB的缓冲器区的宽度(即其缓冲行的位宽)为指令包的宽度,标识为b,例如本方案一实施例处理器中,单条指令的编码为16位或32位,并且支持多发射,允许64位的执行包,因而,对应这款处理器,IB、AB和LB的宽度均为64位。处理器启动时,默认循环缓冲器关闭,从指令存储器中读取返回的指令存入IB或AB中,当IB、AB都为空时,默认存入AB中,当AB满后,依次再存入IB中。在对齐缓冲器和指令缓冲器中均为从低编号缓冲行向高编号缓冲行存储。AB中的指令读取后,将IB中的缓冲行发送到AB中。根据本发明的实施例,在发送缓冲行时,从高编号缓冲行向低编号缓冲行依次传输,每次“下沉”一个缓冲行,如AB[1]写入AB[0],IB[0]写入AB[1],IB[1]写入IB[0],IB[n]写入IB[n-1]。同时,只有当AB[0]整行读取完成后,才执行上述操作。从AB中读出执行包并送到处理器中的译码模块,当AB中一行指令被读取后,将IB中的缓冲行发送到AB中。当循环缓冲器使能后,首先进行循环缓冲器的加载:从AB中读取执行包的同时,需要将执行包的地址与循环体的首执行包的首指令地址进行比较,若相等,则同时将该执行包所在的指令包,即AB中的一行,依次写入LB的行中。直到从AB读取的执行包的地址等于循环体的尾执行包的首指令地址时,将循环体尾执行包所在的指令包行也写入LB的行中。循环体指令在执行第一遍的同时,也完成了循环体在LB中的加载。LB中需要设定读写指针,并在装载循环体时,记录循环体的首/尾执行包的首地址在LB中对应的位置,该位置要精确到LB中的具体行,以及行内以最小指令宽度a为单位的具体位置。设循环体的首/尾执行包的首地址的标志信号分别为ltn_rp,lbn_rp,其中n可以为0,1,2等数字,用于分别标识各个循环体的首/尾执行包的首地址在LB中对应的编号,以支持嵌套循环。从LB中读取循环体时,当读指针等于lbn_rp时,同时,该循环体对应的循环次数,设为lcn,当lcn大于1时,说明循环体还需要执行多次,此时,切换读指针到对应的ltn_rp处,开始读取新一轮的循环体。直到读指针等于lbn_rp时,lcn也等于1,说明循环体执行到最后一遍,应该继续执行循环体外的后续指令。此时,清空循环缓冲器,禁止循环缓冲器使能信号lb_en,并切换read_buffer,从AB中继续读取后续的指令。在循环缓冲器使能时,进行循环加载以及从循环指令读取的过程中,可将IB关闭,以降低功耗;或者,也可以继续向存储器发起循环体外的后续指令读请求,并依次写入IB中,直到IB满时,再关闭IB以节省功耗。对IB、AB、LB和MUX2_1的各种读写和控制操作均由其所在的模块执行
[0079] 图6是根据本发明第四实施例的用于处理器指令缓冲与循环缓冲的装置的结构示意图。该装置包括:指令缓冲器(Instruction Buffer,IAB)601,指令对齐缓冲器(Instruction Align Buffer,IAB)602,循环缓冲器(Loop Buffer,LB)603,循环对齐缓冲器(Loop Align Buffer,LAB)604。IB的输出端连接到IAB的输入端,IAB的输出端连接到LB的输入端和LAB的输入端,LB的输出端连接到LAB的输入端,LAB的输出端连接到LB的输入端,IAB的输出端和LAB的输出端分别连接到MUX2_1的两个输入端。
[0080] 其中,IB、IAB、LB和LAB均包括多个缓冲行,其中每个缓冲行的位宽(即,能存放的比特数)为宽度,缓冲行的个数为深度。IB、LB深度可调节,此处分别设为m、n,IAB、LAB的深度一般为2,用于指令对齐,即从指令包中根据指令编码的特点读取执行包,执行包可能为1条或多条指令,一个执行包有可能跨越2个指令包,因而设置AB的深度为2。IB、IAB、LB和LAB的缓冲器区的宽度(即其缓冲行的位宽)为指令包的宽度,标识为b,例如本方案一实施例处理器中,单条指令的编码为16位或32位,并且支持多发射,允许64位的执行包,因而,对应这款处理器,IB、IAB、LB、LAB的宽度均为64位。处理器启动时,默认循环缓冲器关闭,从指令存储器中读取返回的指令存入IB或IAB中,当IB、IAB都为空时,默认存入IAB中,当IAB满后,依次再存入IB中。在指令对齐缓冲器和指令缓冲器中均为从低编号缓冲行向高编号缓冲行存储。IAB中的指令读取后,将IB中的缓冲行发送到IAB中。根据本发明的实施例,在发送缓冲行时,从高编号缓冲行向低编号缓冲行依次传输,每次“下沉”一个缓冲行,如IAB[1]写入IAB[0],IB[0]写入IAB[1],IB[1]写入IB[0],IB[n]写入IB[n-1]。同时,只有当IAB[0]整行读取完成后,才执行上述操作。从IAB中读出执行包并送到处理器中的译码模块,当IAB中一行指令被读取后,将IB中的缓冲行发送到IAB中。当循环缓冲器使能后,首先进行循环缓冲器的加载:从IAB中读取执行包的同时,需要将执行包的地址与循环体的首执行包的首指令地址进行比较,若相等,则同时将该执行包所在的指令包,即IAB中的一行,依次写入LB的行中。直到从IAB读取的执行包的地址等于循环体的尾执行包的首指令地址时,将循环体尾执行包所在的指令包行也写入LB的行中。循环体指令在执行第一遍的同时,也完成了循环体在LB中的加载。接下来,进行循环体从循环缓冲器中的读取:此时LB中的指令需要依次写入LAB中,在LAB中进行执行包的读取,LAB中每读取完一行的同时,也将读出的缓冲行写入LB中最后一缓冲行的位置,同时LB中原有缓冲行依次向下前进一行,如LB[1]的内容写入LB[0];LB[0]的内容写入LAB[1],LAB[1]的内容写入LAB[0],即将LB与LAB首尾相接,形成一个循环的缓冲器区。当从LAB中读出的执行包地址等于循环体尾执行包的首指令地址时,若此时对应的循环次数大于1,说明循环体还需要反复执行,则LB与LAB组成的缓冲器区再依次前进一行,下一周期,继续从LAB[0]缓冲行中读取循环体的首执行包的首指令;若此时的循环次数等于1,说明循环体执行到最后一遍,接下来需要读取循环体外的后续指令,因而,此时清空LAB和LB中的内容,关闭循环缓冲器lb_en,切换读缓冲器区域指示信号read_buffer到IAB。将IB中的内容依次写入到IAB中,从IAB中读取指令送往译码级。在循环缓冲器使能时,进行循环加载以及从循环指令读取的过程中,可将IB级IAB关闭,以降低功耗;或者,也可以继续向存储器发起循环体外的后续指令读请求,并依次写入IB中,直到IB满时,再关闭IB以节省功耗。对IB、IAB、LAB、LB和MUX2_1的各种读写和控制操作均由其所在的模块执行。
[0081] 以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步的详细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。