发明内容
针对现有技术中并行微处理器存在未实现Transputer的所有功能的缺陷,本发明要解决的技术问题是提供一种可完全替代Transputer的并行微处理器及其实现方法。
为解决上述技术问题,本发明采用的技术方案是:
本发明并行微处理器,基于FPGA开发,包括:
中央处理器为由取指译码单元、进程管理单元和整数指令执行单元构成的32位定点中央处理器,中央处理器执行指令的预取指和译码操作、负责串行进程和并发进程的调度管理,实现多个进程之间的数据通信;通过通讯模块在多个处理器之间进行数据通信,实现分布式处理器之间的协同工作;
通讯模块,由多组相互独立的LINK通道和In/Out控制器组成,执行主机接口功能,实现与外部处理器通讯;
仲裁控制器,根据取指译码单元、整数指令执行单元、进程管理单元中和通讯模块的总线请求的优先级,对中央处理器的内外部地址总线和数据总线进行仲裁;
外部存储器接口,在仲裁控制器的控制下,对外部存储器提供读/写操作的时序逻辑;
中断/时序控制器,用于对中央处理器提供定时与中断;
内部存储器,提供中央处理器的指令及数据的快速存取;
调试接口,提供对中央处理器内部状态进行分析/调试的功能;
时钟管理单元,生成并行微处理器各种内部时钟。
所述In/Out控制器具有以下结构:
译码控制单元,对中央处理器传送来的In/Out控制信息进行判断,并进一步解析出该执行接收/发送命令的LINK通道、要接收/发送的数据长度以及接收数据的目的地址/发送数据的源地址;
发送控制单元,接收译码控制单元的控制信息,接收通过读存储器控制器得到的存储器数据发送至LINK通道;向读存储器控制器发送读请求和地址;
读存储器控制器,接收发送控制单元输入的命令,发送读请求和地址至读/写存储器仲载器;接收读/写存储器仲载器返回的数据发送至发送控制单元;
写存储器控制器,接收接收控制单元输入的命令,发送写请求和地址至读/写存储器仲载器;
读/写存储器仲载器,对读存储器控制器发送的读请求和写存储器控制器发送的写请求进行仲载;接收存储器数据发送给读存储器控制器;发送存储器数据及存储器地址至仲载控制器;
接收控制单元,接收译码控制单元的控制信息,接收LINK通道的数据,向写存储器控制器发送写请求和地址。
所述取指译码单元具有以下结构:
取指单元,通过仲裁控制器将内部存储器或外部存储器中存放的32位数据转化为4条8位存储器码;
译码单元,将上述存储器码进行译码,译码后的指令存放在指令队列中,同时将该指令的指针存放在指令指针队列中;
指令队列与指令指针队列,均由先进先出队列实现,其写请求控制端与译码单元的指令译出信号相连,读请求控制端接至指令周期设置单元的读指令队列信号;
指令周期设置单元,对要执行指令所需要的指令周期数进行设置,设置周期完成后将指令发射到整数指令执行单元。
所述中央处理器还具有浮点运算单元,其结合32位定点中央处理器构成64位浮点中央处理器;
所述浮点运算单元的构成如下:
浮点运算子单元,接收来自取指译码单元中指令周期设置单元及浮点接口单元送出的浮点指令,根据具体指令的内容选择相应的浮点计算类型对由堆栈中读取的操作数进行相关浮点运算;
堆栈,装载由浮点运算子单元返回的运算结果或数据格式转换模块送来的操作数,负责向数据格式转换模块送出运算结果;接收浮点运算子单元送出的出错信息;
数据格式转换模块,对来自内部或外部存储器的定点操作数进行格式转换,转换结果送至堆栈;
64位浮点中央处理器中的取指译码单元还具有浮点接口单元,对从取指译码单元的指令队列中读取的浮点指令进行分类,实现整数指令执行单元与浮点运算单元的并行工作。
所述浮点运算子单元具有尾数计算模块、指数计算模块、归一化模块、舍入模块、移位模块以及出错处理模块,其中移位模块根据指数计算模块计算结果进行相应的移位操作,同时尾数计算模块通过归一化模块根据移位模块的移位结果进行相应的归一化操作;舍入模块对归一化结果进行相应的舍入操作,舍入结果送至出错处理模块,如果计算错误,则输出出错标志至堆栈。
堆栈采用双堆栈结构,其中一组堆栈用于存储32位位宽的数据或64位位宽的数据,另一组堆栈用于存储数据的长度,两组保持同步出栈或进栈。
本发明并行微处理器实现方法,包括以下步骤:
通过In/Out控制器将启动代码从通讯模块的LINK通道接收并写入内部存储器中;
通过In/Out控制器将启动成功的信息发送至32位定点并行处理器的中央处理器,取指译码单元将从内部存储器读回的数据进行译码,根据整数指令执行单元的忙闲状态将整数指令发送给整数指令执行单元;
整数指令执行单元执行相应指令并启动进程管理功能;
如果取指译码单元发送的是In/Out命令,则In/Out控制器根据接收到的In/Out命令执行相应的操作;
如果通信模块向32位定点并行处理器的中央处理器发送读/写请求,仲裁控制器会根据内部存储器或外部存储器的地址规则对读/写请求进行仲裁;
外部存储器接口接收到读/写请求后根据内部状态机的控制执行相应读/写操作;
中断/时序控制器接收外部存储器接口的数据,并对该数据进行解码,并执行相应的中断。
本发明方法还包括以下步骤:
所述中央处理器为64位浮点中央处理器,取指译码单元将从内部存储器读回的数据进行译码,译码后得到的浮点指令分为0类、1类及2类指令,根据整数指令执行单元和浮点运算单元的忙闲状态将整数指令或浮点指令发送给整数指令执行单元或浮点运算单元;
浮点运算单元也参与执行相应指令并启动进程管理功能;
如果通信模块向64位浮点并行处理器的中央处理器发送读/写请求,仲裁控制器会根据内部存储器或外部存储器的地址规则进行对读/写请求进行仲裁;
所述0类、1类及2类指令为按其执行时所需要的资源情况进行分类:
第0类指令:在执行时只占用定点指令执行模块中的资源;
第1类指令:在执行时只占用浮点运算模块中的资源;
第2类指令:在执行时除了占用浮点运算模块中的资源外,还要占用定点指令执行模块中的部分资源;
其中第0类指令和第1类指令可以并行执行,包括以下两种情况;
1)指令队列中先取出的指令为第0类指令,接着又取出的指令为第1类指令,如果此时浮点运算模块的状态为空闲,则第1类指令和第0类指令同时执行;
2)指令队列中先取出的指令为第1类指令,接着又取出的指令为第0类指令,如果此时定点指令执行模块的状态为空闲,则第0类指令和第1类指令同时执行;
其他情况下,定点指令执行模块与浮点运算模块不可以并行工作。
所述浮点运算单元执行相应指令,包括浮点加、减、乘、除、开方、求余、取整运算以及各种数据类型间的相互转换,其中加、减、乘、除、开方、取整运算的运算结果采用舍入方式得到,求余运算采用以下步骤实现:
判断两个操作为定点还是浮点;
若两个操作数均为浮点,如果被求余数A的指数比除数B的指数大n,则B×2n的指数等于A的指数,将A-B×2n作为下次循环减法的部分被求余数;将A和B的尾数高位对齐,则A-B×2n的结果尾数部分高位为零,通过归一化处理得到A-B×2n之差为A1,A1指数至少能相对A的指数降低1;如果A1指数大于B的指数,则A1为部分余数,则循环上述操作n-1次,直到部分余数An指数小于等于除数B的指数为止;当An指数等于B的指数时,如果An尾数大于B尾数的一半,则将An减去B的差作为最终的余数,否则An就是最终余数,其中n为整数。
所述归一化处理在计算前或者计算结束后进行,一次归一化过程分成两级归一化过程实现:把操作数的尾数均分成若干大段,对尾数部分进行前导零的个数判断;进行相应次数的移位操作,指数部分根据尾数的移位次数同步进行相应的增减操作;每段共享同一个第二级归一化模块;第二级归一化过程包括:对尾数部分进行前导零的个数判断;进行相应次数的移位操作,指数部分根据尾数的移位次数同步进行相应的增减操作。
所述舍入方式包括为单精度数据舍入及双精度数据舍入,其中单精度数据舍入在小数点后第23位开始,双精度舍入在小数点后第52位开始;在舍去数据部分中采用了三个附加位,从舍去数据部分高位到低位依次为保护位、舍入位及粘接位;粘接位是将粘接位其后及粘接位本身全部“或”运算;如果采用就近舍入模式,并且附加位是“100”时,遵循趋偶舍入的原则决定数据有效位是否加1,其中有效位是保护位之前的所有数据。
所述进程管理功能由中央处理器中的进程管理单元实现,包括以下步骤:
以进程为单位,具有高、低两种优先级的进程,分别以0、1进行标识;根据角色的不同将进程划分为父进程与子进程;高优先级进程能够有条件地中断低优先级进程的执行过程;设置四个队列,其中两个分别为高、低优先级进程等待执行队列,剩余两个分别为高、低优先级进程等待时间到队列;将进程分为执行中、处于中断中、准备好等待执行、被去调度等待以及通信中这五种状态;设置五个外部通道,其中四个供外部微处理器之间进行数据传输,一个用于响应上层的请求;
首先一个进程被生成并根据其优先级放置在对应的准备好等待队列中;
当没有正在执行的进程且没有被中断进程时,处于准备好等待状态的进程队列中最先准备好的进程被启动运行,转换为正运行的进程;
进程在运行过程中由于运行时间片到而被重调度回准备好等待队列中;
进程在运行过程中,遇到时间等待指令,则被去调度添加到时间等待队列中,当时间等待队列中的进程等待的时间到后,则被重调度;若当前运行进程为低优先级进程且被重调度的进程为高优先级进程,则这个高优先级进程中断正在运行的低优先级进程;如果当前没有进程正在执行,则该重调度进程直接被调用执行,否则该重调度进程被添加到准备好等待队列中;
当运行的进程遇到等待通道、等待数据通信或等待上层请求时,被去调度;当被去调度的进程所等待的条件准备好后被重调度,若该重调度进程同时处在时间等待队列中,则从时间等待队列中删除该进程;如果当前运行进程为低优先级进程而被重调度的进程为高优先级进程,则该高优先级进程中断正在运行的低优先级进程;如果当前没有进程正在执行,则该重调度的进程直接被调用执行,否则该重调度的进程被添加到准备好等待队列中;
当运行中的进程为低优先级进程时,若遇到高优先级的进程准备好了,则这个低优先级的进程被中断成为被中断的进程;当该中断进程执行结束或被去调度,且当前没有高优先级的进程准备好,则这个被中断进程先被执行。
高优先级进程准备好后中断低优先级的进程包括:
保存并修改当前工作空间地址、指令指针、数据队列的相关寄存器内容;
等待时机中断当前低优先级进程或将该高优先级进程加入到相应待执行队列中执行进程重新调度;
中断处理,保存被中断进程的主要相关信息并修改当前工作空间地址以及指令指针。
所述时间片到而被重调度,即时间片到调度进程包括:保存该进程当前的指令指针,修改相关工作空间内容,将该进程添到等待执行的进程队列中。
所述进程等待时间到后被重调度包括:
当任一时间等待队列中的头进程等待时间到,则将该进程添加到对应等待执行的进程队列中,修改等待时间队列中的相关寄存器以及进程相关地址空间的内容。
所述进程遇到时间等待指令,被去调度添加到时间等待队列中包括:
根据需去调度并添加到对应时间队列的进程的优先级情况以及需要等待的时间,查找对应队列的插入位置,将该进程正确地加入到对应队列中。
所述从时间等待队列中删除进程包括:
一个进程处于等待通道的同时还处于时间等待队列中,若其所等待的通道先准备好,则将该进程添到对应的等待执行队列中,同时将该进程从时间等待队列中删除。
本发明具有以下有益效果及优点:
1.32位定点并行微处理器PN4支持Transputer32位定点并行微处理器的全部定点指令集,64位浮点并行微处理器PN8支持Transputer64位浮点并行微处理器的全部浮点指令集,用OccamII程序设计语言编写的并行程序能够稳定地运行在本发明的PN4和PN8并行微处理器中,便于系统的修改和调试,加快了验证速度,从而为OccamII语言所编写的程序提供了低成本的运行平台;如果配备对应高级语言编译器,由其他高级编程语言编写的程序也可以运行在32位定点并行微处理器PN4和64位浮点并行微处理器PN8中。
2.本发明的32位并行定点微处理器PN4,采用的是自底向上设计法、用VHDL硬件描述语言实现的;而PN4可以实现Transputer T400系列并行定点处理器全部功能。
3.本发明的64位浮点并行微处理器PN8,采用的是自底向上设计法、用VHDL硬件描述语言实现的;而PN8可以实现Transputer T800系列并行浮点处理器全部功能。
具体实施方式
本发明并行微处理器具有两种表现实体,分别为32位定点并行微处理器(PN4)和64位浮点并行微处理器(PN8)。32位并行定点微处理器PN4支持Transputer32位定点并行微处理器的全部定点指令集,64位浮点并行微处理器PN8支持Transputer64位浮点并行微处理器的全部浮点指令集,用OccamII程序设计语言编写的并行程序能够稳定地运行在本发明的PN4和PN8并行微处理器中,从而解决了Occam II并行程序运行的硬件平台问题。
本发明32位定点并行微处理器PN4的结构如图2所示,为不包含浮点运算单元的部分,该处理器主要由中央处理器(CPU)1通讯模块(Link)
2、仲裁控制器(Arbirer)3、外部存储器接口(EMI)4、中断/时序控制器(ITC)5、内部存储器(4K byte ram)6、调试接口(DI)6和时钟管理单元(CMU)8构成。
其中:中央处理器(CPU)1,由取指译码单元(FDU)10、进程管理单元(PMU)11和整数指令执行单元(EU)构成,取指译码单元10根据进程管理单元11传来的取指地址,在仲裁控制器3空闲期间执行指令的预取指和译码操作、进程管理单元11负责PN4/PN8处理器内部串行进程和并发进程的调度管理,实现多个进程之间的数据通信;该单元也可通过Link通讯模块2在多个PN4/PN8处理器之间进行数据通信,实现分布式处理器之间的协同工作;
通讯模块2,由多组(本实施例为4组)相互独立的LINK通道和In/Out控制器组成,执行主机接口功能,实现与外部处理器通讯;
仲裁控制器3,根据取指译码单元10、整数指令执行单元和通讯模块2的总线请求的优先级,对中央处理器(CPU)1的内外部地址总线和数据总线进行仲裁;中央处理器(CPU)1的整数指令执行单元与LINK模块具有等同的高优先级,取指译码单元10中的取指单元(FU)通常具有较低的优先级。根据先来先服务原则对具有等同优先级的请求进行仲裁;高优先级的请求可以打断低优先级的请求。
外部存储器接口4,在仲裁控制器3的控制下,对外部存储器提供读/写操作的时序逻辑;
中断/时序控制器5,用于对中央处理器(CPU)1提供定时与中断;
内部存储器6,提供中央处理器(CPU)1的指令及数据的快速存取;
调试接口7,提供对中央处理器(CPU)1内部状态进行分析/调试的功能;
时钟管理单元8,生成微处理器工作时所需要的各种内部时钟。
如图3所示,所述In/Out控制器具有以下结构:
译码控制单元,对中央处理器(CPU)1传送来的In/Out控制信息进行判断,并进一步解析出该执行接收/发送命令的LINK通道、要接收/发送的数据长度以及接收数据的目的地址/发送数据的源地址;
发送控制单元,接收译码控制单元的控制信息,接收通过读存储器控制器得到的存储器数据发送至LINK通道;向读存储器控制器发送读请求和地址;
读存储器控制器,接收发送控制单元输入的命令,发送读请求和地址至读/写存储器仲载器;接收读/写存储器仲载器返回的数据发送至发送控制单元;
写存储器控制器,接收接收控制单元输入的命令,发送写请求和地址至读/写存储器仲载器;
读/写存储器仲载器,对读存储器控制器发送的读请求和写存储器控制器发送的写请求进行仲载;接收存储器数据发送给读存储器控制器;发送存储器数据及存储器地址至图2中的仲载控制器3;
接收控制单元,接收译码控制单元的控制信息,接收LINK通道的数据,向写存储器控制器发送写请求和地址。
取指译码单元10具有如图4所示的结构:
取指单元12,通过仲裁控制器3将内部存储器6或外部存储器中存放的32位数据d_to_fetch转化为4条8位的存储器码;
译码单元13,将上述存储器码进行译码,译码后的指令存放在指令队列16中,同时将该指令的指针(Iptr)存放在指令指针队列17中;
指令队列16与指令指针队列17均由先进先出队列实现,其写请求控制端与译码单元13的指令译出信号相连,读请求控制端接至指令周期设置单元14的读指令队列信号;
指令周期设置单元14,对要执行指令所需要的指令周期数进行设置,设置周期完成后将指令发送到整数指令执行单元。
如图2所示,本发明64位浮点并行微处理器结构与32位定点并行微处理器不同的是:中央处理器(CPU)1除具有取指译码单元10、进程管理单元11和整数指令执行单元外,还包含浮点运算单元9,取指译码单元根据进程管理单元传来的取指地址,在仲裁控制器3空闲期间执行指令的预取指和译码操作、进程管理单元(PMU)11负责内部串行进程和并发进程的调度管理,实现多个进程之间的数据通信;根据取指译码单元(FDU)10传来的操作码和操作数,执行相应的浮点运算操作,得到所需的浮点运算结果。
通讯模块2、仲裁控制器3、外部存储器接口4、中断/时序控制器5、内部存储器6、调试接口7以及时钟管理单元8之间的连接关系及各自作用均与32位定点并行微处理器相同,这里不作重述。
如图3所示,通讯模块2中的In/Out控制器的结构及作用与32位定点并行微处理器相同,这里不作重述。
如图4所示,所述64位浮点并行微处理器中取指译码单元10除具有32位定点并行微处理器中取指译码单元10的所有结构及连接关系外,还具有浮点接口单元,其对从指令队列16中读取的指令进行分类,实现PN8中整数指令执行单元与浮点运算单元9的并行工作。
上述浮点运算单元9构成如图6所示:
浮点运算子单元18,接收来自取指译码单元10中指令周期设置单元14及浮点接口单元15送出的浮点指令,根据具体指令的内容选择相应的浮点计算类型对由堆栈中读取的操作数进行相关浮点运算;
堆栈19,装载由浮点运算子单元18返回的运算结果或数据格式转换模块送来的操作数,负责向数据格式转换模块送出运算结果;接收浮点运算子单元18送出的出错信息;
数据格式转换模块,对来自内部或外部存储器的定点操作数进行格式转换,转换结果送至堆栈。
上述浮点运算子单元18具有尾数计算模块、指数计算模块、归一化模块、舍入模块、移位模块以及出错处理模块,其中移位模块根据指数计算模块计算结果进行相应的移位操作,同时归一化模块根据移位模块的移位结果进行相应的归一化操作,然后尾数计算模块对归一化模块的归一化结果作计算操作,将计算结果再次放到归一化模块进行归一化操作;舍入模块对归一化结果进行相应的舍入操作,舍入结果送至出错处理模块,如果计算错误,则输出出错标志至堆栈。
上述堆栈19采用双堆栈结构,其中一组堆栈用于存储32位位宽的数据或64位位宽的数据,另一组堆栈用于存储数据的长度,两组保持同步弹栈或压栈。
本发明32位定点并行微处理器、64位浮点并行微处理器共有的相同单元均有相同的实现方法,64位浮点并行微处理器还额外具有对浮点指令执行的实现方法,包括以下步骤:
通过In/Out控制器将启动代码从通讯模块2的LINK通道接收并写入内部存储器中;
通过In/Out控制器将启动成功的信息发送至中央处理器(CPU)1,取指译码单元10将从内部存储器6读回的数据进行译码,译码后得到的指令分为0类、1类及2类指令,根据整数指令执行单元和浮点运算单元9的忙闲状态将整数指令或浮点指令发送给整数指令执行单元或浮点运算单元9;
整数指令执行单元或浮点运算单元9执行相应指令并启动进程管理功能;
如果取指译码单元10发送的是In/Out命令,则In/Out控制器根据接收到的In/Out命令执行相应的操作;
如果通信模块2与中央处理器(CPU)1同时发送读/写请求,仲裁控制器会根据内部存储器或外部存储器的地址规则进行对读/写请求进行仲裁;
外部存储器接口4接收到读/写请求后根据内部状态机的控制执行相应读/写操作;
中断/时序控制器5接收外部存储器接口4的数据,并对该数据进行解码,并执行相应的中断。
所述在64位浮点并行微处理器中,指令按其执行时所需要的资源情况,可以分成三大类:
第0类指令:在执行时只占用整数指令执行模块中的资源;
第1类指令:在执行时只占用浮点运算模块中的资源;
第2类指令:在执行时除了占用浮点运算模块中的资源外,还要占用整数指令执行模块中的部分资源;
其中第0类指令和第1类指令可以并行执行。
如图7所示,所述进程管理功能由中央处理器(CPU)1中的进程管理单元11并行实现,包括以下步骤:
以进程为单位,具有高、低两种优先级的进程,分别以0、1进行标识;根据角色的不同将进程划分为父进程与子进程;高优先级进程能够有条件地中断低优先级进程的执行过程,让其自身优先执行;设置四个队列,其中两个分别为高、低优先级进程等待执行队列,剩余两个分别为高、低优先级进程等待时间到队列;将进程分为执行中、处于中断中、准备好等待执行、被去调度等待以及通信中这五种状态;设置五个外部通道,其中四个供外部微处理器之间进行数据传输,一个用于响应上层的请求;
首先一个进程被生成并根据其优先级放置在对应的准备好等待队列中;
当没有正在执行的进程且没有被中断进程时,处于准备好等待状态的进程队列中最先准备好的进程被启动运行,转换为正运行的进程;
进程在运行过程中由于运行时间片到而被重调度回准备好等待队列中;一个高优先级的进程时钟每1us计一次数,一个低优先级的进程时钟每64us计一次数,高优先级进程时钟每走1024次称为一个时间片,当一个低优先级的进程连续执行两个时间片后,执行到跳转(j)或循环(lend)指令,这个进程将会被重调度回到准备好等待队列中,而队列中最先准备好的进程将会被执行。
进程在运行过程中,遇到时间等待指令,需要等待一段时间,则被去调度添加到时间等待队列中,当时间等待队列中的进程等待的时间到后,则被重调度;若当前运行进程为低优先级进程且被重调度的进程为高优先级进程,则这个高优先级进程中断正在运行的低优先级进程使其自身被优先执行;如果当前没有进程正在执行,处于空闲等待状态,则该重调度进程直接被调用执行,否则该重调度进程被添加到准备好等待队列中;
当运行的进程遇到等待通道、等待数据通信或等待上层请求时,被去调度;当被去调度的进程所等待的条件准备好后被重调度,若该重调度进程同时处在时间等待队列中,则从时间等待队列中删除该进程;如果当前运行进程为低优先级进程而被重调度的进程为高优先级进程,则该高优先级进程中断正在运行的低优先级进程使其自身被优先执行;如果当前没有进程正在执行整个处理器处于空闲等待状态,则该重调度的进程直接被调用执行,否则该重调度的进程被添加到准备好等待队列中;
当运行中的进程为低优先级进程时,若遇到高优先级的进程准备好了,则这个低优先级的进程被中断成为被中断的进程;当该中断进程执行结束或被去调度,且当前没有高优先级的进程准备好,则这个被中断进程先被执行,而不是执行准备好等待队列中的进程。
高优先级进程准备好后中断低优先级的进程包括:
保存并修改当前工作空间地址、指令指针、数据队列的相关寄存器内容;
等待到特定的某些时刻,中断当前低优先级进程(执行中断处理子模块)或将该高优先级进程加入到相应待执行队列中执行进程重新调度;
中断处理,保存被中断进程的主要相关信息,并修改当前工作空间地址以及指令指针。
所述时间片到而被重调度,即时间片到调度进程包括:保存该进程当前的指令指针,修改相关工作空间内容,将该进程添到等待执行的进程队列中。
所述进程等待时间到后被重调度包括:
分为高低优先级两个部分功能子模块。当任一时间等待队列中的头进程等待时间到,则将该进程添加到对应等待执行的进程队列中,修改等待时间队列中的相关寄存器以及进程相关地址空间的内容。
所述进程遇到时间等待指令,被去调度添加到时间等待队列中包括:
根据需要去调度并添加到对应时间队列的进程的优先级情况以及需要等待的时间,查找对应队列的插入位置,将该进程正确地加入到对应队列中,保证头进程为等待时间最短的队列。
所述从时间等待队列中删除进程包括:
一个进程处于等待通道的同时还处于时间等待队列中,若其所等待的通道先准备好,则将该进程添到对应的等待执行队列中,同时将该进程从时间等待队列中删除。
对于64位浮点并行微处理器的实现方法中,浮点运算单元9执行相应指令包括浮点加、减、乘、除、开方、求余、取整运算以及各种数据类型间的相互转换,其中加、减、乘、除、开方、取整运算的运算结果采用舍入方式得到,求余运算采用以下步骤实现:
判断两个操作数为定点数据还是浮点数据;
若两个操作数均为浮点数据,如果被求余数A的指数比除数B的指数大n,则B×2n的指数等于A的指数,将A-B×2n作为下次循环减法的部分被求余数;将A和B的尾数高位对齐,则A-B×2n的结果尾数部分高位为零,通过归一化处理得到A-B×2n之差为A1,A1指数至少能相对A的指数降低1;如果A1指数大于B的指数,则A1为部分余数,则循环上述操作n-1次,直到部分余数An指数小于等于除数B的指数为止;当An指数等于B的指数时,如果An尾数大于B尾数的一半,则将An减去B的差作为最终的余数,否则An就是最终余数,其中n为整数。
所述归一化处理在计算前或者计算结束后进行,一次归一化过程分成两级归一化过程实现:把操作数的尾数均分成若干大段,对尾数部分进行前导零的个数判断;进行相应次数的移位操作,指数部分根据尾数的移位次数同步进行相应的增减操作;每段共享同一个第二级归一化模块;第二级归一化过程包括:对尾数部分进行前导零的个数判断;进行相应次数的移位操作,指数部分根据尾数的移位次数同步进行相应的增减操作。
所述舍入方式包括为单精度数据舍入及双精度数据舍入,其中单精度数据舍入在小数点后第23位开始,双精度舍入在小数点后第52位开始;这样就可以用同一个舍入处理模块通过单双精度控制来完成两类不同的舍入处理,既节省了电路规模也提高了速度。在舍去数据部分中采用了三个附加位,从舍去数据部分高位到低位依次为保护位、舍入位及粘接位;粘接位是将粘接位其后及粘接位本身全部“或”运算;如果采用就近舍入模式,并且附加位是“100”时,遵循趋偶舍入的原则决定数据有效位是否加1,其中有效位是保护位之前的所有数据。
下面分别阐述本发明32位定点并行微处理器及64位浮点并行微处理器中关键部件的工作过程。
1.In/Out控制器
负责控制LINK完成中央处理器(CPU)1传来的接收/发送指令。如图3所示,其具体执行流程是:译码控制单元解析CPU传送来的接收/发送命令,得到该命令是否是LINK的接收/发送命令,如果是LINK的接收/发送命令,进一步会解析出执行接收/发送命令的LINK通道,要接收/发送的数据长度,接收数据的存储器地址/发送数据的存储器地址。
当执行发送命令时,发送控制单元会向相应的LINK通道和读存储器控制器发送命令,读存储器控制器接下来向读/写存储器仲裁器发送读命令和读地址,在数据读回后发送控制单元会将该数据传送给相应的LINK通道,写入该LINK通道的发送FIFO。
执行接收命令时,接收控制单元将从相应LINK通道接收到的数据和写数据地址发送给写存储器控制器,然后写存储器控制器对数据进行必要整理之后发送给存储器读写仲裁,由读/写存储器仲裁器完成写存储器操作。
发送控制单元、接收控制单元都是4通道的模块,它们可以对4组LINK同时执行发送或接收操作。读存储器控制器和写存储器控制器是4通道的模块,它们能处理来自4组LINK的读写请求。
2.中央处理器(CPU)中的取指译码单元
如图4、6所示,PN4/PN8的取指译码单元主要由以下几个子单元构成:取指单元(Fetch Unit)12、译码单元(Decode Unit)13、指令队列(InstructionQueue)16与指令指针队列(Iptr Queue)17、指令周期设置单元(Set CycleUnit)14。PN8内部还有浮点接口单元(Floating Point Interface Unit)15,实现整数指令执行单元与浮点运算单元的并行处理及数据交换。
取指单元12通过仲裁控制器(Arbiter)3将读存储器操作(rd_fetch)信号发送给内部存储器6或外部存储器接口4,并通过仲裁控制器(Arbiter)3将内部或外部存储器中存放的指令(d_to_fetch)发送到取指单元中,取指单元将32bit的d_to_fetch转化为4条8bit存储器码(mem_code),这4条存储器码经过指令译码单元(Decode Unit)10译码后,将译码后的指令(opr_code和opr_data)存放在指令队列(Instruction Queue)16中,同时将该指令的Iptr存放在指令指针队列(Iptr Queue)17中,每次读队列操作(rd_queue)时从队列中取出一条指令(opr_code)和与之对应的操作数(opr_data)并取出与之相对应的下一条指令指针(Iptr)。在周期设置单元(Set Cycle Unit)中对执行该指令所需要的指令周期数进行设置。浮点接口单元(Floating Point Interface)15跟据浮点运算子单元18是否处于空闲状态来决定是否向浮点运算单元9发送浮点指令(opr_code_float),并决定是否需要设置执行该浮点指令所需要的时钟周期(exe_cnt_float)。设置周期完成后将指令发射到整数指令执行单元(Execute Unit)或浮点运算单元9中执行。当指令执行时,每个时钟周期指令周期数减1,exe_cnt减到1时,表示当前定点处理器指令执行完毕;当exe_cnt_float减到1时表示当前浮点运算指令执行完毕。
取指单元12的主要功能是预取指令,取指单元12每次通过仲裁控制器(Arbiter)3由片内存储器6/片外存储器读取32位数据(d_to_fetch),这32位的d_to_fetch由仲裁控制器(Arbiter)3到达取指单元12后,取指单元12将32位的d_to_fetch按字节顺序分解为4条8位的存储器码(mem_code),并每次向译码单元13发送1条存储器码,译码单元13接收到这4条存储器码中的第1条后,取指单元12将会通过仲裁控制器(Arbiter)3读取后续的下一个字地址中的指令。
遇到跳转指令时,取指单元12丢弃已经取到的所有指令,而由跳转地址处重新开始读取指令。
译码单元13将每条指令译为16位的操作码(opr_code)和32位的操作数(opr_data)。每译完一条指令,则产生写队列请求信号(wr_fifo),将16位的操作码和32位的操作数写入到指令队列16中,同时将下一条指令的地址(Iptr)写入到指令指针队列17中。
译码单元12根据存储器码(mem_code)的功能码(存储器码的高4位)来决定一条指令是否已经译出,有下列4种情况:
1)当功能码为2时,将操作数左移4位后加上存储器码中的数据(低4位)得到新的操作数,无指令译出;
2)当功能码为6时,将操作数左移4位后加上存储器码中的数据(低4位)后,按位取反后得到新的操作数,无指令译出;
3)当功能码为0、1、3、4、5、7、8、9、A、B、C、D和E时,将操作数左移4位后加上存储器码中的数据(低4位)得到新的操作数,指令译出,将16位的操作码和32位的操作数写入到指令队列中,同时将下一条指令的地址写入到指令指针队列中;
4)当功能码为F时,功能码和操作数一同来表示操作码,指令译出,将16位的操作码和32位的操作数写入到指令队列中,同时将下一条指令的地址写入到指令指针队列中。
以下两个实例详细说明了译码单元的工作过程:
实例1:如果译码前,存储器码为41,那么译码后,操作码为x0040;操作数为x00000001。如果译码前,存储器码序列为22,23,24、53,那么译码后,操作码为x0050;操作数为x00002345。如果译码前,存储器码序列为23,FB,那么译码后,操作码为x23FB;操作数为x00000000。
实例2:如果在地址x80000070处存放的x33F6BA21、地址x80000074处存放的是72FA2446,那么译码后将得到如下操作码、操作数以及下一条指令的地址(Iptr):
操作码x00B0,操作数x0000001A,下一条指令地址x80000072;
操作码x00F6,操作数x00000000,下一条指令地址x80000073;
操作码x0030,操作数x00000003,下一条指令地址x80000074;
操作码x0040,操作数x00000006,下一条指令地址x80000075;
操作码x24FA,操作数x00000000,下一条指令地址x80000077;
操作码x0070,操作数x00000002,下一条指令地址x80000078。
译码单元12将上述操作码、操作数按顺序写入到指令队列中,并且将下一条指令的地址写入到指令指针队列17中。
3.指令队列与指令指针队列单元(Instruction Queue & Iptr Queue)
指令队列16和指令指针队列17均由先进先出队列(FIFO)实现,其深度均为256。
指令队列16的数据宽度为48用于存放16位的操作码(opr_code)和32位的操作数(opr_data);
指令指针队列17的宽度为32,用于存放下一条指令的地址(Iptr)。
指令队列16和指令指针队列17的清空控制端接在复位信号和跳转信号上,用于重新开始填充指令队列16和指令指针队列17。
指令队列16和指令指针队列17的写请求控制端接在译码单元13产生的指令译出信号上,只要有指令译出,则将译出的指令和下一条指令的地址分别写入到指令队列16和指令指针队列17中。
指令队列16和指令指针队列17的读请求控制端接在指令周期设置单元的读指令队列信号上。
每次读队列信号有效后,由指令队列16读出的指令并不立即发射到指令执行单元中执行,而是发送到指令周期设置单元,待指令周期设置单元设置好该指令将要执行的周期数后,才开始执行。
4.指令周期设置单元(Set Cycle Unit)
在指令周期设置单元14中,有一个6位的指令周期寄存器,用于记录距当前指令结束还差几个周期。当设置周期信号被置1时,指令周期寄存器被赋值,即指令周期寄存器中存放的是执行该指令所需时钟周期数,在指令的执行过程中,每个时钟周期指令周期寄存器进行减1操作,当指令周期寄存器的值减为1时,表示这条指令已经执行完毕。
该单元执行主要受以下几个关键信号控制:
1)读指令队列信号:用于预先从指令队列16中取出下一条指令。当从指令队列16中取出的指令的指令周期数已经为1时,则读队列信号有效;否则,当从指令队列16中取出的指令的指令周期数大于1时,则当该指令执行到指令周期数减为1时,读队列信号有效。
2)设置指令周期信号:用于给从指令队列16中取得的下一条指令设置指令周期寄存器初值。读指令队列信号延迟一个时钟周期即为设置周期信号。
3)执行停止信号:根据某条指令运行时某几个寄存器的状态来决定当前指令是否应该结束运行,从而实现变长周期指令。如果完成某条指令所需的周期数不是一个定值,例如移位、乘法、归一化等指令,完成这类指令所需的周期数通常是由某几个寄存器中的值所决定,这类指令的指令周期寄存器初值被设置成全1,即6位二进制数的最大值,在指令的执行过程中产生执行停止信号,使指令周期寄存器被设置为1,从而表示这类变长周期的指令已经执行完毕。
4)执行暂停信号:用于暂停某条指令的执行,从而解决某一时刻的处理器资源冲突。在指令的执行过程中,如果该条指令执行到某个时钟周期时,无法得到该指令继续执行所需要的全部资源,则生成执行暂停信号,该信号用于停止指令周期寄存器的减1操作,从而暂停这条指令的执行,直到该指令得到其运行所需要的全部资源。例如,某条指令在其执行的第i个周期对外部存储器发出读写请求,外部慢速存储器无法在一个时钟内完成读写,则该指令将会暂停在第i+1个指令周期,在第i+1个周期的末尾,该指令对存储器完成读写后,该指令继续执行。
5.浮点接口单元(Floating Point Unit)
浮点接口单元15负责整数执行模块与浮点运算模块间的通讯,从而实现PN8处理器中整数指令执行模块与浮点运算模块的并行工作。
在PN8中,指令按其执行时所需要的资源情况,可以分成三大类:
第0类指令:在执行时只占用整数指令执行模块中的资源;
第1类指令:在执行时只占用浮点运算模块中的资源;
第2类指令:在执行时除了占用浮点运算模块中的资源外,还要占用整数指令执行模块中的部分资源。
其中第0类指令和第1类指令可以并行执行。
从指令队列中每次取出一条指令后,将其按照上述的分类方法进行分类后,再根据当前整数指令执行模块和浮点运算模块的空闲或忙的状态来决定是否将指令发射到整数指令执行模块或浮点运算模块去执行。
只有在以下两种情况下,整数指令执行模块与浮点运算模块可以并行工作:
1)指令队列中先取出的指令为第0类指令,接着又取出的指令为第1类指令,如果此时浮点运算模块的状态为空闲,则第1类指令和第0类指令同时执行;
2)指令队列中先取出的指令为第1类指令,接着又取出的指令为第0类指令,如果此时整数指令执行模块的状态为空闲,则第0类指令和第1类指令同时执行。
其他情况下,整数指令执行模块与浮点运算模块不可以并行工作。
6.进程管理单元
程序的运行是以进程为单位的,进程管理单元11共有高低两种优先级的进程,分别以0、1标识;其中由角色的不同还分为父进程与子进程;高优先级进程可以有条件地中断低优先级进程的执行过程,让其自身优先执行;进程管理单元共有四个队列,其中两个分别为高、低优先级进程等待执行队列,剩余两个分别为高、低优先级进程等待时间到队列;在进程管理单元11中,进程分为执行中、处于中断中、准备好等待执行、被去调度等待、以及通信中这五种状态;进程管理单元11共设有五个外部通道,其中四个供cpu之间进行数据传输,一个用于响应上层的请求。
一个进程首先被生成并放置在准备好等待队列中(根据它的优先级放置在对应队列中);在处理器内没有正在执行的进程且没有被中断进程存在的情况下,准备好处于等待状态的进程队列中最先准备好的进程将会被启动运行,转换为正运行的进程。
进程在运行过程中会因为运行时间片到而被重调度回到准备好等待队列中:一个高优先级的进程时钟每1us计一次数,一个低优先级的进程时钟每64us计一次数,高优先级进程时钟每走1024次称为一个时间片,当一个低优先级的进程连续执行两个时间片后,执行到跳转(j)或循环(lend)指令,这个进程将会被重调度回到准备好等待队列中,而队列中最先准备好的进程将会被执行。
进程在执行过程中,遇到时间等待指令,需要等待一段时间,则会被去调度添加到时间等待队列中,当等待队列中的进程等待的时间到后,则会被重调度,若此刻运行进程为低优先级进程而等待时间到被重调度的进程为高优先级进程,则这个高优先级进程将会中断正在运行的低优先级进程使其自身被优先执行,同时,如果此刻没有进程正在执行整个处理器处于空闲等待状态,则该时间到的进程直接被调用执行,否则该时间到的进程被添加到准备好等待队列中。
当运行的进程遇到等待通道、等待数据通信或等待event请求时则会被去调度,当被去调度的进程所等待的条件准备好后则会被重调度,同样若此刻运行进程为低优先级进程而等待时间到被重调度的进程为高优先级进程,则这个高优先级进程将会中断正在运行的低优先级进程使其自身被优先执行,同时,如果此刻没有进程正在执行整个处理器处于空闲等待状态,则该重调度的进程直接被调用执行,否则该重调度的进程被添加到准备好等待队列中。
由前面讲述到当运行中的进程为低优先级进程时,若遇到高优先级的进程准备好了,则这个低优先级的进程就会被中断,变为被中断的进程,当这个运行的进程执行结束或被去调度了,且当前没有高优先级的进程准备好了,则这个被中断的进程将会先被执行,而不是执行准备好等待队列中的进程。
负责进程调度的指令有如下5种,分别为runp、stopp、startp、endp、ldpri。
runp和stopp这一对指令可分别启动或挂起一个父进程,runp则是根据相关寄存器的内容为新启动的进程分配对应的工作空间和指令指针,stopp则无条件的挂起该进程;而startp和endp这一对指令则可在当前的父进程的基础上生成或挂起子进程,startp在父进程工作空间的基础上根据寄存器的给出的指令指针启动若干个子进程,而endp则根据父进程某一工作空间中所存储的值来决定是结束前的子进程还是结束并返回父进程执行;由Ldpri指令可获取当前的进程的优先级状态。
执行进程channel guard和skip guard功能,需要使用如下8条指令:alt、altwt、altend、enbs、diss、resetch、enbc、disc。
通过alt指令的执行,可让当前进程进入alt结构中;altwt则保存一些参数并使进程去调度从而进入等待channel guard和skip guard ready的状态;enbs和diss这对指令则负责进程的skip guard的使能和去使能工作;resetch指令则可让要用的相关通道初始化为空状态,留给进程备用;同理enbc和disc这对指令负责进程的channel guard进行使能和去使能。
与进程时间等待相关的操作指令包括:sttimer、ldtimer、tin、talt、taltwt、enbt、dist。
sttimer负责设置两个优先级时钟的计数初始值;通过ldtimer指令可获取到当前优先级进程的时钟值,再经过某些运算后由tin指令可将数值存入当前进程的工作空间的某一位置上,作为该进程进入时间等待的参考时间;通过talt指令可让当前进程进入包含时间等待的alt结构中,taltwt则保存一些参数并使进程进入时间等待状态;其中enbt指令则负责使能alt的timerguard等待,dist则负责对timer guard的等待去使能,根据当前时间和存储空间中的时间值判断进程的时间等待是否完成。
执行进程工作空间、指令空间的控制操作的指令包括:ldpi、call、ret、gajw、gcall、lend。
Ldpri指令则可获取当前的指令指针位置;call和ret指令为一对可调整进程的工作空间和指令空间,ret负责call调整后的返回原空间;gajw单独的实现进程的工作空间调整;gcall则单独的实现进程指令空间的调整;lend则使进程循环执行某个功能块。
cpu内外部进程的数据通信指令包括:move、in、out、outword、outbyte。
move指令旨在完成进程内部的数据块搬移;in、out这两个指令则分为cpu内部两个进程之间的通讯模式和与外部cpu间的通讯模式,当为cpu内两个进程的通讯模式时,它们两个配对使用,只有当两个进程都准备好时才实现进程间的数据块搬移;outword、outbyte这两条指令实现的功能和out的功能类似,不同的是它们并不是数据块的搬移,而是通过channel将寄存器中存放的某个字或者字节存储到另一进程或其它cpu指定的某个存储空间中。
如图7所示,进程管理单元(PMU)各个事件处理子模块间关系如下:
数据搬移:完成cpu内部的进程间通信,以及内部数据模块的搬移功能。
高优先级进程准备运行:当有一个高优先级的进程准备好,等待运行,而此刻正在运行的进程为低优先级的进程,则此刻将启动Run_hi子模块,保存并修改当前工作空间地址、指令指针以及队列的相关寄存器和空间内容,等待到某些特定时刻,中断当前低优先级进程(执行中断处理子模块)或将此高优先级进程加入到对应待执行队列中(Reschedule_p执行进程重新调度子模块)。
中断处理:保存被中断进程的主要相关信息(含浮点控制的cpu略有不同),并修改当前工作空间地址以及指令指针。
启动一个新进程:从等待执行的进程队列中弹出一个进程运行,修改当前工作空间地址、指令指针以及队列的相关寄存器和空间内容。
时间片到调度进程:保存该进程当前的指令指针,修改相关工作空间内容,将该进程添到等待执行的进程队列中。
进程去调度到时间队列:根据需要去调度并添加到对应时间队列的进程的优先级情况以及需要等待的时间,查找对应队列的插入位置,将该进程正确地加入到对应队列中,保证头进程为等待时间最短的队列。
进程从时间队列中重调度:分为高低优先级两个部分功能子模块。当任一队列中的头进程等待时间到,则将该进程添加到对应等待执行的进程队列中,修改等待时间队列中的相关寄存器以及地址空间的内容。
进程等待通道被去调度:若一个进程处于等待通道的状态中,当其等待的通道准备好了,则需要执行该功能子模块,将该进程添加到对应的等待执行的进程队列中。
从时间队列中删除进程:若一个处于等待通道准备好的进程同时也等待时间、即也在时间等待队列中,而它所等待的通道先准备好,则在将该进程添到对应的等待执行队列中的同时也需要执行该功能子模块将该进程从时间等待队列中删除。
直接运行进程:当一个进程去调度结束被重调度时,若当前cpu为空闲态(即没有进程在执行),则不将该进程添到对应的等待执行的进程队列中,而是直接调度该进程运行。
进程重新调度:若需进行重调度的进程为高优先级进程且当前运行的进程为低优先级,则还需运行高优先级进程准备运行功能子模块,否则将该进程添到对应队列,并修改相关寄存器内容。
对于处于被去调度等待状态的进程主要有以下四种情况会执行进程重新调度子模块:
1)32位定点并行处理器PN4和64位浮点并行处理器PN8都设有四个Link通道:当任一通道有数据到来等待被接收,则将通道非空标志置上;如有进程正处于等待对应Link通道准备完毕的状态,则将该进程重新调度,添加到对应的准备好待执行队列中;若该进程同时也处在等待时间队列中,则还需执行从时间队列中删除进程子模块将该进程从等待队列中删除。
2)当外部有Event通道请求(evrq)信号到达:若此刻有进程等待与Event通道进行通信、或者是在等待该通道准备完毕而处于等待状态,都将该进程重新调度添到对应的准备好待执行队列中;若该进程同时也处在等待时间队列中,则还需执行从时间队列中删除进程子模块将该进程从等待队列中删除)。
3)当进程A需要与进程B进行内部通信(这里假设进程A先准备好,B后准备好)时:先准备好的进程A将会被去调度,进程A处于等待B进程准备好的状态,当B进程也准备好后两个进程开始通信(执行数据搬移子模块功能),当通信结束后,由进程B负责将进程A重新调度添到对应的准备好待执行队列中。
4)当时间队列中的头进程等待的时间到了,则将该进程重新调度添到对应的准备好等待执行队列中。若某一进程与其它处理器进行通信,则通信完成后,需将其自身进行重新调度并添到对应的准备好等待执行队列中。
7.仲裁控制器
在PN4/PN8的内部有三个独立的模块/单元会对片内存储器/片外存储器进行读写操作。这三个模块/单元分别是读写操作模块(这里指整数指令执行单元和进程管理单元中涉及到存储器读写操作的硬件)、通讯模块2和取指译码单元10中的取指单元12。仲裁控制器3负责将来自取指单元12的读请求、读写操作模块的读请求/写请求和通讯模块2的读请求/写请求按一定的优先顺序发送到内部存储器6或外部存储器接口4;并将由内部存储器6或外部存储器读回的指令或数据,分发给取指单元12,读写操作模块和Link通讯模块2。
读写操作模块、link通讯模块2和取指单元12的工作特点如下:
通讯模块2:由于与PN4/PN8直接相连接的其他PN4/PN8会以不确定的时机和PN4/PN8进行通讯,导致通讯模块2体现出一定的实时性,通讯模块2一旦有数据发送或接收就会立即要求对存储器进行读或写操作。
读写操作模块:由于通讯模块2通讯时机的不确定性,受通讯模块2所控制的处理器中指令执行状态和调度状态也会体现出不确定性,进而导致读写操作模块对存储器的读写时机具有一定的不确定性。通讯模块2对存储器进行读写操作时,会暂停读写操作模块的执行,读写操作模块会通过in/out指令来控制通讯模块2工作,所以读写操作模块和通讯模块2不会同时进行存储器的读写操作。
取指单元12:在读写操作模块和link模块不占用总线时开始占用总线,直到指令队列被填充满时暂停占用总线。
仲裁控制器根据这三个模块/单元的工作特点,将其划分为高/低两个优先级:为确保读写操作模块和通讯模块2的实时性,将二者划分为高优先级;取指单元12在读写操作模块和通讯模块2不占用总线时才工作,故将其划分为低优先级。
存储器读写操作的优先级仲裁方式:高优先级存储器读写操作没有完成时,如果有低优先级存储器读写操作,则在高优先级存储器完成后,立即开始低优先级存储器读写操作;高优先级存储器读写操作与低优先级存储器读写操作同时出现,高优先级的存储器读写操作立即得到响应,待高优先级的存储器读写操作完成后,开始低优先级的存储器读写操作;低优先级存储器读写操作没有完成时,如果有高优先级存储器读写操作,低优先级的存储器读写操作被高优先级的存储器读写操作所中断,在高优先级的存储器读写操作完成后,重新开始被中断的低优先级存储器读写操作。
通过存储器读写操作的优先级仲裁,可以在确保link模块和读写操作模块实时性的前提下,最大化的利用PN4/PN8的数据总线和地址总线。
8.64位浮点运算单元(FPU)
浮点运算单元(FPU)9如图6所示,PN8由PN4所有功能模块和FPU组成,包括浮点运算子单元18和堆栈19,该堆栈19为具有三层深度的双堆栈结构。
64位的浮点运算子单元18的主要工作是处理浮点格式数据的加、减、乘、除、开方、取余数、取整运算以及负责整数与浮点格式数据之间的转换。该FPU能够对操作数的无效操作、除以零、上溢等异常情况做出相应的异常处理,遵循IEEE754标准所规定的相关浮点运算规则。该FPU所用到的浮点数据分为单精度格式和双精度格式的浮点数据,包括了归一化数据、非归一化数据、无穷大以及非数,完全符合IEEE754标准所规定的相关浮点数据规则。
双堆栈结构中一组堆栈是64位位宽的数据堆栈寄存器,另外一组堆栈是1位位宽的数据长度堆栈寄存器。三层结构的数据堆栈寄存器分别命名为FAreg、FBreg、FCreg,寄存器数据为64位位宽,其中每一个寄存器既能保存32位数据,又能保存64位数据;同理,三层结构的数据长度堆栈寄存器分别被命名为FAlength,FBlength,FClength。在堆栈的弹栈和压栈过程中,数据长度堆栈寄存器跟随数据堆栈寄存器保持同步操作,当浮点数据装载到数据堆栈寄存器或者从数据堆栈寄存器弹出时,数据长度堆栈中对应层的长度寄存器也作出相应的变化。
FPU与取指译码单元10之间通过指令周期设置单元14、浮点接口单元15与32位宽度的数据总线、指令命令控制线及指令周期计数控制线相连接。1类指令的指令命令opr_code_float和指令执行周期计数exe_cnt_float由浮点接口单元给出,2类指令的指令命令opr_code和指令执行周期计数exe_cnt由指令周期设置单元给出。
通用的内部寄存器主要有两个:RN,FP_Error_Flag。FPU的缺省舍入方式是RN=“01”(就近舍入),如果计算指令需要用到其它舍入方式时,需要在该计算指令前置一条设置舍入方式的指令(fpurn,fpurz,fpurp,fpurm),用来特别指明舍入方式,指令通过设置RN的值来达到改变舍入方式的目的。有的指令运行过程中会影响到FP_Error_Flag的状态,我们将此类指令运行结束时的Error_Flag与上一条指令的FP_Error_Flag进行“或”操作,通过fpchkerror和fptesterror指令可以检测FP_Error_Flag的状态,并且传递给CPU的E_Flag或者Areg。
高效求余的方法:
若两个浮点格式的数据做求余数操作,余数是精确结果,不涉及舍入处理。如果按照整数求余数的方式做,即A作为被求余数,B作为除数,A除以B的整数商与B的乘积作为减数,二者做减法运算,能够得到精确的余数;然而,对于浮点数据,减法和乘除运算都涉及到舍入处理,只能得到近似的结果。由于余数必须是精确的,因此,整数求余数的思路直接套用到浮点求余数运算中是行不通的。
本发明方法首先从求余数最原始思路入手进行分析,用除数循环对被求余数A做减法运算,直到被求余数的绝对值不大于除数绝对值的一半为止。如果两个数据相差很多,比如A=21023,B=1,则按照这种方法做的话,大约做21023次减法运算才能得到最终余数,在本浮点处理单元中做一次浮点减法的时间是80ns,那么做21023次减法运算需要7.19×10300秒,显然这对系统的速度要求是不可以接受的。对于双精度浮点数据,两个极大和极小的数据指数相差能达到2047,按照原始的求余方法,所用的时间就更多,所以,为了用相对比较短的时间计算出精确的余数,有必要优化求余数的算法。
遵循原始循环减法的方式来求余数,如果被求余数A的指数比除数B的指数大n,则B×2n的指数等于A的指数,将A-B×2n作为下次循环减法的部分被求余数。由于A和B的尾数高位对齐,则A-B×2n的结果尾数部分高位一定为零,通过归一化处理得到A-B×2n之差A1,A1指数至少能相对A的指数降低1。如果A1指数大于B的指数,我们称A1为部分余数,则循环上述操作n-1次,直到部分余数An指数小于等于除数B的指数为止。当An指数等于B的指数时,如果An尾数大于B尾数的一半,则需要将An减去B的差An+1作为最终的余数,否则An就是最终余数。对于满足IEEE754标准的双精度浮点数据,极大和极小的指数相差2047,按照本设计的思路,做一次减法操作部分余数的指数至少能减少1,按一次减法部分余数指数减少1计算,最坏情况做2047次循环减法运算就可以求出精确的余数结果,最坏情况耗时1.6376×10-4秒,求余数指令运行速度完全满足本系统的需要。
归一化过程的分级实现:
浮点数据的归一化,即是对尾数部分进行前导零的个数判断,然后进行相应次数的移位操作,指数部分根据尾数的移位次数同步进行相应的增减操作。在进行计算前或者计算结束后,为了统一数据的格式,都有必要对非归一化格式的浮点数据进行归一化处理。
如果按照常规方法进行归一化处理,不仅需要耗费较长的时间,而且占用的芯片资源也较大。本发明将一次归一化过程分成两级归一化过程实现,从而能够使归一化时间以及占用芯片资源达到最优。如果对一个非归一化数据进行归一化处理,则先把此数据的尾数均分成若干大段(第n段,第n-1段,......,第1段),这叫第一级归一化过程,并进行大段的归一化处理;每大段共享同一个第二级归一化模块,第二级归一化模块用来进行每小段尾数的归一化处理。具体实现时,首先进行第一级归一化过程,依次从最高段第n段开始判断,如果第n段全零,然后判断下一相邻低位段即第n-1段,以此类推,如果判断到不全为零的尾数段,则转入该段进行第二级归一化处理。通过分级归一化处理实现的归一化,时间缩短为原来的1/n,所占用的芯片资源也减少为原来的1/n,这种方法能够使占用的芯片资源和时间达到最优的平衡点。
复用的舍入处理模块:
若舍入处理按照二次舍入的方法实现,虽然在精度上不会出现误差,但如果进行两次舍入的话,不但逻辑规模开销大而且延时开销也大。因此本发明采用了分别舍入的方法,也就是说单精度的舍入在小数点后第23位开始,双精度舍入在小数点后第52位开始。这样就可以用同一个舍入处理模块通过单双精度控制来完成两类不同的舍入处理,既节省了电路规模也提高了速度。在舍去数据部分中采用了三个附加位,从舍去数据部分高位到低位依次为保护位、舍入位及粘接位;粘接位是将粘接位其后及粘接位本身全部“或”运算;如果采用就近舍入模式,并且附加位是“100”时,遵循趋偶舍入的原则决定数据有效位是否加1,其中有效位是保护位之前的所有数据。