Upload
khuong
View
147
Download
5
Embed Size (px)
DESCRIPTION
MIPSI 指令集 32 位 CPU MiniCore 设计实例. 赵继业. 处理器特性介绍. 全 32 位操作, 32 个 32 位通用寄存器,所有指令和地址全为 32 位 静态流水线 ( 3 ~ 5 级) Forwarding 技术 片内 L1 Cache ,指令、数据各 4KByte ,硬件初始化 没有 TLB ,但 系统控制协处理器( CP0 )具有除页面映射外的全部功能. MIPSI 指令格式介绍. 1 、 R 类型指令(寄存器) OP rs rt rd shamt funct 2 、 I 类型指令(立即数) OP rs rt Imm - PowerPoint PPT Presentation
Citation preview
处理器特性介绍• 全 32 位操作, 32 个 32 位通用寄存器,所
有指令和地址全为 32 位• 静态流水线( 3 ~ 5 级)• Forwarding 技术• 片内 L1 Cache ,指令、数据各 4KByte ,
硬件初始化• 没有 TLB ,但系统控制协处理器( CP0 )
具有除页面映射外的全部功能
MIPSI 指令格式介绍1 、 R类型指令(寄存器)
OP rs rt rd shamt funct
2 、 I类型指令(立即数)OP rs rt Imm
3 、 J类型指令(跳转)OP target
MiniCore 所支持的指令• 算术逻辑类指令
– ADD 、 ADDI 、 SUB 、 AND 、 OR 、 NOR 、SLL 、 SRL 、 SRA
• 访存类指令– LW 、 SW 、 MTC0 、 MFC0 、 CACHE ( 0 、
1 )• 跳转类指令
– J 、 JR 、 BEQ
• 其他指令– ERET 、 TEQ
MiniCore 流水线结构单条指令运行步骤• Fetch & Decode( 取指并译码 )• Issue (发射)• Execute & Writeback (执行并写回)
取指并译码 发射 执行并写回取指并译码 发射 访存 写回
取指模块( Fetch )• PC - > 指令 Cache - > 指令- > 译码• PC 的来源: PC + 4 (通常)、跳转指令(目标地
址)、例外处理(例外处理向量入口地址、 EPC 内容)• 停止取指的情况(发射堵塞、特殊指令)
• 跳转指令的 Delay Slot (延迟槽)• 指令 Cache 的实现问题(同步与异步 RAM )
停止取指的情况• 发射堵塞( Issue_stall )
– 出现指令有相关情况• 特殊指令( Special Instruction )
– 有些情况需要停止取指,如 Cache0 、跳转指令(无转移预测)、出现取指地址错例外等等
• 如何处理– 设置 PC 的有效位,一旦停止取指,有效位置无效
跳转指令的延迟槽( Delay Slot )
• 延迟槽的意义– MIPS 指令系统的规定,由编译器自动处理
• 处理跳转指令的方法– 遇见跳转指令就停止取指,直到获得目标地址
(流水线的要求)– 采用分支预测– J 指令的处理,在 ALU 模块中计算转移地址
• 原则:必须保证处在延迟槽的指令被运行!
指令 Cache 对取指模块的影响• RAM 的同步、异步问题
– 同步写入,读出的同步、异步问题• 指令 Cache 必须保证一拍结果返回
– 采用异步读 RAM 的处理方式(正常方式)• 解决方法
– 提前将 PC 的内容放入 RAM 中– 相应的考虑
•指令 Cache 的比较对象(必须一致)•设置 PC 备份寄存器•设置 pc_in_en ,决定 PC 是否可以进入寄存器•pc_valid 的考虑(实际上提前一拍)
译码模块( Decode )• 由 MIPS 指令转化为 CPU 内部操作码• 内部操作码的定义
– 应当分组( ALU 、 MEM 、 Branch )• 分组示例
– ALU : ADD - > 00001 、 SUB - > 00011– MEM : LW - > 10000 、 SW - > 10001– Branch : J - > 11000 、 BEQ - > 11010
发射模块( Issue )• 静态流水线
– 遇到相关情况就停止发射,直到相关解决• 相关情况分析
– ALU 和跳转指令一拍完成,即使出现这些指令间的相关也没有问题
– MFC0 、 MTC0 、 CACHE0 和 CACHE1 指令也是一拍完成
– 访存指令中的 LW 、 SW 指令执行时间不确定,其后指令有相关必须停止发射
• 停止发射也必须同时停止取指
发射模块中必须考虑的问题• 两个功能部件( ALU 和数据 Cache )• 区别:执行指令的周期数不同• 结果:指令的结束顺序被打乱(前面访存
指令的结果尚未返回,后面与之不相关的 ALU 指令已经完成)
• 必须考虑:一旦指令(包括 ALU 指令和访存指令)运行中出现例外,如何处理?
乱序执行时的精确例外处理• 两种方式:
– 乱序发射,顺序结束(龙芯- 1 采用的方式)• 指令执行完后,等待,直到允许写回才能写入到寄
存器中– 顺序发射,乱序结束( MiniCore 采用的方式)
• 分析乱序结束出现的情况– 一条访存指令运行结束前,之后数条 ALU 指令已经执行完毕
MiniCore 的解决方式• ALU 指令出现例外
– 停止取指,停止发射,停止写回,直到访存结果返回之后,进入例外处理程序
• 访存指令出现例外– 例外种类,地址错例外– 处理方式,判断地址错例外的时机,一拍完成
•优缺点– 优点:不出现前后指令相关则无需等待– 缺点:例外处理比较复杂
Forwarding 技术• 什么是 Forwarding ?
– 发射时必须判断寄存器内容是否可用– 运算指令即便一拍完成,该指令结果也必须在下一拍对发射可用
– 实现对运算结果的侦听,一旦结果总线上结果可用就直接取值用于发射
• 效率较高,在“龙芯- 1” 中使用 Forwarding 技术前后性能差距超过 10 %
算术及逻辑模块( ALU )• 是一个运算单元• 根据发射来的指令码判断所应当做的操作• 不同指令的结果存储寄存器不同( Rd 或 R
t )• 判断指令执行所导致的例外(溢出、自陷)• 主要目标:尽量节省硬件开销
控制寄存器模块( Control Register )
• 主要进行例外处理• 所能够处理的例外
– 复位、地址错(取指、访存读、访存写)、溢出、自陷、保留指令、中断
• 所实现的例外处理寄存器– 计数( Count )、比较( Compare )、状态
( Status )、原因( Cause )、例外地址( EPC )、版本标识( Prid )
需要考虑到的问题• 两个操作: MTC0 、 MFC0
– 必须一拍完成并且返回结果• EPC 内容
– 当一条指令发生例外时,如果前一条指令不是跳转指令,则 EPC 内容为发生例外的指令 PC值,否则是前一条指令的 PC 值,同时 Cause寄存器中的 BD 位置 1
• 原则:必须全面考虑所有例外情况
地址错例外的处理• 三种地址错情况(取指、访存读、访存写)• 取指
– 例外作为取指的结果送回,并当作一条特殊指令对待,直到送入控制寄存器模块,发生例外
– 取指模块判断地址错后,停止取指• 访存读、写
– 在 ALU 模块中直接判断是否发生访存地址错例外,如果发生,直接进入控制寄存器模块,而不进入 Cache 模块
– 同时清除在发射模块中标志访存操作的标志位
例外之前的指令结果尚未返回• 停止之后指令的取指、发射、写回• 将当前指令的内容和 PC 值放入控制寄存器
模块中储存起来• 待前面指令内容返回之后,发出例外信号,
转入例外处理程序的入口地址• 发出例外信号的同时,判断 EPC 中应存放
的例外地址并置入
Cache 模块• 指令 Cache 和数据 Cache 独立• 直接映射• 写回机制• 虚地址低位查找( Index 、 Offset )• 物理地址高位比较• 各 4KByte 大小• Cache Line 是 32Byte ( 256bit )
Cache 的组织
Cachestate : 4 种状态,单处理器只使用两种• Invalid ( 00 ) ※• Share ( 01 )• Clean Exclusive ( 10 )• Dirty Exclusive ( 11 ) ※
Cache 的工作流程(写)• 只有数据 Cache 才需要写内存• 如果 Tag 比较命中,直接写入 Cacheline 中• 如果没有命中,需要先把内存中的相同物理
地址内容读入 Cache 中,再写入• 如果 Cacheline 中原有状态位为 Dirty ,则还
需要把原有内容按该物理地址写入到内存中去
• 理解 Writeback 与 Writethrough 的区别
块操作( Block )• 在 CPU 使用 Cache 时,所有的 Cache 访
存操作都是块操作,一次一个 Cacheline
• 与单字操作相比,块操作提高了效率• CPU 直接访存,不使用 Cache 时,采用单字操作
• MiniCore 中使用 Cache 硬件初始化,都是块操作,如果是操作系统软件初始化,就必须存在单字操作
接口模块• 连接 CPU 与外部设备(北桥、内存、外设
等)• 允许 CPU 访问 Cache 未命中所需的外部资源,同时也允许外设访问 CPU 内部资源
• 信号转换( Reset 、 Interrupt )和信息交换(访存请求、访存结果)
• CPU 内外频率配合(内频=外频 × 倍频)
接口模块设计要求• 与北桥连接为双向三态总线( 0 、 1 、 Z )• 能够提供内外频率转换• 将 Cache 发出的块操作转化为八个地址请求,
并连续发出• 将北桥返回的访存结果拼成一个 Cacheline
( 256bit ),送至 Cache 模块• 外部信号( Reset 、 Interrupt )锁存后,送往 CPU 内部
北桥接口信号说明• Oe : CPU 输出使能, 1bit
• Ie :北桥输入使能, 1bit
• Iee : CPU 允许北桥输入使能, 1bit
• Sys_con :系统双向传递总线, 65bit– Sys_con[64] : 1 - >CPU 写操作, 2 - >CPU 读
操作– Sys_con[63:32] : 32bit 地址信号– Sys_con[31:0] : 32bit 数据信号
北桥接口信号• Oe = 1 ,表示 CPU 发出访存请求,此时 i
ee = 0 , ie = 0
• Oe = 0 ,表示 CPU 所发的访存请求结束,此时 iee=1 ,允许北桥传送数据
• Ie = 0 ,表示北桥发送访存结果,此时 oe= 0 , iee = 0
• CPU 、北桥均无请求, sys_con 总线置高阻态
实验说明( 1 )• MiniCore 所使用的北桥仅仅是一个初级的
SRAM 控制器,连接 CPU 和 SRAM 及 ROM
• SRAM 大小为 2MB , ROM 大小为 1MB
• 实验提供北桥和 SRAM 及整个系统顶层的Verilog 代码,实验者自行设计 CPU 内部所有模块
实验说明( 2 )• 设计 CPU 内部电路所使用的 Verilog 代码
必须均为可综合方式• 所有时序器件必须使用同步逻辑(时钟上
跳沿触发),不能使用异步逻辑(电平触发)
• 提供 Cache 模块中 SRAM 的仿真用 Verilog 文件,不能自行用寄存器搭建