关于mthi,mtlo,mfhi,mflo的数据前推

如果mf指令与mt连着指令或者只相隔一条指令,当mf指令进入执行阶段时,mt指令还处于访存或者回写阶段,还未写入hi或者lo寄存器,此时就会发生数据相关,解决方法是采用数据前推。执行阶段使用多选器选择正确的输入,控制多选器的为译码阶段传递过来的aluop(执行阶段执行运算的子类型)信号,根据此信号,写入寄存器组的值将来至三个可能,优先级从前往后,

  (1)若访存阶段有要写入hi、lo寄存器的值(mem的输出whilo为写使能),则表示上一条指令与本条指令产生数据相关,而上一条指令此时还处于访存阶段(hi、lo的值还未写入相应的寄存器),此时将选择mem模块的hi、lo值(上一条指令要写入hi、lo寄存器的值)作为要写入寄存器组的操作数输入,本且与上一条指令数据相关的优先级最高. 

  (2)本条指令与上条指令无数据相关时,若回写阶段有要写入hi、lo寄存器的值(mem_wb的输出whilo为写使能),则表示上上条指令与本条指令产生数据相关,而上上条指令此时还处于回写阶段(hi、lo的值还未写入相应的寄存器),此时将选择mem_wb模块的hi、lo的值(上上条指令要写入hi、lo寄存器的值)作为要写入寄存器组的操作数输入,由于mf指令的源操作数只有一个,如果本条指令与它的上条指令发生数据相关,则不可能与上上条指令数据相关,所以与上条指令发生数据相关的优先级最高。

  (3)若本条指令与上条指令以及上上条指令都不发生数据相关,则往上的其他指令的值均已通过回写阶段写入hi、lo寄存器,所以不产生数据相关,直接使用hi、lo寄存器的值作为输入。

本次采用的mf指令数据相关问题的方法还是数据前推,将hi和lo的写使能信号合并为一个信号whilo,同时在ex模块内部加入寄存器HI和LO(注意这两个寄存器是虚拟的,方便理解,并不会综合出来真正的寄存器)来保留要写入hi、lo寄存器的最新值,若为mfhi指令,则执行阶段输出HI的值,若为mflo指令,则执行阶段输出LO的值。

 

 

 当然也可以单独使用whi和wlo写使能信号,若为mfhi指令,则应该看前两条指令是否有mohi指令(即判断mem模块和mem_wb模块的输出whi是否为写使能),然后载入相应的值;若为mflo指令,则应看判断前两条指令是否有mtlo指令(即判断mem模块和mem_wb模块的输出whi是否为写使能),然后载入相应的值。

 

posted @ 2021-04-01 11:32  mr1victor  阅读(1301)  评论(0)    收藏  举报