最近换工作,CPU的物理设计physical design,PR阶段有点懵,icache,dcache,tlb,mmu,decode等等,巧的是最近看了下操作系统的cpu介绍,颇有些互相印证的关系,对于上述的icache,dcache,最初以为i代表输入,其实i代表instruction,d代表data
关键术语
PC:程序计数器,存放下个执行的指令地址
AC:累加器
IR:指令寄存器
MAR:内存地址寄存器
MBR:内存缓冲寄存器
I/O AR:I/O地址寄存器
I/O BR:I/O缓冲寄存器
CPU运算
以简单地2+3=5为例,譬如2的内存地址为200,3的内存地址为204,最后结果写入2的地址上,这个过程涉及三步:
- 把2放到AC上,AC=2
- 把3加到AC上,AC=AC+3=5
- 把AC的值输出,AC>2
假设有一个32位的cpu,指令肯定是32位,指令由两个域组成,第一个字节存放操作码,第二个存放操作数地址,操作码如下
0001==1:代表将数据从内存中加载到AC上
0101==5:代表从内存加到AC
0010==2: 代表AC存到内存中
对于指令运算分为两部分,取指和执行,指令最初放在内存中100位置,以字节为显示单位,32位格式:字节 - 字节 - 字节 - 字节
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 100 | 1 | 0 | 0 | 200 |
0 | 0 | 0 | 104 | 5 | 0 | 0 | 204 |
0 | 0 | 0 | 108 | 2 | 0 | 0 | 200 |
0 | 0 | 0 | 200 | 0 | 0 | 0 | 2 |
0 | 0 | 0 | 204 | 0 | 0 | 0 | 3 |
取指
PC={0 0 0 100},指令内存地址为{0 0 0 100},指令为{1 0 0 200},存入IR,IR={1 0 0 200}
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 100 | 1 | 0 | 0 | 200 |
执行
获取下次指令,PC={0 0 0 104},解析IR,操作码为1,操作内存地址为{0 0 0 200} ,地址{0 0 0 200}存入MAR,数据{0 0 0 2}存入MBR,执行操作,把内存数据载入至AC,AC=MBR=2
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 200 | 0 | 0 | 0 | 2 |
取指
PC={0 0 0 104},指令内存地址位{0 0 0 104},指令为{5 0 0 204},存入IR,IR={5 0 0 204}
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 104 | 5 | 0 | 0 | 204 |
执行
获取下次指令,PC={0 0 0 108},解析IR,操作码5,操作内存地址{0 0 0 204},地址{0 0 0 204}存入MAR,数据{0 0 0 3}存入MBR,执行操作,把内存中数据加到AC,AC=AC+MBR=5
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 204 | 0 | 0 | 0 | 3 |
取指
PC={0 0 0 108},指令内存地址为{0 0 0 108},指令为{2 0 0 200},存入IR,IR={2 0 0 200}
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 108 | 2 | 0 | 0 | 200 |
执行
无下次指令,PC=NULL ,解析IR,操作码2,操作内存地址{0 0 0 200},地址{0 0 0 200}存入MAR,AC数据载入至MBR中,{0 0 0 5}存入MBR,写入内存
内存地址 | 数据数据 | ||||||
0 | 0 | 0 | 200 | 0 | 0 | 0 | 5 |
取指
PC为空,结束计算,回顾上述执行过程,应该存在问题,欢迎指正。
来源:https://blog.csdn.net/wwb_nuaa/article/details/100065327