## 第一章 CPU芯片研发过程概述
### 1/1 处理器和处理器核
当前,常见的处理器芯片不再是传统意义上的“运算器+控制器”,而是一个片上系统(system on chip,SOC),处理器核就是这个SOC上的一个核心IP。
一个处理器芯片中包含的不仅是处理器核,还有高级缓存、高速总线接口控制器和PHY、DDR3/4内存控制器等。
### 1/2 芯片产品的研制过程
1、芯片的定义:在芯片定义阶段,需要进行市场调研,针对客户需求制定芯片的规格定义,并进行可行性分析、论证。
2、芯片设计:芯片设计阶段的工作可以进一步划分为硅片设计和封装设计。
3、芯片制造:硅片设计和封装设计完成后,将被交付到工厂,进入芯片制造阶段又包括掩模制造、晶圆生产和封装生产几个方面。
4、芯片封测:对芯片进行中测和成测通过后,确保这些芯片不会有生产环节引入错误,即可最终验证。
5、芯片验证:将芯片焊接到电路板上,装配成机器并加载软件后,才能开始验证。验证过程中会对芯片的各个技术指标进行测评。
### 1/3 芯片设计的工作阶段
1、明确设计规格
2、制定设计方案
3、进行设计描述(编写RTL代码)
4、功能和性能验证
5、逻辑综合
6、版图规划
7、布局布线
8、网表逻辑验证、时序检查、版图验证
9、交付流片
## 第二章 硬件实验平台及FPGA设计流程
### 2/1 硬件实验平台
FPGA使用ARITEX-7系列的XC7A200T-FBG676。
### 2/2 FPGA的设计流程
1、电路设计
2、代码编写
3、功能仿真
4、综合实现
5、上板调试
### 2/3 任务与实践
这个任务是实现一个流水灯实验,由于我没有实验箱,直接仿真运行,看仿真图即可:
![LAB1仿真图](
## 第三章 数字逻辑电路设计基础
### 3/1 数字逻辑电路设计与Verilog代码开发
这一小结主要讲述Verilog语言的学习与结合硬件数字电路的设计流程,这里可以看书学习,如:《硬件描述语言Verilog》,也可以在网上各平台查找学习资料,如:菜鸟教程,博客等,新手建议先学习基本语法和关键字,再系统的看此书会更有收获。
重点介绍:
1、面向硬件电路的设计思维方式的核心实际上就是“数据通路(datapath)+控制逻辑(control logic)”。
2、行为描述的Verilog编程风格:
【1】行为描述(推荐)优点是代码表达直观、编码效率高、易维护;【2】电路描述;
3、自顶向下的设计划分过程:“自顶向下、模块划分、逐层细化”,书中强烈建议先把电路结构设计考虑周全,再动手写Verilog代码。
4、常用数字逻辑电路的Verilog描述:
【1】硬性规定
1)代码中禁止出现initial语句。
2)代码中禁止出现casex、casez。
3)代码中禁止用“#”表达电流延迟,因为其不可综合。
4)时钟信号clock只允许出现在always @ (posedge clock)语句中。
5)代码中所有带复位的触发器,要么全部是同步复位,要么全部是异步复位。
【2】模块声明和实例化
1)如果一个逻辑至少使用两次,而且这个逻辑采用实例化模块的方式后代码的易读性(代码行数、代码含义)由于直接写逻辑,那么应该封装成模块,如译码器、多路选择器。
2)如果一个逻辑的功能规格十分明确,且与外界的交互信号数量不是很多,那么应该封装成模块,如ALU、regfile等。
3)现有一个模块已经达到数千行代码规模,可以考虑将其拆分成若干个小模块,比如将一个CPU按照流水线划分成若干个模块。
4)建议一个文件中只包含一个模块,便于后期代码维护。
【3】基础逻辑门
当代码想标识一种逻辑关系,如“条件A1满足且条件A2满足,或者条件B满足”,那么用“&&”和“||”;当代码想表述逻辑门,如先行进位加法器的先行进位生成逻辑、乘法器里的华莱士树,那么用“&”和“|”。
【4】运算符的优先级
![Verilog运算符优先级](
后面还结合代码给读者分析了【5】译码器【6】编码器【7】多路选择器【8】简单MIPS CPU中的ALU【9】触发器【10】MIPS CPU中的寄存器堆【11】RAM【12】流水线。
如果上面这些例子你都能看懂并能回答书中的问题,那代表你的Verilog语言已经入门了、哈哈。
### 3/2 数字逻辑电路功能仿真的常见错误及其调试方法
1、功能仿真波形分析
【1】观察仿真波形的思路
第一步,熟悉待调试的设计(在调试之前先熟悉自己的设计,如果有不清楚不明白的地方,一定要先把问题搞清楚,磨刀不误砍柴工)
第二步,找到一个你能明确的错误点(对于复杂的CPU,其功能仿真出错时输出信息通常不会直接告诉你是那个信号出错了,要学会定位错误点的技巧,这个后面的COU设计实践有介绍)
最后,沿着设计的逻辑链条逆向逐级查看信号,直到找到出错的源头(观察含有时序逻辑电路的波形时,先把所用的时钟信号抓取出来,在明确所要查的时序器件,如触发器、同步RAM等是用时钟的上升沿还是下降沿触发,如果从组合逻辑一路追溯到某个触发器或者RAM的Q端上,那么就要把这个触发器的非时钟输入信号都抓取出来,然后在波形上沿着时间轴向前找到这个错误值写入的那个时钟上升(下降)沿,然后在对生成这个触发器或RAM输入组合逻辑继续追溯,一定要找到错误值写入的**真正**时刻)
【2】提高波形分析效率的实用技巧
1)一次仿真记录所有信号的数据
在Vivado的工程视图下,点击左侧的“PROJECT MANAGER”——“SETTINGS”,在弹出的设置界面中选择“Project Settings”——“simulation”,选择右部的“simulation”标签,然后在下面找到“xsim.simulate.log_all_signals”选项勾选,点击OK保存配置。这样一次仿真即可把所有信号都记录下来,需要什么信号再添加即可。
![在这里插入图片描述](
2)给重要的时刻做标记
在波形分析的过程中,要及时给你认为重要的时刻做标记。
3)熟练使用波形缩小和放大功能
4)对关联信号分割、分组
“new divider” “new group”
5)用值查找快速定位多位宽信号
“find value”
2、波形异常类错误的调试(由于过程较复杂,且以实际情况分析,这里只叙述标题)
【1】信号为“Z”
【2】信号为“X”
【3】波形停止
【4】越沿采样
【5】波形怪异
3、进一步使用Vivado
该小结涉及vivado软件使用较多,这里不做讲述,有兴趣的可在网上查找软件的使用方法或私聊我
【1】定制同步RAM IP核
【2】定制异步RAM IP核
【3】查看时序结果和资源利用率
4、实验任务
## 第四章 简单流水线CPU设计
### 4/1 设计一个简单的单周期CPU
1、设计单周期CPU的总体思路
【1】指令系统规范
指令系统是计算机硬件的语言系统,也叫做机器语言,是计算机软件和硬件的接口,能够反映计算机所拥有的基本功能。
指令系统规范是指令系统的规范文件,它对一个指令系统中的各个要素给出明确的定义。
该规范文档本书后面附录C中有详细介绍。
【2】CPU的一般性设计方法
CPU输入的、运算的、存储的、输出的数据都在组合逻辑电路和时序逻辑电路上流转,我们常称这些逻辑电路为**数据通路**。
2、单周期CPU的设计通路设计
【1】ADDU指令(下面是其需要的数据通路部件)
1)PC
2)虚实地址转换
任何时候CPU上运行的程序中出现的地址都是虚地址,而CPU本身访问的内存、IO所用的地址都是物理地址。
3)指令RAM
得到物理地址后,将该地址送往内存,这里我们把RAM进一步拆分为指令RAM和数据RAM两块物理上独立的RAM以简化设计。
4)模块划分考虑
【2】ADDIU指令
【3】SUBU
【4】LW指令
1)访存地址生成
2)数据RAM
3)寄存器堆写回结果选择
【5】SW指令
【6】BEQ和BNE指令
1)判断分支条件
2)计算跳转目标
3)如果跳转,则修改取指PC为跳转目标,否则PC加4——即PC更新
【7】JAL指令
【8】JR指令
【9】SLT和SLTU指令
【10】SLL、SRL和SRA指令
1)移位器的输入/输出
2)移位器的内部实现
【11】LUI、AND、OR、XOR和NOR指令
【12】ALU
3、单周期CPU的控制信号生产
4、复位的处理
### 4/2 不考虑相关冲突的流水线CPU设计
1、添加流水级间缓存
【1】流水线的划分
【2】流水线缓存中存放的内容
2、同步RAM的引入
3、调整更新PC的数据通路
【1】调整转移指令更新PC的数据通路
【2】调整复位更新PC的数据通路
4、不考虑相关冲突情况下流水线控制信号的设计
### 4/3 CPU设计开发环境(CPU_CDE)
1、快速上手CPU设计的开发环境
【1】解压环境
【2】设计你的CPU
【3】集成你的CPU
【4】编译测试程序
【5】生成比对Trace
【6】myCPU仿真
【7】myCPU上板
【8】myCPU调试
【9】MIPS-GCC交叉编译工具的安装
2、CPU设计开发环境的组织与结构
【1】验证所用的计算机硬件系统
【2】功能仿真验证
1)基于Trace比对的调试辅助手段
2)利用参考模型生成golden_trace
3)使用golden_trace监控myCPU
【3】func程序说明
【4】编译脚本说明
【5】编译结果说明
【6】测试程序的装载
【7】仿真验证结果判断
【8】FPGA上板验证结果的判断
3、CPU设计开发环境使用进阶
【1】升级工程和IP核
【2】重新定制inst_ram
【3】重新生成gold_trace.txt
【4】替换mif文件快速仿真
4、CPU设计的功能仿真调试技术
【1】为什么要基于Trace比对的调试辅助手段
CPU执行出错的源头,可能通过测试程序的逻辑路径传递很远后才被验证者发现。而通过这个手段,在大多数情况下,仿真验证平台都能在错误源头的那条指令刚昂执行完的时候立即报错。
【2】基于trace对比调试手段的盲区及其对策(主要有下面三种情况)
1} myCPU死机了
2)myCPU执行一段死循环,且这段死循环中没有写寄存器的指令,比如“1:b 1b;nop”这样的程序片段
3)myCPU执行store指令出错
具体对策见书籍P-119
【3】学会阅读汇编程序和反汇编代码
本书简单的介绍了一些汇编知识, 深入了解汇编相关知识可在网络搜索。
【4】CPU调试中要抓取的信号以及如何看这些信号
【5】指令相关与流水线冲突
【6】流水线数据的前递设计
主要讲述了前递数据通路设计的方案及选择。