北航计组-P4课上
通过阅读本文,你可以大致了解BUAA 2024秋季 P4课上测试的相关内容
题目每年都会发生变化,题面仅靠回忆,题意描述可能与原题有一定差异
T1 SWMM
题面
swmm rt, offset(base)
addr = offset + base
如果GRF[$rt] 为偶数,则将GRF[$rt] 存到Memory[ addr[31:2] | 00 ],否则存到Memory[ addr[29:0] || 00 ]
思路
其实和sw大差不差,但是需要增加DM写入地址的选择器,对于我的设计,我每一条新指令都会有一个新信号newSign,当且仅当执行该指令时,该信号为1,以便于将新指令与原来的指令分隔开,互不影响,具体见P3课上易错点中的实现
对于本题,只需要在顶层模块加一个MUX,直接assign DM_WA = (newSign == 1'b1) ? (GRF_RD2[0] == 1'b1 ? { AluOut[29:0], 2'b00} : { AluOut[31:2], 2'b00}) : AluOut
这样就不会与原来的指令冲突
T2 ES
题面
es rs, rt, Imm
AluOut = GRF[$rs] - GRF[$rt]
beq的变体,减法如果不溢出,就将结果存到$rt,如果溢出了,就跟beq一样跳转
思路
怎么判断溢出,就不赘述了,指令集第一条add中有详细描述,课上描述也易懂
我新增了一位ALU的输出信号new_branch,连接到NPC模块,当且仅当是该指令且满足跳转条件时置为1,NPC中只要该信号为1就跳转
同时,GRF的写使能也需要改变,跟T1差不多,newSign为0时,直接将Controller的RegWrite连过去,否则就判断new_branch,为0的话就可以写入,直接将减法结果写入即可。
值得一提的是,必须先判断newSign,再判断new_branch
我这么做有点麻烦,新增信号,连线不少,务必小心小心再仔细,我就因为两个低级错误调了好一会儿
T3 IBS
题面
ibs rs, rt, rd
如果GRF[$rt] 是对称的,即[0] == [31],[1] == [30]……那么就将GRF[$rs]按位取反后写入$rd,否则直接将GRF[$rs]写入$rt
注意两种条件下写入的寄存器不同
思路
新增一位运算,用for循环判断是否对称,根据判断结果决定ALU的输出
同时跟T2一样,新增一位ALU的输出信号,就叫ALU_new吧,当且仅当是该指令且满足对称条件时置为1,根据它来判断新指令条件下的寄存器写入地址,我是直接在原来GRF_WA_MUX后新增一个MUX,如果ALU_new为1,则选择$rd,其他情况为原来的MUX输出,这样改动不算太大
写在后面
这是第二次P4的课上测试,想看第一次的同学可以去其他的博客呀😄
从这几周看来,第一次的P3,P4,P5挂的人可都不少啊,唉唉,失误机会总共有3次,冷静一周,放缓节奏,让自己轻松一下,也未尝是一件坏事。
本人因为P3挂了,这周就还比较轻松,因为不用搭P5,而有些朋友就很紧张了,极限一两天搭P5,还要面对一堆bug,课上可能一直在de课下的bug,因为课下的弱测实在是太弱了,导致很有可能遗留Bug到课上。而我这周呢,还和室友打了几次游戏,随便复习了一下数分,也终于有时间在操场上漫无目的地闲逛,真切体会到生活的乐趣。P5也有中测可以依赖,不用太过焦虑,也不用变成计组的形状了。
总的来看,挂一次缓缓节奏不一定是件坏事。🫠
下周就是P5了,加油,大家一起加油呀😀 😀 😀