【P6】Verilog搭建流水线MIPS-C3-CPU(50条指令)

我开P6是过P5了吗?笑死,P5又挂了,还是经典的blezalc指令,天知道原来我是不会写的,前近一个月每次branch类指令全都加错,而且是错得离谱。但都把重心放在课下debug上了,自以为不就是branch+jal嘛没什么大不了;考前自己练习加到一半就停了,没想到真考到发现还得拓展传递一条信号并流水(?),然后改了半天加完信号流水完后发现错位了(?),然后就无了。

这次纯粹是自己的原因了,不会加指令。然而其实第3条访存指令似乎更容易加,周围也有同学做了t2+t3过的。然而由于前几次课上都是只做了t1/t2,潜意识里就只想做计算类和跳转类。变通赌狗是刻在骨子里的不会。

不过这样下次就会写跳转指令了,下周大概率能过了。保证了课下至少在课上没暴露问题,所以可以做P6了。

确实是技不如人。自己属于是必须踏实做好每一步才可能有所建树的人。心态摆好,踏实做事,慢慢来吧。

课下

Thinking_Log

1.关于cal_i类指令中imm_16的范围

slt $t1, $t2, 0xff00 越界不合法
slt $t1, $t2, 0x7fff 应该是能写的最大数
该imm_16前15位是我们可写,第十六位的设置通过符号表示,不能直接用补码表示。一旦书写的数16位出现1也算溢出不合法。

因而:

  • 0xffffffff : -0x7fff
  • 0x00007fff : 0x7fff
    书写范围:±(0x0000 ~ 0x7fff),可表示的数便是16进制补码的范围

2.关于mips指令中溢出检测问题

0xff001233 - 0x7f001234 从补码的角度看,属于溢出错误:因为这个“负数-正数”超过负数下限,经计算是0x7fffffff(可以先给被减数+1,算完再-1),最大的正数

0x7f001234 - 0xff001233 同样也溢出了!运算结果是0x80000001,“正数-负数”超过的正数上限溢出为负数

Bug_Log

1.sllv及相关类指令位移量未限制

之前循环位移看多了,潜意识就认为没关系。但其实应该取\(GPR[rt]_{4...0}\)

课上

似乎访存指令总有些问题?表面上看似乎可能还是课下问题?反正p5和p6的访存指令都出现未知bug。

posted @ 2021-12-15 22:35  Xlucidator  阅读(277)  评论(0编辑  收藏  举报