CO_P4

CO_P4

Charles Lv7

CO_P4

P4总结

P4课下总结

有关我P4的cpu的设计文档(内含数据生成器)见P4 Design documents,课程源码见Charles_BUAA_CO_2022/p4/cpu ,本总结仅总结有关P4课下的一些要点内容。

基本思路

对于P4的课下,基本思路是翻译P3的logisim电路,这样不仅可以使自己的Verilog的CPU可读性增强,也有利于后续课上的理解。

本人P4挂过一次,错在了一个小点上(算数位移为>>>而不是>>),结果两道题同时考了这个点,于是我也因此送上首祭。所以我觉得在P4课下时多多注意Verilog的基础知识和易错点。(这个之前总结过,可以见CO-Verilog。)

除此之外要学会看懂RTL,特别是字节运算那几个指令sb,lb等,那几个是RTL的最高难度理解了(除了异常那几个不考的以外)

对于课上而言,P4特别喜欢考循环和位运算两大考点,而sb作为字节操作的经典,非常适合被用于考for循环遍历全字节,使用建议在课下代码的基础上增加一下DM的字节操作如lb,sb,lh,sh等,要不然上机发现自己要添加一个这样的指令还是非常爆炸心态的。

代码风格提示

清晰明了的代码风格可以很有效的提高debug的效率,所以建议要有一个好的代码风格。

  1. 使用单目运算符时要在:后换行,这样防止代码过长而不清晰,也可以在:后写注释以提高代码的可读性。
  2. 对于各个begin end一定要对齐处理,即最好在每次代码完成后对其进行格式化(推荐vscode的Verilog Format)
  3. 在设计板块是不要全部都用数字表示各种使能信号,这样不利于代码的拓展性,可读性也不好,可以设计一个macro.v的文件存储常量宏,并用这些常量宏去代替文中的那些数字。

P4课上总结

对于Verilog的CPU上机,大体和logisim题型难度类似,多为一道计算+一道跳转+一道访存,三题过两题即可通过测试。

在写题顺序方面,笔者建议先大略的扫一遍三道题(这个时间可以顺便下载课程组的Mars和各种jar的包),确定每道题目的类型即可。

增添指令的一般步骤

明确指令RTL
  • 该步骤需要结合题目弄懂指令行为,包括明确指令类型(R型?I型?J型?即明确读和写的目标)、opcode和funct域数据执行功能(计算?跳转?访存?)
  • 最好可以先用MARS模拟下,以免对指令行为理解不到位。
明确数据通路
  • 思考新指令的行为,构思出该新指令的数据通路,然后修改控制器中的相关控制信号。

计算题

计算题一般情况一定要先做,可以很好的稳定心态,因为比较简单!!!

在P4的上机测试中,计算题大多为类似签到题难度,除非遇到了自己本身的一些知识点盲点以外,都是非常好过的。p4中一般只需要增加ALU的功能,但一定要看清楚新指令的计算行为,最好在Mars中模拟一下~~(重要的事情说三遍)~~

由于之前说过P4特别喜欢考for循环(大多是一个32位循环遍历字节的操作),这就导致了assign完全不能适应这种操作,所以如果读者是使用assign语句实现的ALU,建议改成使用always@(*)语句,或者提前写好function语句块再用function调用assign。

跳转题

一般跳转类指令有以下几种要求——

  1. 条件跳转+无条件链接(beq变式)
  2. 条件跳转+条件链接
  3. 无条件跳转+条件链接(jal变式)

正常情况是不会出无条件跳转+无条件链接的,这种太简单了(就是j呗)

跳转题和存储题在P4条件下难度是差不多的(p5开始存储题会比跳转题难很多很多),大家如果看到题目是第1种或第3种类型,那就放心大胆的做就行。

存储题

条件存储,也就是从DM取出值之后,根据这个值是否满足某个condition,再判断要往哪个寄存器写。

总结下来有以下三种类型——

  1. condition成立: 将DM中的值写入A号寄存器
    condition不成立: 写入B号寄存器
  2. condition成立: 将DM中的值写入A号寄存器
    condition不成立: 不写入(小tips:不写入可以理解为写入0号寄存器)
  3. 写入目标完全取决于DM的读取值(如将DM读取值的低5位作为写入目标)【相对较少也较难】

与跳转题一眼,正常情况下是不会出非条件存储的。

条件存储题的主战场在于巧妙的控制controller的使能信号,从而选择合适的值写入即可。

代码风格提示

不同于课下的代码风格提示,课上准备前需要做一些小计俩,来迅速提高课上写代码的效率,课上时间就是金钱啊!

  1. 对于Controller中的内容,建议对每个拓展命令多增加一个为0的最高位,这样如果在上机时遇到需要第四种(以两位举例最大值为3为例子)操作时,你就会遇到在上机时需要对各个部分全部拓展一位为000的情况,这实际上是非常麻烦的,所以建议在上机前避免这种问题。
  2. 同理,在题目中经常使用的模块如ALU,DM也可以提前写好相应的代码段,在上机后直接添加功能即可。

记得要多拿往年题练练手!!推荐下吴佬的计组圣经:P4 单周期 CPU - 2 ,内含往年题。

  • Title: CO_P4
  • Author: Charles
  • Created at : 2023-02-28 11:27:04
  • Updated at : 2023-11-05 21:36:02
  • Link: https://charles2530.github.io/2023/02/28/co-p4/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments