将陆续上传新书《自己动手写CPU》,今天是第40篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈。
开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30
本节介绍除ll、sc之外的加载存储指令的实现思路,ll、sc指令的实现思路将在9.7节专题介绍。
1、加载指令实现思路
加载指令在译码阶段进行译码,得到运算类型alusel_o、aluop_o,以及要写的目的寄存器信息。这些信息传递到执行阶段,然后又传递到访存阶段,访存阶段依据这些信息,设置对数据存储器RAM的访问信号。从RAM读取回来的数据需要按照加载指令的类型、加载地址进行对齐调整,调整后的结果作为最终要写入目的寄存器的数据。
2、存储指令实现思路
存储指令在译码阶段进行译码,得到运算类型alusel_o、aluop_o,以及要存储的数据。这些信息传递到执行阶段,然后又传递到访存阶段,访存阶段依据这些信息,设置对数据存储器RAM的访问信号,将数据写入RAM。
需要特别注意的是:本章假设可以在一个时钟周期内完成对外部数据存储器RAM的读、写操作,在后续章节实现实践版OpenMIPS处理器的时候会考虑复杂情况。
为了实现除ll、sc之外的加载存储指令,修改数据流图如图9-18所示。主要是在访存阶段增加了对数据存储器RAM的访问,同时,由于要写入目的寄存器的数据可能是执行阶段的结果,也可能是在访存阶段从数据存储器RAM加载得到的数据,所以在访存阶段增加了一个多路选择器,进行选择。
为了实现除ll、sc之外的加载存储指令,需要对系统结构进行修改,增加部分模块的接口,修改后的系统结构如图9-19所示。
主要修改内容如下。
(1)译码阶段的ID模块增加了输出信号inst_o,其值就是处于译码阶段的指令,该信号会传递到执行阶段,在执行阶段的EX模块会利用该信号的值计算加载、存储地址mem_addr_o。
(2)执行阶段的EX模块将运算子类型aluop_o、加载存储地址mem_addr_o、读取的第二个操作数reg2_o等信息,通过EX/MEM模块传递到访存阶段的MEM模块。
(3)访存阶段的MEM模块依据加载、存储指令的类型,确定对数据存储器RAM的访问信息,通过mem_ce_o接口送出数据存储器使能信号,mem_addr_o接口送出访问地址,mem_we_o接口指出是加载还是存储操作、mem_sel_o接口送出字节选择信号,如果是存储指令,那么还通过mem_data_o接口输出要存储的数据,如果是加载指令,那么会从mem_data_i接口获得读取到的数据,然后MEM模块依据具体的加载指令类型、加载地址,对获取的数据进行对齐调整,最终得到要写入目的寄存器的数据。
下一次将修改OpenMIPS的代码以实现加载存储指令。
原文地址:http://blog.csdn.net/leishangwen/article/details/40162001