自己动手写CPU 笔记
来源:互联网 发布:js中for in循环 编辑:程序博客网 时间:2024/06/11 08:32
自己动手写CPU
目录
- 1处理器与MIPS
- 2可编程逻辑器件与Verilog HDL
- 3教学版OpenMIPS处理器蓝图
- 4第一条指令ori
- 5逻辑、移位与nop
- 6移动
- 7算术
- 8转移
- 9Load/Store
- 10协处理器
- 11异常
- 12实践版OpenMIPS
- 13小型SOPC
- 14验证
- 15移植uC/OS-II
- 16附录A 教学版OpenMIPS各个模块的接口说明
- 17附录B OpenMIPS实现的所有指令及对应机器码
- 18参考文献
处理器与MIPS
- 主要的ISA:x86 ARM SPARC Power MIPS
可编程逻辑器件与Verilog HDL
- 不同PLD:PLA PAL GAL PROM EPLD CPLD FPGA
- 基于乘积项的:与或门+存储元件(触发器)
- 基于查找表的:FPGA一般输入变量<=5
- 原理图(Schematic)
- Verilog HDL
- module
- 端口:input, output
- 数据类型:
- net型:wire(0 1 X Z) tri wor trior wand triand tri1 tri0 supply0 supply1
- variable型: reg integer real
- 逻辑功能:assign(阻塞= 非阻塞<=)
- always
- 敏感信号:电平/边沿(posedge, negedge)
- initial
- always
- 编译指示:`define `include `ifdef ...
- 综合(Synthesis):算法/行为描述 --> RTL --> 逻辑门级 --> PLD网表
- ModelSim仿真
教学版OpenMIPS处理器蓝图
- 5级流水线:取指、译码、执行、访存、回写
第一条指令ori
逻辑、移位与nop
- 相关问题(流水线引入了并发竞争?每个阶段可视为单独的HDL模块)
- 数据相关:RAW WAR WAW ==> OpenMIPS只存在RAW相关,例如:ori $1, $0, 0x1100; ori $2, $1, 0x0020
- p111 如果读取的寄存器是在下一个时钟上升沿要写入的,那么直接将要写入的数据作为结果输出
- if( reg2_read_o==1'b1 && ex_wreg_i==1'b1 && ex_wd_i==reg2_addr_o begin reg2_o <= ex_wdata_i; ...
- 插入暂停周期
- 编译器调度(指令重排)
- 数据前推
- p111 如果读取的寄存器是在下一个时钟上升沿要写入的,那么直接将要写入的数据作为结果输出
- 数据相关:RAW WAR WAW ==> OpenMIPS只存在RAW相关,例如:ori $1, $0, 0x1100; ori $2, $1, 0x0020
移动
- 特殊寄存器HI、LO?
算术
- 流水线暂停:保持PC不变,同时第n阶段之前的暂停
- CTRL模块:只有译码、执行阶段可能会有暂停请求
- 乘累加指令:这是不是有点背离了RISC的原则?
- 除法指令(试商法)
转移
- 延迟槽
- 在执行阶段如果转移,会有2条无效指令
- 仍然会导致已经进入取指阶段的指令无效:可在译码阶段进行转移判断,避免浪费时钟周期
- p210 bal是bgezal的特殊情况(rs=0)
Load/Store
- p258 Wishbone总线的相关规范?
- p268 MIPS32特殊的信号量机制:不保证原子操作一定是原子性的,允许检测设置在没有原子性的情况下执行,但只在确实原子运行的时候才让‘设置’生效
- 链接加载ll:LLbit
- 条件存储sc
- load相关问题
- 在译码阶段检查是否与上一条指令存在load相关,如果存在,让译码、取指暂停,而执行、访存、回写继续(相当于插入一个nop)
协处理器
- MIPS32:CP0用作系统控制,CP1、CP3用作浮点处理,CP2保留
- CP0中的寄存器
- Status
- MMU相关:EntryLo0/1 Context
- TLB相关:Index Random PageMask Wired EntryHi ...
- 异常:BadVAddr Cause EPC
- 定时中断:Compare
异常
- 类型:Reset, Soft Reset, DSS DINT NMI, Machine Check, Interrupt, ...
- 精确异常(k, 事务性?)
- 按指令执行的顺序处理异常,而不是按照异常发生的顺序?
- 如果发生异常的指令在延迟槽中,那么保存到EPC的值是PC-4,否则PC
- syscall
- eret
- p332 assign excepttype_o = {19'b0, excepttype_is_eret, 2'b0, instvalid, excepttype_is_syscall, 8'b0};
实践版OpenMIPS
小型SOPC
验证
移植uC/OS-II
附录A 教学版OpenMIPS各个模块的接口说明
附录B OpenMIPS实现的所有指令及对应机器码
参考文献
0 0
- 自己动手写CPU 笔记
- 《自己动手写cpu》读书笔记
- <自己动手写CPU>章七至章九总结
- 自己动手写操作系统 笔记
- 《自己动手写CPU》开始预售了!!
- 自己动手写CPU之计算机体系基础知识
- <自己动手写CPU>碰到的问题
- <自己动手写cpu>之二总结
- 自己动手写操作系统学习笔记
- 自己动手写操作系统笔记1
- java笔记:自己动手写javaEE
- 自己动手写struts笔记1
- 自己动手写struts笔记2
- 自己动手写struts笔记3
- 《自己动手写CPU》写书评获赠书活动结果
- <自己动手写CPU>之一虚拟Ubuntu安装运行
- 自己动手写操作系统--笔记之安装DOS
- <<自己动手写操作系统>>学习笔记(一)---后记
- 10月C++学习心得
- 新建String对象分配内存地址区分
- POJ2029——Get Many Persimmon Trees
- 清醒、坦诚是做人之必须;聪明、智慧是做事之必须!
- ios CLLocationManager定位
- 自己动手写CPU 笔记
- 自驾出游系列之(一): 自驾游应该准备和注意的事项
- Http Response Code[整理]
- Linux Socket TCP通信
- weblogic windows下创建 新域
- 数字隔离器件的选型与应用详解
- Virtualbox虚拟Ubuntu共享文件夹设置
- C#从入门到精通读书笔记 结构、类(四)
- hadoop-HBase-过滤器