容我先bb两句
一般来说为了避免影响读者观感,我都会把吐槽放到最后。
但今天实在是憋不住了,先bb两句
极限极限极限极限极限极限极限极限极限极限极限极限
连续两个周,P5和P6都是课上de出来课下的bug,这无论放到谁身上都有些逆天了
愿意看的看最后
必看注意事项
千万别闷头顺序开题!千万别闷头顺序开题!千万别闷头顺序开题!千万别闷头顺序开题!千万别闷头顺序开题!千万别闷头顺序开题!千万别闷头顺序开题!
一般来说,开题顺序是计算类先于跳转类先于存储类!!!!!!!!!!!!
以及,如果怀疑课下有bug,不要灰心,哥们的经验会告诉你别说课下有bug,就是P5P6连着两次课下有bug都没问题(乐)
正文
T1
题面
指令名字忘啦
大意:该指令行为与lw接近,但是不是将读取内容存放到GPR[rt]中,而是存放到:
x=(GPR[rt]^RD)[4:0]// here RD means that the data you have read from DM
write_reg_addr=lower_prime(x)
/*
lower_prime is a function which will return the biggest prime
that lower or equal than x.
if such prime doesn't exist, write_reg_addr=0
*/
write_reg_addr就是要被修改的寄存器地址
我的评价是挺抽象的
我课上没时间做出来,就不放自己的想法了
T2
题面
crt rd,rs,rt
把GPR[rs]循环移位得到的32个结果无符号求和(结果记为temp1),把GPR[rt]循环移位得到的32个结果无符号求和(结果记为temp2),比较这两个结果
if temp1<temp2
GPR[rd]<=-1
else if temp1>temp2
GPR[rd]<=1
else
GPR[rd]<=0
做法
显然,一个非常典型的计算类指令,扩展一下ALU,修改controller和冲突控制单元就解决了
T3
题面
btheq rs rt offset
若GPR[rs]的最高位1位置与GPR[rt]的相同,则跳转。注意,GPR[rs]==0||GPR[rt]==0
时不跳转
做法
显然,这个就是一个最为典型的branch类指令。把beq和bne的实现方法完全复刻一遍就行了
题型总结
(建议先看我前一篇P5课上文章的总结)
P6和P5很像,一共是三种题型:计算类、跳转类、条件存储类
P6需要注意的地方有:
- 和乘除部件有关的计算类。这个其实也不算很难,但是要注意signed的使用。推荐的使用方法是把所有有符号计算的计算结果单独用个中间变量存起来,然后用这个中间变量进行别的无符号计算。典型例子:msub.(标准指令集有该指令)
- 跳转类指令一般是branch或jump的变体,需要考虑清楚两种不同类型的指令的控制信号该如何结合。另外一个难点是延迟槽的清空。我个人的建议是通过插入nop指令来取代延迟槽,而不是清空寄存器。后者会在阻塞发生时比较复杂。
- 条件存储一般是最困难的,因为很可能写哪个寄存器等到W段才会被确定。我的做法是凡是这种题目一律全力阻塞处理。(当然啦,我是一次都没做出来过的,摊手)
吐槽
md,吓死我了!!!!
如果你问我,有什么事情比P5课上查出来课下的bug逆天
那我会说,当然是连续两周P5P6课上查出来课下的bug啦
我先做的T2,(期间还因为过度紧张犯了忘了修改冲突处理单元的愚蠢错误)做完后觉得春风得意。当我看到T3,发现它过于离谱的简单后,得意更是充满了我的内心。稳辣!我如是想。
于是,我很快的写完了T3的代码。交上去之后,只有前四个点WA了。”这有什么大不了的,“我想,”不过是WA了四个点罢了。“
当我检查了四五遍,构造了无数数据都没有找到错误时,我承认我慌了。我开始怀疑是不是课下有问题。”但是,人不能总是这么倒霉吧,更何况我T2已经过了。“
但是,裸交一发T1,报错和T3报错一样后,我麻了。艹,原来真的会有大怨种连续两次课上发现课下的bug。原来真的会有强测数据没测出来这种情况存在。
(在此非常感谢助教学长T1T3强测用一样的数据,且T3测试数据新增指令放到了很靠后的地方放我一条狗命!!!!!)
怎么办呢?我开始疯狂的构造反例数据。但是无论我如何去构造,始终没法卡出bug。
灵光一闪之下,我想到了我的课下数据生成器。该数据生成器为了向数据合法性妥协,并没有测试bne指令的正确性。
会不会是因为这个呢?
然后我开始使用我最擅长的debug方法——瞪眼法。在瞪到controller时,我发现ext的控制信号有问题。bne忘了加上去,导致bne指令的offset是进行零扩展的。
我在考场上瞪出来这个的时候,我真的仰天长笑(当然没出声),天不亡我,天不亡我。
后来,一发入魂,虽然已经八点半了,没时间做T1,但是好歹过了。
这件事情告诉我们,数据生成器真的有用!(虽然我原本的设计不是这么发挥作用的())