Skip to content

apshuang/Tomasulo_WithROB

Repository files navigation

Tomasulo(With ROB and prediction)

Sun Yat-Sen University 2024秋季学期 并行计算机体系结构大作业

项目特点

  • 封装良好,易于修改
  • 可视化程度好,易于展示
  • 注释丰富,易于理解

基本假设

  • 我们不对register和内存中的初始值做任何假设,所以所有对他们的取值都将获得一个string来指示其“表面值”,比如Reg[F1],或者Mem[x1+32]
  • 为了简化项目,我们不另外创建功能单元类(即memory unit、adder、multiplier等),而是直接将他们整合到RS或LoadBuffer部件中
  • 写CDB实际上就是将result值传送给CommonDataBus这个部件,然后再由这个CDB将值传送出去,比如Add2完成了计算得到一个result,那么写CDB就是将所有依赖Add2的部件,全部改写为这个result。
  • 功能单元采用“类FIFO”式的服务,即在所有已经ready的instruction中,保证先到的一定先服务
  • 有一个关键的设计:比如某条指令,在第3周期完成,在第4周期写回,那么第4周期的时候,依赖这个result的所有指令才能拿到这个数,然后就可以进行对应的操作了。所以在这个模拟系统中,我们会在第3周期的时候,将数据送进CDB,然后CDB在第4周期的最初,将所有数据传送给其它组件,从而实现符合实际情况的设计。
  • 我们假设branch指令的执行在操作数ready的情况下,就可以马上得到结果。
  • 我们假设load指令需要2周期执行、add/sub需要2周期、mult需要6周期、div需要12周期;同时,我们设定adder和multiplier都只有一个,而自动计算好地址(即integer部件是无限的)(这些可以在BasicDefine.h中调整)。
  • 以一个fld f6,32(x2)指令为例,它在第1周期完成issue,在第2周期开始执行,在第4周期执行完成,在第5周期写回,并在第6周期提交。
  • ROB可以在一个周期内COMMIT无限多条指令(只要它们都已经是WRITE状态,而且是最旧的未COMMIT的指令)
  • 本项目推测所有branch指令都进行跳转

基本架构

  • 本项目中包含register(整型和浮点型)、LoadBuffer、StoreBuffer、ReservationStation(包括adder和multiplier)、InstructionDecoder、CommonDataBus、ReorderBuffer以及一个Tomasulo类(用来将上述所有部件整合在一起)。
  • 其中InstructionDecoder负责将指令读取并解析,将指令发送到对应的保留站(包括load/store buffer),在遇到Branch指令的时候,它会默认跳转。
  • 其中load/store buffer和保留站,就是用来缓存指令的地方,它们在计算单元有空闲的时候,自动将指令发送到计算单元上进行计算(本项目没有抽象出这样一个类,而是直接通过模拟remainingTime来实现)。而在计算完毕之后,也由它们来将result发送到CDB上。
  • register和CDB会根据指令来设置自己的字面值,比如一条fld f6,32(x2)指令,此时就会让f6寄存器变成Load1,从而后续引用f6寄存器的值时,就会自动引用Load1
  • ReorderBuffer会被动地接受instruction的issue(来自InstructionDecoder)、execute(来自load/store buffer和保留站通过CDB来发射signal)、WRITE(来自load/store buffer和保留站传送result时,顺便设置为WRITE状态),并会在每个周期主动地将所有最旧的未COMMIT的指令都进行COMMIT。
  • 事实上引入ROB并不会很明显地介入原本的tomasulo实现架构(只讨论本项目的实现),这样的设计给了更多的修改空间!ROB起作用的点也仅仅是在面临Branch指令的时候才起作用,当发生了not jump情况的时候,才需要清空所有的ROBLine和各种保留站、LD/SD buffer,并将所有的registers设置为稳定的值。

需要注意的点

  • 因为本项目都是用字面值,所以值太长的话(比如Mem[44 + Regs[x3]] - Mem[32 + Regs[x2]]这种),有可能会导致output的时候出错(因为使用了格式化输出来控制),如果出现string too long的报错,那就说明是某些输出太长了。
  • 目前还只是通过预设值来结束循环,比如bne x1,x3,Loop,那么在一开始就需要预设x3Regs[x1] + 8 + 8 + 8,这样才能保证循环能够正常结束。该项目目前还没有通过输入来进行值预设,所以在Registers中有一段#if ISSUENUM == 2,在该情况下,会通过代码预设

有待优化的点

  • 增加一个预设环节,能够通过输入来预设某些寄存器以及某些内存位置的初始值。
  • 本项目可能也有一些纰漏,如果发现问题,欢迎发Issue,感谢!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages