北航计组P3

北航计组P3设计草图及思考题

设计文档

IFU

flowchart LR subgraph input idoffset[offset] idenable[enable] idreset[reset] end subgraph output ins[Instruction] end subgraph IFU direction LR subgraph ins_unit mem[(IM)] end subgraph pc_unit pc[(PC)]-->mem pc-->add((+)) a([4])-->add add-->|clk|pc end end mem-->ins idenable-->IFU idreset-->IFU idoffset-->add

GRF

flowchart LR subgraph input ida1["A1[4:0]"] ida2["A2[4:0]"] ida3["A3[4:0]"] idWE[WE] idWD["WD[31:0]"] idreset[reset] idenable[enable]-->GRF end subgraph GRF direction LR idreg1[("regs[1]")] idreg2[("regs[2]")] idWrite[write] checkReset-->|reset|reset fetch2 fetch1 checkWrite-->|yes|idWrite end subgraph output idRD1["RD1[31:0]"] idRD2["RD2[31:0]"] end fetch1-->idreg1-->idRD1 fetch2-->idreg2-->idRD2 ida1-->fetch1 ida2-->fetch2 idWE-->checkWrite idreset-->checkReset ida3-->checkWrite idWD-->checkWrite

ALU

flowchart LR subgraph input ida["A[31:0]"] idb["B[31:0]"] idopcode[OPCODE] idenable[enable] end subgraph ALU direction LR appoint-->00[A+B] appoint-->01[A-B] appoint-->02["A|B"] appoint-->03["A>B"] switch 00-->switch 01-->switch 02-->switch 03-->switch end subgraph output idout["OUT[31:0]"] end ida-->appoint idb-->appoint idopcode-->switch-->idout idenable-->ALU

DM

flowchart LR subgraph input idenable[enable] idreset[reset] ida[A] idwa[WA] idwe[WE] idwd[WD] idop["op[0:w,1:hw,2:b]"] end subgraph DM direction LR reset?-->|true|clear idmem[(mem)] writeenable? writeenable?-->|"true and clk^"|idmem end subgraph output idout[OUT] end idenable-->DM idreset-->reset? idwe-->writeenable? idwa-->writeenable? idwd-->writeenable? ida-->|read|idmem idmem-->|"mem[A]"|idout idop-->idmem

Controler-and

flowchart LR subgraph input idop[OP] idfunc[Func] end subgraph CTL direction LR idcheck[checkingOP] idcheck2[checkingFunc] idcheck-->|"op==0"|idcheck2 end subgraph output idadd[add] idsub[sub] idori[ori] idlw[lw] idsw[sw] idbeq[beq] idlui[lui] end idop-->idcheck idfunc-->idcheck2 idcheck-->|=001101|idori idcheck-->|=100011|idlw idcheck-->|=101011|idsw idcheck-->|=000100|idbeq idcheck2-->|=100000|idadd idcheck2-->|=100010|idsub idcheck-->|001111|idlui

Controler-or

add sub ori lw sw beq lui
op1 0 1 0 0 0 1 0
op2 0 0 1 0 0 1 0
WE 1 1 1 1 0 0 1
DWE 0 0 0 0 1 0 0
BI 0 0 1 1 1 0 0
ISR 1 1 0 0 0 0 0
ISI 0 0 1 1 1 0 1
SAVEDATA 0 0 0 1 0 0 0
JI 0 0 0 0 0 1 0
EXP 0 0 0 0 0 0 1
  • WE控制GRF写入
  • DWE控制data写入
  • BI控制ALU B口是否接受imm零扩展输入
  • ISI控制GRF写入地址是否来自rt
  • SAVEDATA控制GRF输入是否为DM输出
  • JI控制是否根据ALUout判断是否Imm作为偏离量输入PC
  • EXP控制GRF输入是否为imm作为高位输入

测试方案

充分利用已经给出的测试程序,添加nop、sub指令,构建测试程序,先跑完后利用比对程序进行比对,再逐步调试与mars对拍对比寄存器数值是否有问题。

思考题

  1. GRF和GM负责存储,其他负责转移
  2. 不太合理,IM和DM不需要分别处理,实际上CPU需要能够从内存中运行应用,应该将IM和DM的存储合并,GRF使用寄存器合理,因为寄存器速度最快。
  3. 实现了立即数高位extend模块用于lui指令,实现了指令分割模块用于将所有可能的数据段分离
  4. 因为nop不会触发任何控制信号,时钟沿不会触发GRF和DM的状态更新
  5. 在DM中设置信号,如果大于设定值则减去设定值
  6. 测试的指令强度合理,但是覆盖不够。add缺少和0运算,没有测试sub,没有测试nop,beq没有向前跳转。
Licensed under CC BY-NC-SA 4.0
京ICP备2021032224号-1
Built with Hugo
主题 StackJimmy 设计
vi ./themes/hugo-theme-learn/layouts/partials/footer.html