谁说中国不能做CPU?大一生惊爆你眼球

目前只完成了设计概念和硬件描述,支持部分常用32位mips指令(add, sub, lw, sw等)。硬件描述用的是systemverilog语言,生成软件synplify 9.6.2。昨天我测试了执行单元和指令控制单元,这两个主要的组件没大问题,剩下的不敢保证。别抱太大期望,大一计算机工程学生能力有限。下图是中央处理器的寄存器传输层的简化设计概念。
数据路径的部分单元改造自harris & harris的教材“digital design and computer architecture“的微架构例子。为了方便,我们假设内存分为数据内存和指令内存。可见cpu拥有常规的5级流水线(instruction fetch, instruction decode, execute, memory, write back),并有两份数据路径,因此超纯量,理想化下每周期可同时执行10个指令。
蓝线圈的是流水线的执行组件。
红线圈的是数据路径,两个完全相同
在hdl中,我将命名两个运行指令为i0和i1或instr0和instr1,pc为pc0和pc1,下周期pc为pc0f,pc1f。
cpu的完整硬件生成:
我的设计中最有趣(也是最难完成)的部分是名为ifhu(instruction flow and hazard unit)的指令流动及数据冒险控制单元。
原稿:
它内置了一个小型三级流水线,目的就是为了储存(如果存在)指令的rd(destination register),register file的目标地址。地址在ifhu内的流动模拟了真正指令在处理器流水线的执行完成度,因此每次pc从指令内存读出对应指令后,指令如果是beq,r- type或i-type,他们的根寄存器的地址(rs,rt)将于存在于ifhu流水线内的rd做对比,如果有相同地址代表会出现数据冒险。这些结果会输出到ifu(instruction flow unit),指令控制单元,它按照以下原理决定最终指令是否为空指令以及下周期pc的值:
1. i0和i1正常:执行两个指令,pc0,pc1 + 8
2. i1出现跳跃,分支,或数据冒险:执行i0,pc0 = pc1,pc1 + 4
3. i0出现数据冒险:不执行,pc都不变
4. i0出现跳跃或分支:内部执行,pc0为预测或跳跃后pc,pc1 = pc0 + 4
不出错的话pc1应该永远等于pc0。
下面是ifu:
ifhuregselect:
ifhuxorcomp:
ifhu的另一个重要的组件是一个简单的2位分支预测器。目前我的cpu只支持beq(branch on equal)这一个分支指令,不过剩下的也都是这一个来的。这是分支预测器fsm:
设三个状态位元为s2s1s0。主要状态predict taken,weak not taken,和strong not taken分别有自己的子状态in progress,in progress表示已做预测,不知结果,在这个状态下不会再做预测,确保流水线最多执行一个分支预测。根据上面的fsm,可得出一个下个状态的真值表:
分支预测器将先把两个可能的pc存进ff,然后使用预测的方向(s1)选择预测pc。同时一个相反方向的电路(~s1)将选择相反的pc,最终由brsuccess(预测是否成功)来选择最终输出到ifu。
接下来的指令解码流程就比较直接了。mips指令需要读取的寄存器地址直接输进32x32位的寄存器,结果读到rdxx。从这里起,将会有两个数据路径以及两个控制单元。
寄存器或许也同时要储存四个周期前的指令的计算结果或内存数据,wa[4:0]是写入地址,wd[31:0]是写入内容,寄存器的clk依然和处理器同步但 ff在falling edge更换,保持同周期完成。sigext是sign extend的缩写,它负责把指令的immediate从16位扩到32位。
32x32位的寄存器矩阵:
控制单元:
执行单元的输出alucontrol控制alu的功能:
regwrite和memwrite控制寄存器和内存是否写入,risel控制执行单元alu的第二个输入使用寄存器内容还是imm。这些控制电路会如数据电路往流水线的下一个阶段进行。
接下来是 eu(execution unit),执行单元。eu以目前支持的指令来看,只需要一个多功能alu,以后可以加一个fpu和支持simd扩展的计算单元。另外rd1读出的内容直接接到writedata逻辑,在sw指令里,这个将直接写入数据内存。regaddr是r-type或i-type指令的write back地址,因为地址在这两类指令里的位置不一样,控制单元根据opcode输出的risel逻辑会选择对应的地址
r-type:0000 00ss ssst tttt ddddd000 0010 0101 (write back地址为d)
i-type:1000 11ss ssst ttttiiii iiii iiii iiii (write back地址为t)
alu的设计很简单,控制单元根据funct输出的alucontrol[1:0]控制alu的功能。现在只需要add,sub,and,or。我这里懒省事了,本来想自己写个carry look-ahead adder但是时间来不及,直接用sv的“+”了。
这是用modelsim测试eu的结果:
结果都正确。
接下来测一下ifhu,我用以下六个指令
如果正常的话,ifhu应该并行执行指令1和2,到第二个周期,指令4有冒险,因此ifhu应该只执行指令3,并继续读取指令4和5,这两个都依然有冒险,所以在第三周期pc不变。
汇编器的结果:
modelsim运行指令:(完全列出来)
结果:
细看一下第一周期的结果:
可见两个指令都顺利通过,pc都加8
第二周期:
这里的i1f为0开头,代表空指令,pc0 = pc1,而pc1 = pc1 + 4
第三周期:
两个指令都成空指令,pc也不变,根预料的一样。目前ifhu未发现大问题,指令流动正常。
剩下的就不多说了,mem和wb都很直接。如果不是马上要考期末了,我会再加点指令,再仔细测测所有单元。本来还想来个乱序执行设计,再放个寄存器重命名单元和保留站,但现在的能力有限,我想先读几本更深的教材。接下来我把几个主要module的描述发出来。

中国电信联合中兴通讯完成了基于2.1GHz和3.5GHz频谱的5G时频双聚合验证
超声波流量传感器原理及设计
无线倾斜鼠标-加速度计的XBee演示
入耳式无线降噪耳机排名 目前降噪效果最好的耳机品牌
VR产业一度遇冷 5G技术突破带动下回暖
谁说中国不能做CPU?大一生惊爆你眼球
平板电脑和巨屏手机选哪个
牛津光伏公司宣布将把钙钛矿太阳能电池引入市场
张海霞谈“中国芯”现状:我们表面是缺芯,但实际上是缺人
美爆了!设计师曝光iPhone 8 无框屏幕令机身激似玻璃
如何解决显示屏ESD问题的案例分享
基于DSP和FPGA芯片的红外信息数据处理系统设计详解
支持集成电路设计业发展 成都出台重磅政策
压敏电阻电路符号介绍
【笔记】static 在C语言中的用法
喷淋塔远程监控智能运维管理系统解决方案
区块链技术达到主流采用还需克服哪些挑战
人工智能技术助力银行业加快转型步伐进入数字化时代
GP8510是一款高性能PAC芯片,它的功能都有哪些
广和通与华大北斗达成全球战略合作,携手打造高精度GNSS定位解决方案