华科组成原理课程设计-MIPS流水线CPU
目录
一、课程设计概述............................................................................................................... .. (3)
1 课设目的............................................................................................................... . (3)
2 实验环境............................................................................................................... . (3)
3 设计任务与要求................................................................................................................. (3)
二、设计原理............................................................................................................... . (3)
1 MIPS概述............................................................................................................... (3)
2 MIPS指令简
介............................................................................................................... . (3)
3 经典5段RSIC流水线结构 (4)
三、设计内容............................................................................................................... . (5)
1 指令选取............................................................................................................... . (5)
2 非流水5段CPU模型 (6)
3 流水5段CPU模型............................................................................................................... .. 8
四、实现内容与测试结果.............................................................................................................
12
1 各模块功能............................................................................................................... . (12)
2控制信号............................................................................................................... (12)
3指令操作流程............................................................................................................... . (13)
4指令执行状态转换图..............................................................................................................
14
5引脚绑定............................................................................................................... (15)
6测试程序............................................................................................................... (15)
7测试结果与仿真图..................................................................................................................
16
五、课设总结............................................................................................................... .. (17)
1课设中遇到的问
题..................................................................................................................
17
2课设经历............................................................................................................... (17)
3课设感想............................................................................................................... (18)
4小组分工............................................................................................................... (18)
参考文献............................................................................................................... . (18)
2
一、课程设计概述
1. 课设目的
①掌握硬件描述语言与开发环境,了解硬件开发地基本过程。
②掌握流水线CPU设计方法。
③锻炼学生简单计算机系统的设计能力,并通过进行主机系统低层电路的实现、故障
分析与定位、系统调试等环节的锻炼,进一步提高了学生分析和
解决问题的能力。
2. 实验环境
①Xilinx ISE 14.2
②Spartan3E实验板一块
3. 设计任务与要求
课程设计的主要任务是设计一台支持流水线的简单计算机系统
并调试通过。要求所设计的计算机系统能正确地执行存放在指令cache中的程序的功能。
本设计基于MIPS的32位流水线架构,设计过程中力图尽可能的遵循原有的MIPS的功能和指令集。基本做到与MIPS指令集的兼容。
具体要求包括:
①支持算术运算,逻辑运算,存储器读写,寄存器间数据传送等几类指令。
②支持立即数寻址,直接寻址,寄存器寻址等几种基本的数据寻址方式和顺序寻址、跳跃寻址两种指令的寻址方式。
③支持10条或以上的指令。
④能运行由自己所设计的指令系统构成的一段程序,程序执行功能正确。⑤具有完整的五级流水线架构。采用独立的32位的数据总线和地址总线。
二、设计原理
1. MIPS概述
MIPS是高效的RISC体系结构中最优雅的一种体系结构。其中文
意思为“无内部互锁流水级的微处理器”,其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。
本设计将参考MIPS的CPU设计以实现自己的五段流水线CPU设计,并部分实现MIPS32指令集
2. MIPS指令简介
2.1 MIPS指令集特点
MIPS指令集具有以下特点:
①简单的LOAD/STORE结构。所有计算类型指令均从寄存器组中读取数据并把结果写入寄存器组中。只有LOAD和STORE指令访问存储器(数据cache)。②易于流水线CPU的设计。MIPS指令集的指令格式非常规整,所有的指令均为32位,而且指令操作码在固定的位置上。
③易于编译器的开发。一般情况下,编译器在编译高级语言程序时,很难用到复
3
杂的指令。MIPS指令的寻址方式与操作非常简单,便于编译器的开发。
2.2 MIPS指令格式
在本次课程设计中,在数据类型上只支持整数类型,在指令格式
上直接R、I和J型指令。以下是对三型指令的简介[1]:
①R(register)类型的指令从寄存器组中读取两个源操作数,计算结果写回寄存
器组。
②I(immediate)类型的指令使用一个16位的立即数作为一个源操作数。③J(jump)类型的指令使用一个26位立即数作为跳转的目标地址。三型指令的格式如图1所示,其中:①op表示指令操作码。
②rs为源操作数的寄存器号。
③rd为目的寄存器号,RT既可为源寄存器号,也可为目的寄存器号。④funct可认为是扩展的操作码。
⑤shamte由移位指令使用,定义移位位数。
⑥Immediate是16位立即数,根据指令需求进行无符号或有符号扩展。⑦Address是26位立即数,由J型指令使用,用于产生跳转的目的地址。
631
26 25
521 20
516 15(a)I类指令
631
631
26 25
(c)J类指令
26 25
5
21 20
516 15(b)R类指令
260
511 10
56 5
60
16
图1. MIPS的指令格式
3. 经典5段RSIC流水线结构
经典的5段RISC流水线如图2。
IF段
ID段
EX段
MEM段
WB段
图2. 经典5段RISC流水线
在该结构中一条指令的执行过程分为以下5个时钟周期:
4
①取指令周期(IF):以程序计数器PC中的内容作为地址,从
存储器中取出指令并放
入指令寄存器IR;同时PC值加4(假设每条指令占4个字节),指向顺序的下一条指令。
②指令译码/读寄存器周期(ID):对指令进行译码,并用IR中的寄存器地址去访问
通用寄存器组,读出所需的操作数。③执行/有效地址计算周期(EX):在这个周期,ALU对在上一个周期准备好的操作数进行运算或处理。不同指令所进行的操作不同。④存储器访问/分支完成周期(MEM):load指令用上一个周期计算出的有效地址从存
储器中读出相应的数据;store指令把指定的数据写入这个有效地址所指出的存储器单元;分支指令若分支成功就把钱一个周期中计算好的转移目标地址送入PC,否则不进行任何操作;其他类型的指令在该周期不做任何操作。⑤写回周期(WB):把结果写入通用寄存器组。
本设计基于该经典5端流水线结构完成了MIPS的一种简单实现,并在此基础上加入了对流水线冲突(数据冲突,控制冲突)的处理,以及对中断的处理。
三、设计内容
1. 指令选取
本系统能执行16条MIPS指令,指令基本情况如表1所示。
表1. 系统支持的MIPS指令集
从指令类型来讲,这16条指令覆盖了算逻运算、访存、无条件跳转和有条件跳转,已
5
基本覆盖一个指令集所需的所有基本指令。
从寻址方式来讲,这16条指令覆盖了寄存器寻址(R-TYPE指令),立即数寻址(I-TYPE指令),基址偏移量寻址(LW/SW),直接寻址(J)。
16条MIPS指令并不是本设计的极限,只是受到实验板资源的限制,我们仅仅完成了MIPS32指令集中的16条而已。本设计通过简单的拓展可以轻松实现整个MIPS32指令集。
2. 非流水5段CPU模型
2.1 初始数据通路
设计往往都是从简单到复杂,循序渐进。好高骛远则往往求之而不得。因此我们并没有从流水线模型直接下手,而是首先设计了一个类似经典5段RISC流水线结构的非流水5段CPU模型。由于不涉及流水,所以所有的指令周期均为单周期,数据通路见图3。
图3. 非流水5段CPU初始数据通路
2.2 5段具体操作
在这个数据通路上每条指令需要花费5个时钟周期,这5个时钟周期相应的操作如下:
2.2.1取指令周期(IF)
IR←Mem[PC]
NPC←PC+1
以PC中的值从指令cache中取出一条指令,放入指令寄存器IR;同时PC值
加1,然后放入NPC,这时NPC中的值为顺序的下调指令的地址。
2.2.2指令译码/读寄存器周期(ID)
A←Regs[rs]
B←Regs[rt]
imm←((IR16)16##IR16..31)
对指令进行译码,并以指令中的rs和rt字段作为地址访问通用寄存器组,将
6
读出的数据让如A和B寄存器中。同时IR的低16位进行有符号或者无符号扩展,然后存入Imm寄存器
2.2.3 执行/有效地址计算周期(EX)
①LW和SW指令
ALUo←A+Imm
ALU将操作数相加形成有效地址,并存入临时寄存器ALUo
②R-TYPE
ALUo←A funct B
ALU根据funct字段指出的操作类型对A和B中的数据进行运算,并将
结果存入ALUo
③I-TYPE
ALUo←A op Imm
ALU根据操作码op指出的操作类型对A和Imm中的数据进行运算,并
将结果存入ALUo
④分支指令
ALUo←NPC+Imm
ALU将临时寄存器NPC和Imm中的值相加得到转移目标的地址,存入
ALUo
2.2.4 存储器访问/分支完成周期(MEM)
①LW和SW指令
LW:LMD←Mem[ALUo]
即从存储器中读出相应数据,放入临时寄存器LMD中
SW:Mem[ALUo]←B
即把B中数据写入存储器
②分支指令
If (cond) PC←ALUo else PC←NPC
若cond中的内容为真,则将ALUo中的转移目标地址放入PC,否则PC+1。
2.2.5 写回周期(WB)
①R-TYPE
Regs[rd]←ALUo
②I-TYPE
Regs[rt]←ALUo
③LW指令
Regs[rt]←LMD
2.3 模型优化与最终数据通路
在这部分设计的时候我们的跳转指令仅仅实现了JNZQ,因此我们对改分支指令进行了单独的优化。在图2的设计中若分支失败,则由于新的PC在EX段产生,因此会产生2个时钟周期的延迟。但实际上可以对这条指令进行单独的改进,将对PC的修改提前到IF段,以便PC值能够快速变化。经过这样优化后,分支失败则只会产生1个时钟周期的延迟。改进后的数据通路如图4所示。
7
图4. 非流水5段CPU最终数据通路
3. 5段流水CPU模型
3.1 初始数据通路
在实现了非流水的5段CPU模型后,5段流水CPU模型也就水到渠成了。只需要在各段之间加入相应的流水寄存器即可。数据通路如图5。
图5. 5段流水CPU初始数据通路
3.2 5段具体操作
这部分与非流水的具体操作大致相同,这里不加赘述。
3.3 流水线冲突及解决方案 3.3.1 数据冲突
如果上一条指令的结果还没有写入到寄存器中,而下一条指令的原操作数又恰恰是此寄存器的数据,那么它所获得的将是原来的数据,而不是更新后的数据,这样的相关问题称为数据相关。
8
根据在系统结构中学习到的相关知识,在我们的设计中,采用定向(forwarding)技术来解决此类相关问题。其关键思路是:在发生写后读相关的情况下,在计算结果尚未出来之前,后面等待使用该结果的指令并不见得是马上就要用该结果。如果能够将该计算结果从其产生的地方(ALU出口)直接送到其他指令需要它的地方(ALU的入口),那么就可以避免停顿,如图6。
时间(时钟周期)DADD R1,R2,R3DSUB R4,R1,R5XOR R6,R1,R7AND R8,R1,R9图6. 定向技术
3.3.2 控制冲突
在流水线中,控制冲突可能会使数据冲突造成更大的性能损失。执行分支指令的结果有两种,一种是“成功”,PC值改变为分支转移的目标地址。另一种则是“失败”,这是PC的值保持正常递增。
本设计中采用预测分支失败的方法解决控制冲突,即允许分支指令后的指令继续在流水线中流动。当确定分支是失败时,可以将分支指令看做一条普通指令,流水线正常流动,如表2;当确定分支是成功时,流水线就把在分支指令之后取出的指令转化为空操作,并按分支目标地址重新取指令执行,如表3。
表2. 分支失败的流水线时空图
表3. 分支成功的流水线时空图
9
3.4模型中的问题与修正
3.4.1 指令周期数问题
若是指令周期和之前的设计一样,使用单周期的设计,那么会出现对流水寄存器的读写冲突。
例如对于通用寄存器组来说,在clk上升沿的时候需要从IF段的指令寄存器IR中取出指令,然后访问相应的寄存器并将数据写入ID 段的A,B寄存器。试想,若是从IR中取指令,和对ID段的A,B寄存器的写入两个操作都是在clk上升沿触发,那么由于时延的存在,很有可能导致写入的值不是预期值。
因此我们将指令周期从单周期改为双周期。在前一周期完成对流水寄存器的读操作,并且完成各段的功能。后一周期,完成对流水寄存器的写操作。具体实现上我们舍弃了分频的方法而是采用前半周期为clk上升沿触发,后半周期为clk下降沿触发。
3.4.2译码器问题
通过3.3.1可知,各段功能需要在前一周期内全部完成,但是ID 段很特殊,因为有译码器的存在。
通用寄存器组和扩展部件都需要译码器提供控制信号,但是由于3.3.1的限制,译码器也会在clk上升沿触发。由于时延的存在,这可能会导致控制信号产生在需求之后。也即在寄存器组和扩展部件需要控制信号的时候,控制信号还未真正产生,导致这两部件使用了错误
的控制信号。
除了这个隐患,还有一个问题就是若采用单独的译码器,那么会在ID段产生大量的控制信号,这些控制信号都需要通过流水线流向下一段,那么势必需要大量的流水寄存器,大幅增加硬件成本。
综合考虑这两个问题之后我们撤掉了译码器,而采用分段译码的方式。即给每个功能部件都提供完整的指令,由各个功能部件自己产生自己所需要的控制信号,这样就可以完美的解决上述两个问题。
3.4.3 针对JNZQ指令的优化问题
在非流水的CPU模型中我们针对JNZQ指令进行了专门的优化,将对分支条件的判断放在了ID段。但是这存在两个问题,一是我们认为这样影响了整体设计的一致性;二是在流水线CPU的设计中我们加入了新的跳转指令,这使得判断变得更加复杂,ID段分担了太多EX段的功能,会影响整体流水的性能。
因此在流水CPU设计中我们将分支的条件改回在EX段判断。
3.4.4寄存器组的读写顺序问题
在最初的设计中,我们将寄存器的写回操作放在后半周期,即和流水线寄存器的写操作一同完成。但是在后面的实际测试中我们发现若这样处理,我们在做重定向的时候必须做三次重定向。因此我们对此做了调整,将写回操作提前到前半周期完成,即对寄存器组实现先写后读策略。
3.4.5 写回段的取舍
在最初的设计中,由于我们将寄存器的写回操作放在后半周期,
因此我们一度舍弃了写回段。因为写回段仅仅是前半周期读出写回数据,后半周期将数据写回寄存器组,这么简单的功能占据一个流水段显示实在是“奢侈”。因而在最初的设计中我们将其和MEM段合并。
但是3.3.4中对寄存器读写顺序做了调整,因此写回段中的写回操作和EX段的计算操作以及MEM的访存操作在同半个周期内,由于时延的存在很有可能导致写回数据错误。此时若舍弃了写回段则可能在计算结果出来前就写回了,这显然不
10
合理。
因此我们重新加入了写回段。在加入访存段后,由于写回的结果依赖于访存结果,因此放在访存段之后。
3.4.6特殊指令JNZ的问题
JNZ这条指令在整个指令集中是非常特殊的存在,在之前的设计中我们完全没有考虑到这个问题。
①虽然JNZ是I-TYPE指令,但是RT却是源寄存器,也即JNZ不会修改
RT的值。即它不符合I-TYPE指令在写回段的数据通路Regs[rt]←ALUo。这在做定向的时候会产生严重的问题,若不做特殊判断,那么很可能会产生错误的定向。
②JNZ指令是整个指令集中唯一一个需要4个输入
(rega,regb,imm,pc)的
指令,其他指令均最多只需要2个输入。这使得EX段的两个选
择器完全是多余的,可以去掉。
在考虑到这两点之后我们对重定向进行了重新设计,并且去掉了EX段中的两个选择器。
3.5 硬软中断的实现
3.5.1 软中断的实现
对于软中断,我们实际上通过扩展指令集的方式来实现。即在指令集中加入两
表4. Push和Pop指令当ID段检测到PUSH指令时,将会把所有通用寄存器组的值以及当前PC值压入堆栈。当EX段检测到PUSH 指令时,会无条件跳转至指令对对应的地址。当ID段检测到POP 指令时,将会把所有的通用寄存器组的值弹出。当EX段检测到POP 指令时,会无条件跳转至堆栈中的PC值对应的地址。3.5.2 硬中断的实现
对于硬中断我们仅实现了了溢出中断。当EX段出现溢出时,EX 段将会向IF段传送相应的控制信号。此时IF段将会产生一条PUSH 指令送到IR中,并且PC值维持一周期不变。
这样就相当于向流水线中插入了一条软中断指令,从而实现了用硬件来自动产生中断指令。
3.6 最终数据通路
在成功修改和完善3.4中的问题以及加入3.5中的内容后,我们得到了最后的数据通路图,如图7。
11
图7. 5段流水CPU最终数据通路图
四、实现内容与测试结果
1. 表5. 各模块功能表
2.
表6. 控制信号表
12
3. 指令操作流程
由于我组实现的指令较多,而很多指令具有较大的相似性,因此这里取ADD, BNE, J, SW
[2]
表8. BNE指令操作流程及控制信号
表9. J指令操作流程及控制信号
表7. ADD指令操作流程及控制信号13
表10. SW指令操作流程及控制信号
4. 指令执行状态转换图
可画出其对应的状态转移图,如图9所示。
IF
图9. 状态转移图
14
5.
表11. 引脚绑定表
6. 测试程序
综合考虑到我们选择的指令集以及FPGA开发板的硬件资源情况,我们打算用下面三个程序来测试我们的设计方案。
15
表12. 测试程序1
程序2主要用来测试软中断和硬中断功能,程序如表13所示。
表13. 测试程序2
程序3主要用来测试跳转指令的正确性,由于push和pop指令中已经隐含了J指令,表14. 测试程序3
7. 测试结果与仿真图
所有测试程序均在最终检查时验收,其在FPGA开发板上的实际的运行结果均在课设验收时得到了确认,三个测试程序的结果均符合预期,这里便不再赘述。
16
此外由于仿真图上通过缩放后已经无法看清32位寄存器具体的值,即使放在这里也根本无法看清其具体值,毫无意义。因此仿真图便不再放在报告里。
五、课设总结
1. 课设中遇到的问题
这次课设中遇到的主要问题有如下这些:
指令周期数问题。(单周期与双周期的选择)
是否设立单独的译码器的问题。(集中译码与分布译码的选择)
①是否保留非流水中针对跳转指令的优化问题。(结构一致性的