将陆续上传新书《自己动手写CPU》,今天是第47篇。
9.7 ll、sc指令实现思路
9.7.1 实现思路
这2条指令都涉及到访问链接状态位LLbit,可以将LLbit当做寄存器处理,ll指令需要写该寄存器,sc指令需要读该寄存器,同时,与对通用寄存器的访问一样,对LLbit寄存器的写操作也放在回写阶段进行。
ll指令在访存阶段要读取数据存储器中指定地址的数据,还要设置对LLbit寄存器的写操作,写入的值为1,这个写操作会通过MEM/WB模块传递到回写阶段,最终实现对LLbit寄存器的写。
sc指令在访存阶段要先获得LLbit寄存器的值,如果该值为1,那么会完成存储操作,同时设置对LLbit寄存器的写操作,写入的值为0,还要设置对通用寄存器rt的写操作,写入的值为1,这些写操作都会通过MEM/WB模块传递到回写阶段,最终实现对寄存器LLbit、通用寄存器rt的写;反之,如果LLbit寄存器的值为0,那么不进行存储操作,同时设置对通用寄存器rt的写操作,写入的值为0,这个写操作会通过MEM/WB模块传递到回写阶段,最终实现对通用寄存器rt的修改。
导致寄存器LLbit为0的情况有:(1)sc指令之前没有执行ll指令;(2)ll指令执行后、sc指令执行前,发生了异常。
9.7.2 数据流图的修改
为了实现ll、sc指令,需要对数据流图作如图9-29所示的修改,主要是在回写阶段新增了一个LLbit寄存器,其中存储的就是链接状态位,只有在回写阶段才会写LLbit寄存器。同时,要将LLbit寄存器的值传递到访存阶段,以供指令sc进行判断。
9.7.3 系统结构的修改
为实现ll、sc指令,需要对系统结构做如图9-30所示的修改,新增了一个LLbit模块,用来实现LLbit寄存器。
在访存阶段的MEM模块中会进行分析,如果是ll、sc指令,那么设置对LLbit寄存器的访问信息,通过LLbit_we_o、LLbit_value_o接口输出,前者表示是否是写操作,后者表示要写入的值,这些信息通过MEM/WB模块传递到回写阶段,最终修改LLbit寄存器。
LLbit寄存器的值通过LLbit_o接口输出到MEM模块的接口LLbit_i,当sc指令进入访存阶段时会使用到该值。
需要注意的是,由于对LLbit寄存器的修改是在回写阶段最后的时钟上升沿进行的,如果直接采用LLbit模块给出的LLbit寄存器的值,可能不是正确的值,因为此时处于回写阶段的指令可能会修改LLbit寄存器,这一问题在第6章添加HI、LO寄存器时也遇到过,解决方法还是数据前推,将回写阶段指令对LLbit寄存器的操作信息前推到访存阶段,访存阶段依据这些情况,确定正确的LLbit寄存器的值,所以在图9-30中,MEM/WB模块的输出信号wb_LLbit_we、wb_LLbit_value也要送到MEM模块,就是用来解决数据相关问题的。
下一次将通过修改代码实现LL、SC指令。