本博客内容基于《自己动手写CPU》这本书,是设计cpu的理论基础
1.流水线思想
流水线可以将组合逻辑系统的分割,并且在各个部分之间插入寄存器,并暂缓中间数据。
五级流水线优于三级流水线?
流水线将每一个大操作分为若干个小操作,每个小操作的时间变小并且实现并行,提高系统频率,进而提高数据吞吐量。
2.组合逻辑与时序逻辑电路的区别
组合逻辑电路
任意时刻的输出仅由该时刻的输入决定
时序逻辑电路
任意时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。电路里面有存储元件(各类触发器,在FPGA 芯片结构中只有D 触发器)用于记忆信息,从电路行为上讲,不管输入如何变化,仅当时钟的沿(上升沿或下降沿)到达时,才有可能使输出发生变化。
与组合逻辑不同的是:
(1)在描述时序电路的always块中的reg型信号都会被综合成寄存器,这是和组合逻辑电路所不同的。
(2)时序逻辑中推荐使用非阻塞赋值“<=”。
(3)时序逻辑的敏感信号列表只需要加入所用的时钟触发沿即可,其余所有的输入和条件判断信号都不用加入,这是因为时序逻辑是通过时钟信号的跳变沿来控制的。
3.设计流程
虽然前面文章有提到过,不过这里还要再提一下因为他是你设计CPU一定要了解的框架。
4.顶层文件,test Bench文件
在介绍这两个文件之前介绍一下元件例化:在一个复杂的电路的实现过程中,可以将其分割成多个功能单元分别实现,然后通过一个顶层文件调用各个模块单元,将其按照一定的方式连接起来,从而实现最终电路。
基于上图(设计流程),我们来介绍一下这两个文件
顶层文件:
在你编写完整个各个模块的代码后(比如取指的PC,译码的ID),要编写一个顶层文件来将前面写的各个模块连接起来,通过调用各个模块来实现我们的功能。
test Bench文件:
可以思考一个问题,在我们将各个模块设计完成后,如何给出一个时钟信号?
通过test Bench文件,test Bench文件为测试或仿真一个Verilog HDL程序搭建了一个平台,我们被测试的模块施加激励信号,通过观察被测试模块的输出响应,从而判断逻辑是否正确。
因为我用到软件是vivado,所以在添加test Bench文件时要注意添加 simulation的文件
5.五级流水线
五级流水线分别是取指、译码、执行、访存、回写
取指阶段:从指令存储器读出指令,同时确定下一条指令地址。
译码阶段:对指令进行译码,从通用寄存器中读出要使用的寄存器的值,如果指令中含有立即数,那么还要将立即数进行符号扩展或无符号扩展。如果是转移指令,并且满足转移条件,那么给出转移目标,作为新的指令地址。
执行阶段:按照译码阶段给出的操作数、运算类型,进行运算,给出运算结果。如果是Load/Store指令,那么还会计算Load/Store的目标地址。
访存阶段:如果是Load/Store指令,那么在此阶段会访问数据存储器,反之,只是将执行阶段的结果向下传递到回写阶段。同时,在此阶段还要判断是否有异常需要处理,如果有,那么会清楚流水线,然后转移到异常处理例程入口地址处继续执行。
回写阶段:将运算结果保存到目标寄存器。