380 likes | 483 Views
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
E N D
处理器特性介绍 • 全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或Rt) • 判断指令执行所导致的例外(溢出、自陷) • 主要目标:尽量节省硬件开销
控制寄存器模块(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) ※
32bit物理地址的划分 • Tag(20位):比较是否命中 • Index(7位):查找哪一个Cacheline • Offset(5位):定位Cacheline中哪一个字节
Cache的工作流程(读) • 目的:32bit物理地址->访存结果(32bit)
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发出访存请求,此时iee=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文件,不能自行用寄存器搭建
实验说明(3) • 在完成CPU设计之后,将对其进行进一步的综合(Synthesis),生成网表(netlist)文件 • 对网表文件进行零延迟仿真和时序反标仿真(back annotation) • 观察综合及三次仿真(包括行为级仿真)结果,完成实验最终报告