一种具有快速数据旁路结构的四级流水线RISC-V处理器的制作方法

文档序号:17988354发布日期:2019-06-22 00:35阅读:643来源:国知局
一种具有快速数据旁路结构的四级流水线RISC-V处理器的制作方法

本发明涉及数字集成电路设计领域,更具体地,涉及一种具有快速数据旁路结构的四级流水线risc-v处理器。



背景技术:

近年来,随着物联网技术的快速发展,市场对用于智能终端上的低功耗、高性能处理器需求越来越大。如何在降低成本与功耗的同时满足智能终端对处理器的性能需求,是一个较为热门的研究方向。risc-v指令集是基于精简指令集计算(risc)原理建立的开源指令集架构(isa)。相比于主流的arm和x86指令集,risc-v具有以下优点:

1.risc-v基金会不收取任何授权费,risc-v指令集本身完全开源,使用bsd协议。这一点很大程度上降低了处理器的成本。

2.采用简洁与先进的设计理念,摒弃了上个世纪中一些不合理的isa设计思想,使用了计算机体系结构经过多年发展所积累的比较成熟的技术与理论,并且没有背负向后兼容的历史包袱。

3.有很多开源的risc-v处理器实现,而arm和x86处理器要么根本不开源,要么不允许对其修改,这使得risc-v具有较低的学习成本。

4.risc-v基金会负责对工具链进行维护,并且所有的工具链也是开源的。因此硬件设计人员无需担心工具链的开发以及兼容性问题,只需专注于硬件设计,这也大大减轻了处理器的成本。

目前我国仅有少量专利涉及到risccpu的架构设计。授权公告号为cn102221991a的发明专利公开了一种4位risc微控制器;授权公告号为cn101221494a的发明专利公开了一种新型的8位risc微控制器;授权公告号为cn102262611b的发明专利公开了一种16位的risccpu系统结构。这些低于32位的微处理器在处理常见的32位变量的算术运算时往往需要多条指令,性能难以达到需求。

32位微处理器具有强大的数值运算和寻址功能,它能够覆盖8位和16位微处理器的所有功能,因此在物联网智能终端中所占的份额越来越大。授权公告号为cn101256546a的发明专利公开了一种32位微处理器,但是其使用的指令集是发明人自己定义的,不具有通用性,而且没有配套的工具链支持。

综上所述,为了降低智能终端设备上微处理器的设计和研发成本,增强其通用性,需要设计一种新型的基于risc-v指令集的32位cpu。



技术实现要素:

针对现有的微处理器结构存在的不足和物联网这个特定的应用场景,本发明提出了一种具有快速数据旁路结构的四级流水线risc-v处理器。本发明通过结合risc-v指令集的特性,对各级流水线单元的内部结构与控制信号进行了改进,达到了在满足性能要求的前提下尽量降低芯片功耗与面积的目的。

本发明提出一种具有快速数据旁路结构的四级流水线risc-v处理器,本发明采用的技术方案是:

本发明提出的一种具有快速数据旁路结构的四级流水线risc-v处理器,其特征在于,包括可根据指令类型动态调整的总长为四级的四级流水线结构、访存单元、异常/中断处理单元、若干个寄存器、存储器,

所述的存储器包括指令存储器和数据存储器;

所述的寄存器包括通用寄存器,用于暂存数据与传送数据;

所述的访存单元与指令存储器、数据存储器直接相连,向指令存储器和数据存储器发送读写命令,将指令存储器和数据存储器传来的反馈信号发送给写回模块;

所述的异常/中断处理单元用于检测cpu在执行指令时遇到的异常以及接收外部向cpu传来的中断信号,然后根据不同的异常原因和中断源决定cpu执行的异常/中断服务函数;

所述的四级流水线结构分别为取指模块、译码模块、执行模块和写回模块,取指模块能根据当前周期从指令存储器中取回的指令以及外部控制信号生成下一条指令的pc;译码模块用于提取出指令的操作码、功能码、源寄存器、目的寄存器和立即数,并从通用寄存器中取值;执行模块负责执行各种算数运算;写回模块用于记录访存指令的信息并将从存储器中读取到的数据写入通用寄存器。

存储器与cpu之间的数据总线和地址总线宽度均为32位。

流水线的第一级为取指模块,包括pc寄存器、指令暂存单元、压缩指令扩展单元、返回地址线和分支预测单元,所述的pc寄存器中存储了当前周期中指令存储器传给取指模块的指令对应的pc;所述的指令暂存单元用于存储取出的32位数据的高16位并将其与取出的32位数据的低16位组成32位数据传给压缩指令扩展单元;

所述的压缩指令扩展单元用于判断指令暂存单元传过来的32位数据的低16位是否为一条压缩指令,若是压缩指令则将其扩展为32位的普通指令;否则不做任何处理;

所述的返回地址栈用于存放程序在调用函数时使用的返回地址;

所述的分支预测单元用于当取指模块从指令存储器中取回的指令是跳转指令时,分支预测单元会对跳转指令的下一条指令pc进行预测。取指模块能根据当前周期从指令存储器中取回的指令以及外部控制信号生成下一条指令的程序计数器(programcounter,pc),并且在当前周期向指令存储器发送下一条指令的pc和取指命令,这样在下个周期内指令存储器可以输出下一条指令。若当前周期取出的指令为跳转指令,则取指模块中的分支预测单元会根据跳转指令中的部分信息来预测出下一条指令的pc值,而不是简单地将pc递增。

流水线的第二级为译码模块,包括译码模块包括指令信息提取单元和跳转指令处理单元。译码模块用于提取出指令的操作码、功能码、源寄存器、目的寄存器和立即数,并且对跳转指令进行处理。译码模块中的指令所使用的源寄存器可能等于执行或写回模块中的指令所使用的目的寄存器,这种情况为raw冲突;译码模块中的指令所使用的目的寄存器可能等于执行或写回模块中的指令所使用的目的寄存器,这种情况为waw冲突。因此译码模块还要根据具体情况决定是采取转发策略还是暂停部分流水线。

流水线的第三级为执行模块。执行模块中包括加法器、桶形移位器、逻辑运算器、硬件乘法器和除法控制器。当执行模块中的指令要计算乘除法时,无法在一个周期内计算完毕,这种情况下必须向流水线的第一级和第二级发送暂停信号,防止下一条指令进入第三级。对于不需要访存的指令,其运行到流水线第三级时就已经被执行完毕,不需要进入流水线第四级。

流水线的第四级为写回模块。写回模块用于记录访存指令的信息并将访存单元读取到的数据写回通用寄存器。

访存单元与指令和数据存储器直接相连,向存储器发送读写命令,将存储器传来的反馈信号发送给写回模块。

优选的,所述的跳转指令包括无条件直接跳转指令jal、无条件间接跳转指令jalr、有条件直接跳转指令bxx。

优选的,所述的执行模块使用了通用寄存器的写端口1将需要的数据写入通用寄存器,需要访存的指令会进入第四级流水线。

优选的,所述的写回模块使用通用寄存器的写端口2将load型指令从存储器中读取的数据写入通用寄存器。

优选的,所述的中断信号来源于cpu控制的各种外设,包括但不限于定时器、模数/数模转换器、通用io、通用异步收发传输器和串行设备接口。

优选的,在处理器运行过程中,译码模块将检查指令的编码是否符合risc-v的规定,若不符合则提醒异常;执行模块在计算除法之前将检测除数是否为0,若是0则提醒异常;访存单元向存储器发送读/写命令之前将检测要访问的地址是否对齐,若不对齐则提醒异常;异常/中断处理单元记录引起异常的指令和pc,并选择异常处理函数。当外部传来中断信号时,为了达到迅速响应中断的目的,异常/中断处理单元会记录写回模块或执行模块中的指令pc,并且根据外部中断的编号选择跳转到某个中断处理函数。

与现有技术相比,本发明技术方案的有益效果是:

(1)本发明提供的具有快速数据旁路结构的四级流水线risc-v处理器使得不需要访存的指令只用到了流水线的前三级而不会进入流水线第四级,这样指令的计算结果能更早的被写入通用寄存器。相比于传统的四级流水线结构,本发明提出的流水线结构简化了数据转发的控制逻辑,并且减少了第三级和第四级之间的信息传递。

(2)对于与后续指令之间不存在写后读(readafterwrite,raw)或写后写(writeafterwrite,waw)冲突的访存指令,当其需要多个周期才能被执行完毕时,不会暂停前三级流水线,大大提高了处理器性能。

(3)结合risc-v指令集以及编译器的特性,使用了结构非常简单的分支预测单元,在不占用过多硬件资源的同时具有较高的预测正确率,减少了控制冒险出现的频率。

附图说明

图1是本发明提供的具有快速数据旁路结构的四级流水线risc-v处理器的cpu内核总架构框图;

图2是本发明提供的具有快速数据旁路结构的四级流水线risc-v处理器的取指模块结构图;

图3是本发明提供的具有快速数据旁路结构的四级流水线risc-v处理器的译码模块结构图;

图4是本发明提供的具有快速数据旁路结构的四级流水线risc-v处理器的执行模块结构图;

图5是本发明提供的具有快速数据旁路结构的四级流水线risc-v处理器的写回模块结构图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,仅用于示例性说明,不能理解为对本专利的限制。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

下面结合附图和实施例对本发明的技术方案做进一步的说明。

实施例1

本实施例提供本发明提出的一种具有快速数据旁路结构的四级流水线risc-v处理器包括可根据指令类型动态调整的总长为四级的四级流水线结构、访存单元、异常/中断处理单元、指令存储器和数据存储器。存储器与cpu之间的数据总线和地址总线宽度均为32位。

流水线的第一级为取指模块。取指模块的作用是不断地根据程序的运行情况从指令存储器中取出cpu要执行的指令。取指模块包括以下部分:

1.pc寄存器

pc寄存器中存储了当前周期指令存储器传给取指模块的指令对应的pc。

2.指令暂存单元

指令暂存单元是一个16-bit的存储器。因为cpu支持risc-v中定义的“压缩指令”,所以指令存储器中既存放了32-bit的普通指令,又存放了16-bit的压缩指令。risc-v定义的压缩指令省略了一些常用指令的部分信息,因此在一定程度上减小了指令占用的存储空间。16-bit指令的存在使取指模块发送给指令存储器的pc可能并不是4的倍数,即出现地址不对齐的情况。但是在对指令进行译码之前cpu无法知道其是否为压缩指令,因此取指模块每次都应当从指令存储器中取出32-bit数据。当取指模块发送给指令存储器的pc不是4的倍数时,需要两个周期才能取出32-bit数据,因此需要使用指令暂存单元来存储第一次取出的32-bit数据的高16-bit。其与第二次取出的32-bit数据的低16-bit组合成的32-bit数据会被传给压缩指令扩展单元。

3.压缩指令扩展单元

根据risc-v指令长度编码的规定,指令的低2-bit若不是11,则为16-bit的压缩指令。因此压缩指令扩展单元可根据指令暂存单元传来的32-bit数据的低2位编码来判断这32-bit数据的低16-bit是否为一条压缩指令。若其是压缩指令则根据压缩指令的扩展规则将其扩展为32-bit的普通指令,以方便译码模块的译码工作,同时将32-bit数据的高16-bit存入指令暂存单元,以便之后调用;若不是压缩指令则说明32-bit数据是一条普通指令,不作任何处理。

4.返回地址栈

根据risc-v官方文档的定义,通用寄存器x1在程序调用函数时会被编译器作为函数的返回地址,即对于函数调用常有以下汇编代码:

可见编译器若发现程序需要调用函数,则会在调用函数的时候使用jal指令将返回地址放入x1中,并且在退出函数的时候使用jalr指令读取x1的值来确定返回地址。因此本发明使用返回地址栈来存放程序在调用函数时使用的返回地址。当jal指令进入执行模块时,若检测到其rd=x1,则不仅要将计算得到的pc加4或pc加2的结果写入通用寄存器,也要将其压入返回地址栈。当译码模块中的指令为jalr指令时,若rs1=x1,imm=0,则将指令从通用寄存器中读取的x1值与栈顶元素值进行比较,若两者相等则说明预测正确,可以将栈顶元素出栈;否则说明预测错误,不修改栈中的元素。

返回地址栈的大小可根据需要设置,常见的值为4~16。

5.分支预测单元

当取指模块从指令存储器中取回的指令是跳转指令时,分支预测单元会对跳转指令的下一条指令pc进行预测。下面结合不同类型的跳转指令描述分支预测单元的具体功能:

1)无条件直接跳转指令jal

jal的用法为jalrd,imm,含义为将jal指令的pc加上立即数偏移量imm的和作为跳转目标地址,同时将jal指令的pc加上jal指令的长度的和存入目的寄存器rd中。由于其一定会跳转,因此无需预测其是否跳转。而对于其跳转目标地址可以使用取指模块中的加法器计算得到。

2)无条件间接跳转指令jalr

jalr的用法为jalrrd,rs1,imm,含义为将源寄存器rs1的值加上立即数偏移量imm的和作为跳转目标地址,同时将jalr指令的pc加上jalr指令的长度的和存入目的寄存器rd中。由于其一定会跳转,因此无需预测其是否跳转。问题在于要计算出跳转目标地址必须读取源寄存器rs1的值,而只有译码模块中的指令才能使用通用寄存器的读端口,因此理论上无法预测jalr指令的跳转目标地址。但是在如(4)中所描述的函数返回的情况中,可以用返回地址栈的栈顶元素值来预测当rs1=x1时寄存器中的值,于是便可得到jalr指令的跳转目标地址。对于其它情况则无法预测,只能等到jalr指令进入译码模块才能进行下一步处理。

3)有条件直接跳转指令bxx(beq,blt,bge)

bxx的用法为bxxrs1,rs2,imm,含义为若源寄存器rs1的值与源寄存器rs2的值之间满足xx设置的关系则需要跳转,同时将bxx指令的pc加上立即数偏移量imm的和作为其跳转目标地址;否则不跳转,执行下一条指令(比如当bxx为blt时,若满足rs1的值小于rs2的值,则需要跳转)。bxx指令在取指模块中时也无法读取寄存器rs1和rs2的值。对于最常见的for循环语句,编译器会将循环条件判断语句放在循环体的后面。因此基于低功耗的设计思想,本发明使用一种简单的静态预测方法:对于向后跳转的bxx指令预测为需要跳转,对于向前跳转的bxx指令则预测为不跳转,跳转的方向可根据imm的最高位判断;对于跳转目标地址,使用bxx指令的pc加上立即数偏移量imm得到。

如图3所示,流水线的第二级为译码模块。译码模块用于提取出指令的操作码、功能码、源寄存器、目的寄存器和立即数,并且对跳转指令进行处理。译码模块包括以下部分:

1.指令信息提取单元

指令信息提取单元负责提取指令的操作码、功能码、源寄存器、目的寄存器和立即数,并且从通用寄存器的读端口中读出所需数据。对于四级流水线结构来说,如果译码模块中的指令的源寄存器等于执行或访存模块中的指令的目的寄存器,则说明存在raw冲突。如果此周期内能得到后续流水线中的指令的执行结果,则采用转发技术,否则必须暂停流水线。如果译码模块中的指令的目的寄存器等于访存模块中的指令的目的寄存器,则说明存在waw冲突。由于写回模块中的指令先进入流水线中,为了保证写入数据的正确性,必须暂停流水线,等到访存模块中的指令执行完毕之后才能取消暂停。

2.跳转指令处理单元

由于取指模块对满足条件的jalr指令和所有的bxx指令进行了预测,所以跳转指令处理单元负责检查预测结果是否正确。如取指模块所述,若jalr指令在退出函数时被调用,则使用了返回地址栈来预测寄存器x1的值。因此等到指令进入译码模块之后,要从通用寄存器中读出x1的真实值,并将其与返回地址栈的栈顶元素值进行比较,如果相等则说明预测正确,对栈顶元素执行出栈操作;不相等则说明预测错误,要使用从通用寄存器中读出的x1的真实值来计算跳转目标地址;对于在上一级没有作出预测的jalr指令,此时也可以得到它们真实的跳转目标地址;对于bxx指令,此时可以根据取出的rs1寄存器值和rs2寄存器值判断是否真的需要跳转;对于jal指令,由于取指模块已经对其进行了正确的预测,所以无需处理。

如图4所示,流水线的第三级为执行模块。执行模块包括加法器、桶形移位器、逻辑运算器、硬件乘法器和除法控制器。硬件乘法器的核心单元为一个16-bit的乘法器,所以在执行需要64-bit乘法结果的低32-bit的mul指令时需要3个周期,而在执行需要64-bit乘法结果的高32-bit的mulh[s][u]指令时需要4个周期;执行模块在计算除法时使用移位相减的方法。为了减小面积,除法运算时所需的相减、移位和比较都使用执行模块中的已有电路,而没有使用独立的运算电路。除法的计算一共需要36个周期:第1周期检查除数是否为0,第2和第3周期分别计算除数与被除数的绝对值,第4至第35周期计算商或余数,第36周期根据除法操作的具体情况改变商或余数的符号。执行模块在执行无法在一个周期内运算完毕的乘除法指令时,需要向前两级流水线发送暂停信号以防止新的指令进入执行模块中。不需要访存的指令经过三级流水线就可以被执行完毕,所以执行模块使用了通用寄存器的写端口1将需要的数据写入通用寄存器;需要访存的指令会进入第四级流水线。

如图5所示,流水线的第四级为写回模块。写回模块用于记录访存指令的信息并将访存单元读取到的数据写回通用寄存器。cpu支持写回模块中存在一条未完成的访存指令,如果写回模块中的访存指令与译码模块中的指令不存在raw或waw冲突,则前三级流水线不暂停,否则需要暂停;如果写回模块中存在一条未完成的访存指令的同时又有新的访存指令进入执行模块,则需要暂停整个流水线直到写回模块中的访存指令执行完毕。写回模块使用了通用寄存器的写端口2将load型指令从存储器中读取的数据写入通用寄存器。

访存单元使用访存指令在执行模块中计算得到的地址访问存储器,并发送读/写命令与字节掩码。

异常/中断处理单元用于检测cpu在执行指令时遇到的异常,以及接收外部向cpu传来的中断信号,根据不同的异常原因和中断源决定cpu决定执行的异常/中断服务函数。本发明设计的cpu会对三种异常进行检测:非法的risc-v指令、除数为0、访存地址不对齐。译码模块会检查指令的编码是否符合risc-v的规定,若不符合则提醒异常;执行模块在计算除法之前会检测除数是否为0,若是0则提醒异常;访存单元向存储器发送读/写命令之前会检测要访问的地址是否对齐,若不对齐会提醒异常。异常/中断处理单元会记录引起异常的指令和pc,并根据设置选择异常处理函数。当外部传来中断信号时,为了达到迅速响应中断的目的,异常/中断处理单元会记录写回模块或执行模块中的指令pc,并且根据外部中断的编号选择跳转到某个中断处理函数。

显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。

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