题目
hmo(话说为什么我只记得这个的名字啊)
题目大意
hmo rd,rs,rt
R型指令,若GPR[rs]中1的个数大于GPR[rt]中1的个数,就将rs这个编号存进GPR[rd],否则将rt存进GPR[rd]
做法
区别于正常的R型指令,我是给ALU添加了两个输入,rs和rt编号,然后做操作。其他部分就和别的R型指令一样了。
名字忘啦
题目大意
abcd rs rt label
若GPR[rs]与GPR[rt]相加或相减不会溢出,则跳转并链接。
注意!只有要跳转时才链接!不跳转就不要修改GPR[31]的值!(当然课上是没有这个提示啦)
做法
乍看起来,似乎是branch和jal的结合体。不过因为我jal实现的不算好,所以是直接新增了一个控制信号和ALU的运算,非常粗暴的特判了PCnext和寄存器文件输入数据与输入使能的值,毕竟课上又不需要考虑后续的可扩展性。
名字也忘啦
题目大意
abcd base rt offset
题面非常抽象,我尽量还原
addr= GPR[base]+offset
byte=addr[1:0]
w_addr=addr[31:2]
if(gray(GPR[rt][31:24])==Mem[addr][byte*7+8:byte*7] ||
gray(GPR[rt][23:16])==Mem[addr][byte*7+8:byte*7]||
gray(GPR[rt][15:8])==Mem[addr][byte*7+8:byte*7]||
gray(GPR[rt][7:0])==Mem[addr][byte*7+8:byte*7])//抽象吧?
Mem[addr][byte*8+7:byte*8]=gray(GPR[rt][byte*8+7:byte*8]);
else
Mem[addr][byte*8+7:byte*8]=8'b11111111;
/*
其中,gray代表如下:
将输入的一个字节切成四片,并分别转化为对应的二位格雷码,如:
11101110->10111011(11->10,10->11)
抽象吧?*/
做法
把这个当成sw,然后多加一个模块用于计算这个的值,多加一个控制信号用于选择写入数据存储器的值。
流程上没有难度,难度在于抽象至极的具体实现。这么说吧,考场上我写了一两百行,挂了三次。需要注意的是,GPR[rt][byte8+7:byte8]在verilog中是不行的哦,不允许byte这个变量出现。
总结
跟往年比,难度又一次提升,表现在T3上。如果下一级有看到这篇博客的,祝好。