在蜂鸟E203处理器流水线中的派遣点 被派遣到不同运算单元并执行 的指令 。由不同的运算单元执行完毕的指令最终都会将 计算结果写回通用寄存器组。
处理器的写回
写回将指令的运算结果写回通用寄存器组。
写回硬件实现
将指令划分为单周期指令和长指令。
将长指令的交付和写回分开,使得即使执行了多周期长指令,也不会阻塞流水线,让后续的单周期指令仍然能够顺利地写回和交付。
主要包含最终写回仲裁,长指令写回仲裁。 OITF模块。
最终写回仲裁模块
最终写回仲裁主要用于 仲裁所有单周期指令的写回 和所有长指令的写回。 仲裁采用优先级仲裁的方式。由于长指令的执行周期比较长, 因此它明显比正在写回的ALU指令在程序流中处于更靠前的位置。因此长指令的写回比单周期指令的写回更有优先级。
在没有长指令写回的空闲周期,来自ALU的单周期指令可以随便写回。 在程序流中处于更靠后位置的单周期指令可以比更靠前长指令先写回 通用寄存器组。具备乱序写回。
OIFT模块和长指令写回仲裁模块
OIFT和长指令写回仲裁模块 合作完成所有指令的写回操作。
长指令写回仲裁用于仲裁不同的长指令之间的写回。 来自LSU,乘除法器,NICE协处理器等的写回。由于执行不同的长指令的周期数不同,甚至有的执行周期是动态的,因此无法很容易判断这些指令的先后关系,需要记录这些指令的先后关系。
OIFT用于记录这些长指令的信息,OIFT模块本质是一个先入先出的缓存模块,在流水线派遣点,每次派遣一个长指令,就会在OIFT模块分配一个表项,这个表项的FIFO指针便为 这条长指令的ITAG。
长指令的运算单元在完成运算后将结果写回。也会携带着ITAG。
OIFT模块的深度的便决定了能够 派遣的滞外 长指令的个数,这些长指令写回时,无须严格按照派遣顺序,只需要在有寄存器冲突的情形下严格遵循顺序。
读指针作为长指令写回仲裁的选择参考。
每次从长指令写回仲裁模块写回一条指令之后,便将此指令在OIFT模块中的表项去除,即从FIFO模块退出。
由于有的长指令会发生执行错误,产生异常。 长指令写回仲裁模块需要和交付模块进行接口触发异常。
如果长指令产生了异常,则不会真的写回通用寄存器组。
对于单周期指令,写回策略是 顺序发射, 顺序执行,顺序写回。
长指令 写回策略是顺序发射,乱序执行,顺序写回。
统一起来 顺序发射 乱序执行 顺序写回。