Created
October 30, 2014 10:20
-
-
Save chenzx/9faea291af4770613ed5 to your computer and use it in GitHub Desktop.
自己动手写CPU
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
自己动手写CPU | |
跳转至: 导航、 搜索 | |
目录 | |
1 处理器与MIPS | |
2 可编程逻辑器件与Verilog HDL | |
3 教学版OpenMIPS处理器蓝图 | |
4 第一条指令ori | |
5 逻辑、移位与nop | |
6 移动 | |
7 算术 | |
8 转移 | |
9 Load/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 | |
编译指示:`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; ... | |
插入暂停周期 | |
编译器调度(指令重排) | |
数据前推 | |
移动 | |
特殊寄存器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实现的所有指令及对应机器码 | |
参考文献 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment