自己动手写CPU 笔记
自己动手写CPU
文件夹 |
处理器与MIPS
- 基本的ISA:x86 ARM SPARC Power MIPS
可编程逻辑器件与Verilog HDL
- 不同PLD:PLA PAL GAL PROM EPLD CPLD FPGA
- 基于乘积项的:与或门+存储元件(触发器)
- 基于查找表的:FPGA一般输入变量<=5
- 原理图(Schematic)
- Verilog HDL
- module
- port: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所有指令来实现和相应的机器代码
参考
自己动手写CPU 笔记的更多相关文章
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- 自己动手写CPU之第七阶段(7)——乘累加指令的实现
将陆续上传本人写的新书<自己动手写CPU>.今天是第30篇.我尽量每周四篇 亚马逊的销售地址例如以下.欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...
- 自己动手写CPU之第五阶段(3)——MIPS指令集中的逻辑、移位与空指令
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第17篇.我尽量每周四篇 5.4 逻辑.移位操作与空指令说明 MIPS32指令集架构中定义的逻辑操作指令有8条:and.and ...
- 自己动手写CPU之第六阶段(2)——移动操作指令实现思路
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第21篇,我尽量每周四篇 6.2 移动操作指令实现思路 6.2.1 实现思路 这6条移动操作指令能够分为两类:一类是不涉及特殊 ...
- 自己动手写CPU之第八阶段(4)——转移指令实现过程2
将陆续上传本人写的新书<自己动手写CPU>,今天是第36篇,我尽量每周四篇 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上,发表<自己动手写CPU>书评的前十名读者,均 ...
- 《自己动手写CPU》写书评获赠书活动结果
<自己动手写CPU>写书评获赠图书的读者有: 京东:8***2.16号哨兵.magicyu.kk6803.jddickyd.杰出的胡兵 亚马逊:徐贺.马先童.jaychen.farmfar ...
- 自己动手写CPU之第四阶段(3)——MIPS编译环境的建立
将陆续上传本人写的新书<自己动手写CPU>(尚未出版).今天是第13篇.我尽量每周四篇 4.4 MIPS编译环境的建立 OpenMIPS处理器在设计的时候就计划与MIPS32指令集架构兼容 ...
- 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...
随机推荐
- Java EE (3) -- Java EE 6 Web Services Developer Certified Expert(1z0-897)
Create an SOAP web service in a servlet container Create a RESTful web service in a servlet containe ...
- C++ Primer高速学习 第一章 获得二:输入和输出 (IO)
什么是输入输出.即Input-Output,缩写是非常装B的IO?请看经典民间解释: C++语言的输入输出是指信息从外部输入设备(如键盘.磁盘等)向计算机内部(内存)输入(即Input)和从内存向外单 ...
- C# Out和Ref区别
rel是有进有出,out是只出不进 ref 要求参数在传递给函数前要初始化,out则不需要
- 中文/英文双语言版本TWRP for Nexus5 -hammerheadcaf
编译及作者:laser杨万荣 编译时间: 2015-05-17 编译目的:用于刷cm-12.0 和cm-12.1 ROM 因为现在Nexus5 最新的 CM是 hammerheadcaf ,即和 ao ...
- windows azure Vm、cloud service、web application 如何选择可用的服务
windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...
- 自己定义actionbar
android中的actionbar可提供自己定义view.详细是先写好自己定义view的布局,然后在代码中获取Actionbar对象.调用 setCustomView方法. 可是这样,它还是会显示前 ...
- 2048 Puzzle游戏攻略
2048 Puzzle这是目前手机游戏的很火. 在地铁上经常看到的人玩这个游戏. 首先,简介2048 Puzzle游戏. 游戏界面是4X4广场格,每一方格可以放置在数字. 有四种移动数字的方法,向左. ...
- 座IO理解力
一般堵塞IO服务器通信,通常有一个单独的Acceptor线程负责监控client联系,它接收client对于每个请求连接后client分配用于处理一个新的线程,处理后.返回应答给client.线程才销 ...
- 读书时间《JavaScript高级程序设计》七:表单
在HTML中表单是有<form>元素表示,在JS中表单对应的是HTMLFormElement类型. 表单自有的属性和方法: 获取表单 1. 通过ID document.getElemen ...
- 浅谈web网站架构演变过程(转)
前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管理 交易模块:创建交易和管理 阶 ...