Skip to content

P4-单周期CPU(Verilog)

先放参考文献hh:)

课下学习

遇到的 bug

  • 用宏一定要 `
  • ori / sw 只执行了几行 (删了 bne 指令就对了,看来是无意间跳转了)
  • 字对齐的输出: $display 要改成 {MemAddr[31:2], 2'b00}
  • 数字在不声明位宽时默认 32 bit,不声明进制时默认十进制

设计细节

使用宏的好处: 我想修改某个控制信号的位宽时,只需要修改宏和 input 中的位宽。

课上总结

T1 eam

eam rd rs rt

取 GPR[rs] 的低 16 位,作为有符号数对 17 取模,得到 16 位的 temp。若 GPR[rt] 的最高位为 1,则将 temp 零扩展,否则将 temp 1 扩展,结果写入 GPR[rd]。注意取模取最小的正数 (比如 16'hffff % 17 = 16'h0010 )

思路: 在 ALU 模块内运算, $signed(num) % 17 求出来是距离 0 最近的数 (有负数) ,所以如果是负数,再加 17

T2 cptl

cptl rs rt offset

如果 GPR[rs] 的低 18 位有连续 6 个 1,则将 PC+4 存入 GPR[rt],否则将 PC+4 存入 31 号寄存器。并且无条件跳转至 PC+4+signExt(offset << 2 || 00)

思路: 和 b 类指令的跳转方式一样,所以归类为 NPC_b ,并且 CMP_cptl 时 CMP 模块始终给出 branch 为 1 的信号。然后处理寄存器写的部分,我是在 ALU 内计算是否有连续 6 个 1,结果给 ALUOut,顶层 mips 模块根据 ALUOut 再确定目的寄存器

T3 olw

olw rs rt offset

有条件的 lw ,当取出的数的二进制从高位到低位是非递减的 (若某位出现了 1,则更低位只能 1) 时,才将这个数写入 GPR[rs]

思路: 先取数,再在 GRF 内判断是不是能写入


考前看了一个学长的回忆,注意到了 for 循环每次开始要清零的问题。考试一般是算数+跳转+访存。纠结的一类题: GRF 的写目的寄存器不确定,这种题要考虑在某个模块给出选择输出……


这次上机感觉挺不顺的,首先上机前在图书馆自习,但是,座位插座没电🪫,就只有在 Mac 上用 CotEditor 写代码。其次,考到最后下载设计文档的时候,我才发现交错了,交成代码了,助教问答环节感觉是挂了。提醒自己: 压缩文件认真命名。考试开始的时候太慌张了,就没下设计文档,这么看来还是幸运的了,不然肯定更慌……再者,只能压缩为 zip 文件提交,考试的时候看压缩到 rar 就直接点了,WA 了一次……