单周期CPU实验

来源:互联网 发布:朱宸慧淘宝店经历 编辑:程序博客网 时间:2024/06/06 03:37

注:为了老师的教学正常进行,不上传代码,只有自己的部分实验报告(不包括实验心得)
注:因为涉及到很多截图,为了节省时间,直接采用截图的方式

1.数据通路图

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

2.实验设计与分析

这里写图片描述
这里写图片描述

对每一条指令的理解

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

3.实验结果截图(略)

4.实验中遇到的问题

(1)PC子模块中最开始的时候没有使用非阻塞赋值,导致PC一直出错。非阻塞赋值使得在结构块结束的时候才进行赋值,而不是立即赋值,后来使用非阻塞赋值后解决了这个错误。
(2)if(PCSrc==1) assign NextPC = PC + 4;将这样的if语句放在过程块中一直出错,一直弄不懂原因,后来请教同学,发现将其放在always结构块中并且检查NextPC的类型就可以解决问题。
(3)若将assign用在过程块initial和always中,此时只支持reg类型,但是对于非过程块中连续赋值,assign支持net型。
(4)对于Extend子模块,我将sa的符号位扩展桶16为立即数的扩展放在一起,使得在执行sll指令的时候能够保证sa扩展为32位。
(5)对于sll,实现起来遇到的麻烦比较大,因为需要同时控制ALUSrcA和ALUSrcB,最终是在CPU主模块中添加了ALUSrcA来作为判断,当执行的ALUSrcA为1的时候,送入到ALU中的data1不再是rs中的数据而是扩展后的sa.
(6) 最开始的时候只写了if语句而对else语句不做处理,本来觉着没什么问题,但是执行后却发现当sll执行过后ALUSrcA就一直为1,不改变,最后添加了else语句使问题得到解决。
这里写图片描述
(7)最开始的时候对于仿真后出现XXX和ZZZ的结果完全不知所措,因为代码也没有报错。后来发现是因为在CPU中各个子模块中的参数的传递顺序不一致。
这里写图片描述
(8)一些小细节的错误,比如单词拼写错误或者是input后面的“,”写成了“;”之类的,或者是output最后不能有“,”或者是“;”。这种错误报错的时候很不明确,所以检查的时候很麻烦。
这里写图片描述
这里写图片描述

5.小结

关键是理解数据通路图,对每条指令,通过数据通路图完整地走几遍能够有效帮助理解。

原创粉丝点击