北航计组-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了,加油,大家一起加油呀😀 😀 😀


北航计组-P4课上
http://pzhwuhu.github.io/2024/11/11/P4课上/
本文作者
pzhwuhu
发布于
2024年11月11日
更新于
2025年4月18日
许可协议