程序代写代做代考 cache mips computer architecture 幻灯片 1

幻灯片 1

2017.6.2
重庆大学
硬件综合设计讲解
重庆大学计算机学院
2019.12.11
吕昱峰

page 2
致谢
本课程设计内容依托NSCSCC竞赛,采纳了多种测试、设计方案,特此对以下组织和个人进行感谢:

中国科学院大学
龙芯中科
清华大学
《自己动手写CPU》作者雷思磊
《Digital Design and Computer Architecture 》作者 Sarah L. Harris
课程讲解内容若有侵权请与重庆大学计算机学院计算机组成原理课程组联系。联系方式:lvyufeng@cqu.edu.cn

硬件综合设计任务解析
ISA讲解
52条简单指令的扩展实现
CP0添加
特权指令的实现
答疑

硬件综合设计任务解析
任务书
评分标准
现场添加指令和答辩
实验报告撰写

page 5
MIPS基准指令集规范
硬件综合设计使用的MIPS基准指令集是MIPS32标准指令集的子集,包含所有非浮点MIPS I 指令和MIPS32中的ERET指令,少量的CP0寄存器以支持中断和系统调用,不实现TLB MMU和特权等级。
57条指令
4个CP0寄存器
6种例外(含中断)
采用直接地址映射
不区分核心态和用户态

page 6
MIPS基准指令集构成要素
编程模型
指令定义
操作模式
存储管理
例外处理
CP0寄存器

狭义的“指令集”
运行时环境

page 7
MIPS基准指令集构成要素
编程模型
指令定义
操作模式
存储管理
例外处理
CP0寄存器

page 8
MIPS基准指令集——编程模型
数据格式
比特(bit, b)
字节(Byte, 8bits, B)
半字(Halfword, 16bits, H)
字(Word, 32bits, W)
char
short
int

page 9
MIPS基准指令集——编程模型
寄存器
32个32位通用寄存器,r0~r31
r0,0号通用寄存器,值永远为0
r31,31号通用寄存器,被JAL,BLTZAL和BGEZAL指令隐式的用作目标寄存器,存放返回地址
32位的HI/LO寄存器
HI寄存器存放乘法指令结果的高半部分或是除法指令结果的余数,LO寄存器存放乘法指令结果的低半部分或是除法指令结果的商。
程序计数器(PC)
这个寄存器软件无法直接访问。
操作数是0号寄存器需要考虑相关吗?
软件如何动态获得自己的PC?
int a, b, c;
c = a * b;
会用到HI寄存器吗?

page 10
MIPS基准指令集——编程模型
大小尾端
处理器中的字节顺序和比特顺序均采用小尾端模式,即第0字节永远是最低有效字节,第0比特永远是最低有效比特

page 11
MIPS基准指令集——编程模型
存储访问类型
处理器至少支持不可缓存(uncached)这种存储访问类型。属于此类型的访问将直接读、写物理内存(或物理内存地址映射的寄存器),但不会访问或修改各级缓存中的内容。
sw 0, A
sw 1, A
lw r1, A

请问r1寄存器的值一定等于1吗?

page 12
MIPS基准指令集——编程模型
存储访问类型
uncached存储访问类型还需要确保执行时不会产生“多重读取”(multiple read)效果,即一条具有uncached存储访问类型的load指令至多只产生一次读动作。
真实系统中存在某些会产生“读副作用”的访问对象,譬如:SoC中的FIFO电路结构,每当从FIFO从读取一个数据,则FIFO的读指针自动后移一项,此处的读指针后移就是读动作的一个副作用,它修改了机器状态。又譬如:某些设备中的中断标志寄存器具有“读清”功能,即外部读取该寄存器时,设备在返回该寄存器旧值的同时将寄存器的内容清为0,此处的清0也是读动作的一个副作用,修改了机器状态。
现代操作系统需要ISA提供精确例外的特性。所谓精确例外是指CPU发生例外后,在例外处理程序处理完毕并返回后,重新执行发生例外的指令,就好像什么都没有发生过一样。
如果一个访问具有“读副作用”对象的load指令发生例外了?

page 13
MIPS基准指令集构成要素
编程模型
指令定义
操作模式
存储管理
例外处理
CP0寄存器

page 14
MIPS基准指令集——指令
指令编码格式

引入defines.vh 宏定义

引用方式

取消aludecoder 与maindecoder之间的aluop传输
Aludecoder直接接入op(instr[31:26])、funct(instr[5:0])

page 20
MIPS基准指令集——指令
逻辑运算指令
指令名称格式 指令功能简述
AND rd, rs, rt 位与
ANDI rt, rs, immediate 立即数位与
LUI rt,immediate 寄存器高半部分置立即数
NOR rd, rs, rt 位或非
OR rd, rs, rt 位或
ORI rt, rs, immediate 立即数位或
XOR rd, rs, rt 位异或
XORI rt, rs, immediate 立即数位异或

注意:这三条指令的立即数是零扩展至32位后再参与运算

page 22
MIPS基准指令集——指令
移位指令
指令名称格式 指令功能简述
SLL rd, rt, sa 立即数逻辑左移
SLLV rd, rs, rt 变量逻辑左移
SRA rd, rt, sa 立即数算术右移
SRAV rd, rs, rt 变量算术右移
SRL rd, rt, sa 立即数逻辑右移
SRLV rd, rs, rt 变量逻辑右移

1) 每一对指令间存在的差异仅是源操作数2的来源不同,一个是寄存器一个是立即数。
2) 是否将rt固定为源操作数1请自行决定。

page 23
MIPS基准指令集——指令
数据移动指令
指令名称格式 指令功能简述
MFHI rd HI寄存器至通用寄存器
MFLO rd LO寄存器至通用寄存器
MTHI rs 通用寄存器至HI寄存器
MTLO rs 通用寄存器至LO寄存器

Hilo寄存器

添加到回写阶段

数据相关

page 26
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数[]设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

page 27
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数[]设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

每一对指令,仅存在两处差异:
1) 源操作数2来自寄存器或立即数;
2) 目的寄存器号来自rd域或rt域

page 28
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数[]设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

ADD/ADDI和ADDU/ADDIU的差异仅在于溢出的时候是否报例外

page 29
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数[]设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

补码减法可以转换成补码加法

page 30
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数[]设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

两个数比较大小可以用减法的结果来完成。

page 31
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数[]设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

无符号数比较大小只看最高位的借位信息;
有符号数比较大小根据源操作数的正负情况和结果的正负情况。

page 32
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

不要被名字中的unsigned迷惑了,这两条指令中的立即数仍然是符号扩展至32位后再参与运算

page 33
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

如果用迭代式算法计算的话,有符号和无符号除法是可以统一到一个框架内的。

page 34
MIPS基准指令集——指令
算术运算指令
指令名称格式 指令功能简述
ADD rd, rs, rt 加(可产生溢出例外)
ADDI rt, rs, immediate 加立即数(可产生溢出例外)
ADDU rd, rs, rt 加(不产生溢出例外)
ADDIU rt, rs, immeidate 加立即数(不产生溢出例外)
SUB rd. rs, rt 减(可产生溢出例外)
SUBU rd, rs, rt 减(不产生溢出例外)
SLT rd, rs, rt 有符号小于置1
SLTI rt, rs, immediate 有符号小于立即数设置1
SLTU rd, rs, rt 无符号小于设置1
SLTIU rt, rs, immediate 无符号小于立即数设置1
DIV rs, rt 有符号字除
DIVU rs,rt 无符号字除
MULT rs, rt 有符号字乘
MULTU rs, rt 无符号字乘

无论采用迭代式算法还是华莱士树电路结构,有符号乘和无符号乘也是可以统一到一个框架内的。

乘法
判断有符号乘法的被乘数、乘数,如果是负数,取补码

对乘法结果进行修正
如果是有符号乘法mult,一正一负相乘,需要求补码得到惩罚结果
同号相乘、无符号乘法,不需要修正

除法
除法器需要36个周期

接口 作用 宽度
Rst 复位信号 1
Clk 时钟信号 1
Signed_div_i 是否为有符号除法(1为有符号) 1
Opdata1_i 被除数 32
Opdata2_i 除数 32
Start_i 是否开始除法 1
Annul_i 是否结束除法 1
Result_o 除法结果 64
Ready_o 除法运算是否结束 1

流水线暂停

修改EXE阶段触发器类型
Flopenrc stallE接en信号输入

状态机

page 39
MIPS基准指令集——指令
分支跳转指令
指令名称格式 指令功能简述
BEQ rs, rt, offset 相等转移
BNE rs, rt, offset 不等转移
BGEZ rs, offset 大于等于0转移
BGTZ rs, offset 大于0转移
BLEZ rs, offset 小于等于0转移
BLTZ rs, offset 小于0转移
BLTZAL rs, offset 小于0调用子程序并保存返回地址
BGEZAL rs, offset 大于等于0调用子程序并保存返回地址
J target 无条件直接跳转
JAL target 无条件直接跳转至子程序并保存返回地址
JR rs 无条件寄存器跳转
JALR rd, rs 无条件寄存器跳转至子程序并保存返回地址下

branch指令是延迟槽PC加立即数偏移;jump指令是延迟槽PC高位与立即数偏移拼接。

page 40
MIPS基准指令集——指令
分支跳转指令
指令名称格式 指令功能简述
BEQ rs, rt, offset 相等转移
BNE rs, rt, offset 不等转移
BGEZ rs, offset 大于等于0转移
BGTZ rs, offset 大于0转移
BLEZ rs, offset 小于等于0转移
BLTZ rs, offset 小于0转移
BLTZAL rs, offset 小于0调用子程序并保存返回地址
BGEZAL rs, offset 大于等于0调用子程序并保存返回地址
J target 无条件直接跳转
JAL target 无条件直接跳转至子程序并保存返回地址
JR rs 无条件寄存器跳转
JALR rd, rs 无条件寄存器跳转至子程序并保存返回地址下

这三条分支跳转指令除了修改PC还需要写通用寄存器

Jump jal jr bal分别新添加信号

Jump指令无条件跳转
Jal指令无条件跳转后 延迟槽后的指令写入31号寄存器
Branch类型 带al的指令,跳转后 延迟槽后的指令写入31号寄存器
特例:jalr 不指定rd则写入31号,指定rd则写入rd

根据功能生成信号

增加多路选择器,jal、bal信号控制是否要写到31号寄存器
Jr、jal、bal控制写入数据是否是PC+8

这里的jr用于控制jalr
Jr指令属无条件跳转,不影响执行阶段及以后的数据通路,jalr作为特殊的jr指令,使用jr指令信号

Compare模块进行所有branch指令判断

注意此处 jump信号除了代表j指令外,还接入冒险模块。
因为j、jr都是无条件跳转,EXE及其后续阶段并不需要,直接将其后续清空

要注意的是 jal jalr并不使用jump信号,原因在于 其需要写入regfile,不能清空后续阶段

同理 branch指令也不能直接作为flushE的信号,因为还有al的branch指令,同样需要回写regfile

branch jump Jal Jr Bal
J 0 1 0 0 0
Jal 0 0 1 0 0
Jr 0 1 0 1 0
Jalr 0 0 0 1 0
Branch 1 0 0 0 0
Branch-al 1 0 0 0 1

page 47
MIPS基准指令集——指令
访存指令
指令名称格式 指令功能简述
LB rt, offset(base) 取字节有符号扩展
LBU rt, offset(base) 取字节无符号扩展
LH rt, offset(base) 取半字有符号扩展
LHU rt, offset(base) 取半字无符号扩展
LW rt, offset(base) 取字
LWL rt, offset(base) 非对齐地址取字至寄存器左部
LWR rt, offset(base) 非对齐地址取字至寄存器右部
SB rt, offset(base) 存字节
SH rt, offset(base) 存半字
SW rt, offset(base) 存字
SWL rt, offset(base) 寄存器左部存入非对齐地址
SWR rt, offset(base) 寄存器右部存入非对齐地址

所有访存指令的地址计算方式完全一致。

page 48
MIPS基准指令集——指令
访存指令
指令名称格式 指令功能简述
LB rt, offset(base) 取字节有符号扩展
LBU rt, offset(base) 取字节无符号扩展
LH rt, offset(base) 取半字有符号扩展
LHU rt, offset(base) 取半字无符号扩展
LW rt, offset(base) 取字
SB rt, offset(base) 存字节
SH rt, offset(base) 存半字
SW rt, offset(base) 存字

这些访存指令有地址对齐的要求,违反时将报例外。

大端小端问题
先满足单一测试,大端小端的唯一区别在于顺序,若不符合,全部逆序即可

数据存储器加入使能端en,控制器加入memen信号,仅在访存指令时,数据存储器使能
改为按字节写入,以实现写入单字节、写入半字的功能
按字节读,存储器的读写规则为1是写,0是读,如果不读取的字节置1,则会写入数据,造成错误。所有读数据指令,均按字读取,控制信号为4’b0000,读出数据后控制写入regfile的字节
数据存储器加入输入输出控制,根据aluop生成读写信号,或根据aluop控制写入regfile的字节

根据aluop生成读写信号

或根据aluop控制写入regfile的字节

page 52
MIPS基准指令集构成要素
编程模型
指令定义
操作模式
存储管理
例外处理
CP0寄存器

page 54
与例外、中断相关的几个概念
例外
中断、陷阱、系统调用和任何可以中断程序正常执行流的情况都称为例外(exception)
常见触发异常的事件:
外部事件(中断)
内存翻译异常
程序执行异常(e.g. 溢出, 非对齐访存, 浮点模拟)
系统调用和陷入
数据完整性 (e.g. CacheECC, BusError)
例外类型
例外入口地址
例外优先级

page 55
MIPS基准指令集——例外类型
中断例外(ExcCode=0x0)
当未屏蔽的中断到来时,触发中断例外。
地址错例外(取指或取数据ExcCode=0x4, 写数据ExcCode=0x5)
ADEL ADES
如果lw和sw指令的访问地址不对齐于字边界,或者如果lh、lhu和sh指令的访问地址不对齐于半字边界,又或者如果取指PC不对齐于字边界,触发地址错例外
系统调用例外(ExcCode=0x8)syscall
当执行SYSCALL指令时,触发系统调用例外。
断点例外(ExcCode=0x9)break
当执行一条BREAK 指令时,触发断点例外。
保留指令例外(ExcCode=0xa)
当执行一条未实现的指令时,触发保留指令例外。
整型溢出例外(ExcCode=0xc)overflow
当一条ADD、ADDI或SUB指令执行结果溢出时,触发整型溢出例外。

page 56
MIPS基准指令集——例外入口地址
例外入口地址统一为0xBFC0.0380

page 57
MIPS基准指令集——例外优先级
例外类型 优先级
中断 高
地址错例外——取指
保留指令例外
整型溢出例外、陷阱例外、系统调用例外
地址错例外——数据访问 低

page 58
MIPS基准指令集——CP0寄存器概览
Reg 寄存器名称 功能定义
8 BadVAddr 记录最新地址相关例外的出错地址
12 Status 处理器状态与控制寄存器
13 Cause 存放上一次例外原因
14 EPC 存放上一次发生例外指令的PC

page 64
处理器硬件响应例外的一般性过程
置CP0.Status.EXL位为1,CPU进入特权态且屏蔽所有中断
将例外处理返回后重新开始执行的指令PC填入到CP0.EPC寄存器中
如果发生例外的指令不在分支延迟槽中,则重新开始执行的指令PC就等于发生例外的指令的PC;
否则重新开始执行的指令PC等于发生例外的指令的PC-4(即该延迟槽对应的分支指令的PC),且将CP0.Cause.BD位置为1。
将例外类型编码写入CP0.Cause.ExCode域。
有些异常还需要设置其它CP0寄存器。
例如,发生地址错例外时,将触发例外的错误PC值或load/store指令的虚地址写入CP0.BadVaddr寄存器中
处理器跳转至对应的例外入口开始取指。
由于处理器获得了最高特权等级,意味着必须清空流水线以保证没有用户态指令窃取到高特权进行执行。换言之,发生例外的指令及其后续指令都不能在高特权级执行。

INT

AdEL(addr exception from load or fetch)

AdES(addr exception from store)

SYSCALL

BREAK

RI(invalid instruction)

Ov

page 72
MIPS基准指令集——中断
处理器支持2个软件中断 (SW1~SW2)、6个硬件中断 (HW1~HW5)。
软件中断的中断源即为Cause.IP[1:0]两位,仅可以通过软件对Cause.IP[1:0]位写1进行触发,软件写0进行清除。
硬件中断的中断源来自于处理器外部,由硬件逐拍采样处理器接口上的6个中断输入引脚,软件需要反向遍历系统的中断路由路径,清除终端设备或路由路径上的中断状态,以此来清除处理器的硬件中断。
除全局中断使能外,每个中断源各自含有一个中断屏蔽位。

中断是一种异步的事件,意味着它必须先要被标记到某条指令上,随后才能触发例外。
中断发生的时刻,处理器流水线中可能存在多条指令,标记在哪条指令上是设计者自己的设计选择。
将中断标记在处于译码阶段的指令上是一种引入控制复杂度较小的设计选择。

page 73
处理器硬件响应例外的一般性过程

处理器跳转至对应的例外入口开始取指。
由于处理器获得了最高特权等级,意味着必须清空流水线以保证没有用户态指令窃取到高特权进行执行。换言之,发生例外的指令及其后续指令都不能在高特权级执行。

异常处理后全流水线清空,进入异常处理程序

精确异常

发生异常时,不立即进行处理,仅进行标记,统一将异常处理放到访存或回写阶段

page 77
MIPS基准指令集——指令
自陷指令
指令名称格式 指令功能简述
BREAK 断点
SYSCALL 系统调用

page 78
MIPS基准指令集——指令
特权指令
指令名称格式 指令功能简述
ERET 例外处理返回
MFC0 读CP0寄存器值至通用寄存器
MTC0 通用寄存器值写入CP0寄存器

ERET没有延迟槽。
ERET没有延迟槽。
ERET没有延迟槽。

page 79
MIPS基准指令集——指令
特权指令
指令名称格式 指令功能简述
ERET 例外处理返回
MFC0 读CP0寄存器值至通用寄存器
MTC0 通用寄存器值写入CP0寄存器

特权指令有可能改变处理器的某些控制状态,而一旦这些状态可能影响到后续指令的取指执行时,特权指令就和后续指令之间产生了一种特殊的控制相关。在流水线设计时,这种相关也有可能引入冲突(风险),需要设计时注意。

ERET的两种实现逻辑

作为特殊的跳转指令
从epc读取地址写入到PC
作为一种异常处理
与其他异常相同处理方式,最终转移入口不是异常处理程序入口,而是EPC

page 81
SoC_Lite

page 82
SoC_Lite

page 83
SoC_Lite

page 84
SoC_Lite

page 85
SoC_Lite

page 86
SoC_Lite —— 关注CPU
类SRAM接口
SRAM接口
AHB-Lite
AXI

page 87
MIPS基准指令集——固定地址映射
Status.BEV=1的情况下
 
 
 
 
kuseg
(2G)
kseg3
(512M)
kseg2
(512M)
kseg1
(512M)
kseg0
(512M)
 
 
 
 
kuseg
(2G)
0x0000_0000
0xFFFF_FFFF
0xE000_0000
0xDFFF_FFFF
0xC000_0000
0xBFFF_FFFF
0xA000_0000
0x9FFF_FFFF
0x8000_0000
0x7FFF_FFFF
kseg3
(512M)
kseg2
(512M)
reserved
kseg0/kseg1
(512M)
虚拟地址
物理地址

由Config.K23决定
由Config.K23决定
由Config.K23决定
存储访问类型
由Config.K0决定
恒为uncached属性
存储访问权限控制

仅核心模式可访问
所有模式皆可访问

地址映射
0x80000000->0x00000000
0xbfffffff->0x1fffffff

page 89
自定义类SRAM接口
定义缘由
为搭建一个SoC系统,需要连接多种外设。
存储墙的问题,也导致CPU访存不可能立即得到数据
需要一个支持访存等待的总线接口
大赛要求,首选AHB-Lite接口,
为近一步简化访存接口,提出自定义类SRAM接口
融合AHB-Lite和SRAM接口的特性
提供自定义类SRAM 到 AHB-Lite接口的转换桥
转换桥为 提供的SoC_Lite的 2×3 转换接口

注意:如果不使用我们提供的SoC_Lite,
直接搭建AHB-Lite接口,
或搭建自己定义的总线协议,并连接各外设
则不需要关注 此处 自定义类SRAM接口

page 90
自定义类SRAM接口
SRAM接口的不足
无握手信号:如果数据需要多拍才能回来,则无法适用
读数据无字节使能,一次必须读出整个宽度的数据
新增握手和读字节使能
名称 宽度 方向 描述
clk 1 —>master/slave 时钟
addr 32 —>slave 地址,读写均使用同一地址线,字节寻址
ben 4 —>slave 字节使能信号,指示读写字节的位置
wr 1 —>slave 写使能信号,为0则表示是读操作
din 32 —>slave 写数据
dout 32 slave—> 读数据
addr_ok 1 slave—> 地址、控制信号和写数据已被接收
data_ok 1 slave—> 读数据已经返回或者写数据已经写入

page 91
自定义类SRAM接口
新增字节使能信号 ben,4位宽度,只支持以下访问
读写1字节:4’b0001, 4’b0010, 4’b0100, 4’b1000
读写2字节:4’b0011, 4’b0101, 4’b1001, 4’b0110, 4’b1010, 4’b1100
读写3字节:4’b0111, 4’b1011, 4’b1101, 4’b1110
读写4字节:4’b1111
去掉了 使能信号 en
可使用(| ben)代替
地址改为字节寻址
容量计算:8x 232 bits = 4GB
需指向读写字节的最低有效字节处,需与ben配合
比如读写3字节,ben=4’b1110,则地址低2位需为2’b01
如读写字节使能与地址2位配合不当,则读写结果未知
握手机制
addr_ok,地址、控制信号和写数据在该信号置上后就可以更改了
data_ok,指示读数据返回了,或者写数据已经写入存储器中

page 92
自定义类SRAM接口
读数据 时序图
addr_ok置上,且ben非零,完成一次地址握手,此后,addr、ben、wr可以更改了
data_ok置上,完成一次数据握手,data_ok当拍为有效读出数据
读出的数据,只确保 ben 选中的字节正确,

page 93
自定义类SRAM接口
写数据 时序图
addr_ok置上,且ben非零,完成一次地址握手,
此后,addr、ben、wr、din可以更改了
data_ok置上,完成一次数据握手,表示写入存储器真正完成了
写入的数据,有效写数据应与 ben 对应

接入总线

分频IP,初始频率33MHz
取消reset,locked选中

AHB_lite_to_AXI 使用IP核默认配置

Block mem

结构冲突
注意 此时将产生新的冲突类型——结构冲突
在龙芯测试程序中,测试异常的指令被存放在data_ram中,而单端口RAM不可同时读写,这意味着,如果load指令或store指令在访存阶段读写data_ram,此时无法取指

解决方案
流水线暂停

设置相互独立的指令Cache和数据Cache

page 102
MIPS基准指令集构成要素
编程模型
指令定义
操作模式
存储管理
例外处理
CP0寄存器

page 103
MIPS基准指令集——操作模式
用户模式(user mode)、监管模式(supervisor mode)、核心模式(kernel mode)、调试模式(debug mode)
区分操作模式的最主要目的是为了安全保护,不同操作模式下可操作的系统资源不同,从而确保不同可信程度的软件对资源的访问权限控制。
通常只能通过例外才能从低级别操作模式进入到高级别操作模式,而高级别操作模式通常是通过修改处理器中的操作模式控制位退回至低级别操作模式。

处理器硬件结构上需要维护操作模式的标志(控制)信号。
我们通常假定操作模式的切换不是频繁发生的事件,因此可以采用低效率的阻塞流水线(或流水线回滚)的方式来保证操作模式切换前后指令看到处理器状态的一致性。

page 104
MIPS基准指令集构成要素
编程模型
指令定义
操作模式
存储管理
例外处理
CP0寄存器

page 105
MIPS基准指令集——存储管理
存储管理用于确定:虚实地址映射、存储访问类型、访问控制等。
凡是软件中出现的地址(包括PC)都是虚地址,凡是CPU访问内存用的都是物理地址。因此虚实地址映射总是存在的。
MIPS默认的虚实地址映射是“段-页”式的,但也支持固定地址映射这种备选的虚实映射机制。但即使是在“段-页”式映射机制下,也存在一些段是采用固定映射方式的。所谓固定地址映射方式,就是一个虚地址段内的物理地址等于虚地址加上一个固定的偏移常量。
如果采用固定地址映射机制或是“段-页”式地址映射机制下的固定地址映射段,存储访问类型和访问控制是以段的粒度进行的; “段-页”式地址映射机制下的页表映射段,存储访问类型和访问控制是以页的粒度进行的。

page 106
MIPS基准指令集——固定地址映射
Status.BEV=1的情况下
 
 
 
 
kuseg
(2G)
kseg3
(512M)
kseg2
(512M)
kseg1
(512M)
kseg0
(512M)
 
 
 
 
kuseg
(2G)
0x0000_0000
0xFFFF_FFFF
0xE000_0000
0xDFFF_FFFF
0xC000_0000
0xBFFF_FFFF
0xA000_0000
0x9FFF_FFFF
0x8000_0000
0x7FFF_FFFF
kseg3
(512M)
kseg2
(512M)
reserved
kseg0/kseg1
(512M)
虚拟地址
物理地址

由Config.K23决定
由Config.K23决定
由Config.K23决定
存储访问类型
由Config.K0决定
恒为uncached属性
存储访问权限控制

仅核心模式可访问
所有模式皆可访问

Any Questions?

opcodertimmediate
031261516
rs
252120
I-Type
opcodeinstr_index
0312625
J-Type
opcodertfunction
031261516
rs
252120
R-Type
rdsa
101156

CPUDATA RAMINST RAMAHB-Lite to AXISoC_LiteSRAM-like to AHB_Lite (2×3)龙芯开源模块Confreg自实现CPU16x LED灯2x 双色LED灯8x 数码管8x 拨码开关2x 按钮开关4×4 矩阵键盘Xilinx IPfetchmemTimer

CPUDATA RAMINST RAMAHB-Lite to AXISoC_LiteSRAM-like to AHB_Lite (2×3)龙芯开源模块Confreg自实现CPU16x LED灯2x 双色LED灯8x 数码管8x 拨码开关2x 按钮开关4×4 矩阵键盘Xilinx IPfetchmemTimer

addrdoutben0x123456xxclk…wr12345678addr:naddr:n+4……存储器里数据:n低两位为04’b1110n+1addr_okdata_ok小尾端

addrdinbenclk…wr12345678addr:naddr:n+4……存储器里数据:n低两位为04’b1110n+1addr_okdata_ok32’habcdef01写之前:abcdef78addr:naddr:n+4……写之后:(小尾端)

时间(时钟周期)

1 2 3 4 5 6
M
Reg
ALU

M
Reg
M
Reg
ALU

M Reg
M
Reg
ALU

M
M
Reg
ALU

Reg
M
Reg
7 8
load
指令
i+1
指令
i+2
指令
i+3
M
Reg
ALU

M
指令
i+4

用户模式监管模式核心模式调试模式