大二下学期个人学习笔记(1)——单周期cpu的设计(37条指令,trace比对版)

小学期学习了如何设计制作单周期cpu,现在就把我的制作经验分享一下,也算是给有缘能看到的学弟学妹们一点经验,不过千万不要照抄哦,一定要理解后,再自己动手设计,这样才有意义。

我所设计的单周期cpu实现了37条指令,其中包括24条必做指令与13条选做指令,其指令内容及解释如下图所示。

miniRV-1指令集:

符号释义:

下面就一步步给大家讲解我的设计过程和思路。(附有代码截图)

首先,我们需要理解每条指令的需求以及知道如何根据指令需求设计数据通路。这些在《计算机组成原理》这门课上有讲(我的学校是第四章处理器设计这部分讲了),或者上网查一下就知道,在这我就不多说了。

然后,我们需要制作数据通路表和控制信号表。

这部分很关键!!!因为我们下面写码的时候,也是需要根据这两个表来写!!!

写好这两个表,既有利于理清我们的思路,能让我们更好更快地写码,同时也方便我们debug。

当然,一开始我们是不可能完全写对的,因为设计时,你会发现有些信号需要添加,有些信号位宽需要改变。所以,后面设计我们要对这两个表进行微调。

下面是我的最终版数据通路表和控制信号表(当然,有一两个信号我实现的方法和表中写的不一样,不过无伤大雅,我也懒得改了)。

 数据通路表:

控制信号表:

写完表后,就需要根据自己的理解画图了。

下面是我所设计的单周期cpu数据通路以及各个部件的详细设计(我是用亿图图示软件画的),在这提一下,这个数据通路的信号并不完整,因为后面写cpu的时候,为了方便,另加了几个信号,而这图我也懒得改了,但是总体上无伤大雅。(最好在画图时就标明信号位宽)

完整数据通路图:

ALU数据通路图(这个图有点水,但大体意思还是能表达出来的):

至于其他部件的数据通路图,都是很简单的,在此我就不展示了。

画完图后,就需要根据自己画的图写码了。

就以控制单元为例:

 我们从图中可以看出,控制单元有三个输入信号,其他的都是输出信号,那我们设计控制单元模块时也是这样:

认真看的小伙伴就会发现,比如slt_op信号、B_op信号等,上面的图没有啊!

这我在之前也说了,有些信号是我在设计时添加的,懒得改图了,不过在那两个信号表里还是有的。

 接下来,我们就需要想一下该如何通过输入信号,如opcode信号等,来得出输出信号了。这需要我们结合之前的两个信号表和miniRV-1指令集来进行设计。

看到这,有能力的小伙伴已经可以设计了。当然,也有些还是一头雾水的,下面我就把我的设计分享一下,供你们做个参考(虽然不是很完美)。

 控制单元:

对于其他的部件,也是同样的道理。话不多说,先把码附上。

我设计完控制单元后,就开始设计立即数模块,因为这个模块比较简单。

立即数模块:

 值得提一下的是,sext_J和sext_B立即数最后一位是“0”,我设计时就踩过这个坑,导致PC指令的跳转不对。

接着就是设计寄存器模块,这个也简单。

寄存器模块:

当然,你们也可以采用数组方式存取,我这样设计是想让代码更清晰地对应那32个寄存器(另外,我用数组设计时,好像出错了,不知道为什么)。

再然后,就到ALU的设计了,一定要理清逻辑,怎么方便怎么来。

ALU设计:

在此提一下,verilog里面的数会默认为无符号数,所以如果要强调数是有符号数,就要套用$signed()。

紧接着是PC和NPC模块。

PC模块:

 NPC模块:

然后就是关于lb、lbu、lh、lhu、lw等指令的设计,我是单独把它们拿出一个模块设计的,注意考虑对齐问题。

lb、lbu、lh、lhu、lw指令设计:

 看到这,或许有人就会疑惑了,那这些输入信号的值是谁给他们的呢?又或者说,怎么进行信号传递呢?

这就需要我们进行实例化,通俗点,就是将各个模块用线连接起来。

cpu各部件连线:

 有人应该还有疑问,那这个cpu的输入信号又是谁给的呢?相关的指令又是怎么传进去的呢?

这就与我们程序ROM和数据RAM相关了,在此我也不多说,上网查一下都有详细解释。

相关做法,我是在顶层文件top实例化cpu、程序ROM和数据RAM。

另外,对于sb、sh、sw指令的实现,我也一并在top模块里面做了。当然,你们也可以另开一个模块,然后传递信号,实例化,就像之前的lw等指令的实现一样。

顶层文件top:

对于top输出的这些debug信号,是我们进行trace比对时要用的,其解释如图:

至于trace比对是个什么意思,老师上课讲得很清楚了。简单点说,就是把你设计的cpu运行后的结果与一个已存在的、已知正确的cpu得出的标准答案进行对比,从而debug,找出缺陷,改正错误。

下面是trace测试运行结果截图:

可以看到,所有测试指令全部通过了。

 好了,关于单周期cpu的设计(37条指令,trace比对版)就讲解到这。

再次提醒各位看官,一定要看懂、理解透后,再自己进行设计!!!

重要的事情说三遍!!!

千万千万不要照抄!!!

千万千万不要照抄!!!

千万千万不要照抄!!!

觉得我写得好的话,可以点赞、关注或评论支持我一下呀!

当然,如果有人觉得这样看不方便,我也上传了一个完整的(.v文件)的文件夹,内容和上面的代码是一样的,不过就需要付一点小钱了,链接附上:

https://download.csdn.net/download/qq_52399968/86245080

另外,还有关于trace的下版验证以及外设如何实现,我会在另一篇文章中解释。

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值