计算机组成原理
实验报告
题目:关于Elements for Multicycle Datapath的设计
-----实验需要自己实践完成,请勿直接复制粘贴结果图片
实验目的
1)熟悉multicycle datapaths中的各个部件的功能,在程序执行时的时序状态,以及组合逻辑;
2)能够更加深入地了解CPU的运行方式和结构,了解处理器的处理步骤和方式,了解计算机的组成原理;
3)能够熟练地使用System C 这种语言来编写相应的模块;
4)能够掌握多周期CPU的原理及其设计方法。
实验内容
一、ALU(逻辑运算单元)
功能:
当F控制为‘0’时,执行加法功能,Y=(A+B);
当F控制为‘1’时,执行逻辑与非功能Y=~(A+B);
同时对A和B做等值判断,O输出为‘1’则A=B;输出为‘0’,则A!=B;
图符:
(ALU的图符)
代码:
测试样例的时序图:
二、ALUresult register(逻辑运算单元结果寄存器)
功能:
在每个时钟的上升沿,储存ALU计算出的结果;
代码:
测试样例的时序图:
三、sign extender(符号扩展器)
功能:
将16位的二进制编码按符号扩展为32位;
OUT(31:0) = SE(IN(15:0)) (按符号扩展)
OUT(31:16) = IN(15)
OUT(15:0) = IN(15:0)
图符:
(sign extender)
代码:
测试样例的时序图:
四、Instruction Register(指令寄存器)
功能:
在每个时钟的上升沿,读取相应位置的Instruction;如果Write enable为1,则读入输入的data;
代码:
测试样例的时序图:
五、Memory(内存)
功能:
储存数量较大的数据,但较之寄存器要慢;
图符:
(Memory)
代码:
测试样例的时序图:
六、MUX-2(2选1选通器)
功能:
通过select控制端控制选择IN1或IN2其中一个,具体功能伪代码如下:
If (select == 0)
OUT = IN1
else
OUT = IN2
图符:
(MUX-2)
代码:
测试样例的时序图:
七、MUX-4(4选1选通器)
功能:
通过两个select控制端控制选择4个输入中的其中一个,具体功能伪代码如下:
代码:
测试样例的时序图:
八、PC(Program Count)
功能:
在每个周期,保存执行的指令所在的地址,并指向下一个指令的地址
代码:
测试样例的时序图:
九、Register file
功能:
是一种快速但存储量较少的存储器件,当W-enable为1时,W用于输入指定写入的寄存器,D为所要写入的数据。
图符:
(Register file)
代码:
测试样例的时序图:
十、Controller
功能:
实现对收到不同operate时控制相应的部件,执行对应的功能以完成各个指令的工作,调度各个部件,并控制其相应指令下的状态。具体实现的多个cycle过程如下图:
图符:
(Controller)
代码:
按定义的顺序分别按照功能和目标,定义了0-14共15个case;具体的细节可参照下表或者查看代码Controller.h:
Case | 按照定义顺序的各部件控制信号 | Next state |
0 | 001010000010 | 1 |
1
|
100000000000 | Opcode: 0 -->2 Opcode: 1 -->4 Opcode: 2 -->6 Opcode: 3 -->9 Opcode: 4 -->11 Opcode: 5 -->13 |
2 | 000000001000 | 3 |
3 | 000001110000 | 0 |
4 | 000000001001 | 5 |
5 | 000001110000 | 0 |
6 | 000000001110 | 7 |
7 | 011000000000 | 8 |
8 | 000000010000 | 0 |
9 | 000000001110 | 10 |
10 | 011100000000 | 0 |
11 | 000000000110 | 12 |
12 | 000000001000 | 0 |
13 | 000000110000 | 14 |
14 | 000000001110 | 0 |
测试样例的时序图:
实验总结
对于这次的实验,我并不能够给出一个令人信服的出色的结果,因为测试的过程中,选取的都是比较简单的测试数据。由于电脑和软件的原因,在driver文件中修改过测试样例之后,有时会无法正常显示出波形图,所以在本次报告里,只有初始的几个简单的样例。这是实验里最为失败的一点。
因为在大一下学期使用VerilogHDL设计过元件和一些简单电路,虽然与System C不大一致,但多少也算有一些基础。然而这学期开始学习计算机组成原理,随着复杂度的上升,对于编译的要求也变得更高,自己的能力也越来越捉襟见肘。大量的学习和实践是提高自己能力的必经途径,自己也在努力地提高自己,但是因为种种原因,还是没能够按照自己预想的那样完成本次实验。
原因之一,是先前自己debug的能力太差,在设计的过程中,遇到过不少bug,经常一整天都在调试,起初常常对提示的问题和错误不明所以,包括各种找不到文件和内存出错的bug,向同学询问,查找各种方法也没有办法解决。各种尝试之后,终于找到了问题的所在,但是因为时间的关系,没有完成Controller的实现。在设计的过程中,经常会出现各种各样的bug,查错耐心和细心缺一不可,这次的实验让我查错的能力有很大提高,总之还是要多动手。
总结了可能的几个bug和注意的要点,在Test文件里positional binding的时候,如果使用<< 来连接,一定要注意顺序的问题;sc_start之后要记得close;将一些部分改为METHOD之后,结果会正常运行;还有一些细节和相关联系的部分需要多加注意。
总得来说,这次的实验自己有很多不足的地方需要改进,但是另一方面也认识到了自己的不足。积极的部分在于真真切切地熟悉了multicycle datapaths中的各个部件的功能,在程序执行时的时序状态,以及组合逻辑,对于System C 这种语言也能够熟练地使用来编写相应的模块,同时也掌握了多周期CPU的原理及其设计方法。希望自己在今后的实验里能够克服困难认真细心有能力完成得更加出色。