FPGA 经典五级流水线产生的冒险和和解决方案
冒险产生的原因
典型的五级流水线分为5个阶段:IF, ID, EX,MEM, WB。
了实现cpu的高效率利用,有了流水线,并将5个流水线级重叠使用。流水线处理中因为硬件资源的竞争,和各个阶段的依赖关系,可能会发生操作无法执行,产生冒险。
冒险可分为3类:构造冒险,数据冒险,控制冒险。
构造冒险:
- 构造冒险产生的原因:硬件资源的竞争。Eg:IF阶段和MEM阶段都要访问内存,由于访问内存的总线时共享的,无法同时操作,需要等一方执行完操作后,另一方在执行。(数据和指令共享同一总线为冯诺依曼架构)。本质:硬件资源不够多。
- 解决办法:
采用哈弗架构,即在物理上将指令和数据所用的内存和访问通道分开。
缺点:指令的和数据相同编号的地址指向的是不同的内存空间,会引起软件设计的问题。
本质:增加硬件资源。
加缓存,即cpu访问指令和数据的时候,直接面对的是各自的缓存,缓存面对内存。内存还是指令和数据公用一个。
数据冒险:
- 数据冒险产生的原因:各个阶段之间存在依赖关系,即某即将执行的数据还需要未准备好的数据。
- 解决办法:
- 直通:在数据确定的EX阶段,将数据直接传递给下一条指令。
- 直通无法解决的Load冒险:load指令访问内存要在MEM阶段,但此时下一条指令已经到了EX阶段。此时只能阻塞流水线,暂停一个周期,等到数据确定。
- 避免load冒险要靠调度算法来避免。
控制冒险:
- 控制冒险产生的原因:无法确定下一条指令出现的冒险。分支指令执行结果出来之前,无法执行下一条指令。
- 解决办法:
- 延迟间隙:在执行分支指令后并不立刻跳转到分支结果指向的指令,而是执行完下一条指令在跳转。