北航计组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对拍对比寄存器数值是否有问题。
思考题
- GRF和GM负责存储,其他负责转移
- 不太合理,IM和DM不需要分别处理,实际上CPU需要能够从内存中运行应用,应该将IM和DM的存储合并,GRF使用寄存器合理,因为寄存器速度最快。
- 实现了立即数高位extend模块用于lui指令,实现了指令分割模块用于将所有可能的数据段分离
- 因为nop不会触发任何控制信号,时钟沿不会触发GRF和DM的状态更新
- 在DM中设置信号,如果大于设定值则减去设定值
- 测试的指令强度合理,但是覆盖不够。add缺少和0运算,没有测试sub,没有测试nop,beq没有向前跳转。