ID级设计符合要求。
2. EX级仿真
(1) ALU子模块仿真
对照ALU功能表,仿真结果正确。说明ALU子模块设计符合要求。
(2) EX模块仿真
ALU子模块功能已测试完毕,只需确认数据选择器与转发电路Forwarding的功能。
26
先观察Forwarding转发电路的信号:
信号之间的逻辑关系符合ForwardingA与ForwardingB的定义关系式。
然后观察操作数A与B的数据选择器的信号: 操作数A:
其中TempA为数据选择器输出信号;A为RsData。 操作数B:
其中TempB为数据选择器输出信号;B为RTData。 波形满足Forwarding的功能要求。
27
观察ALU_A与ALU_B数据选择器功能:
TempA与TempB分别是操作数A与B。从波形上可看出选择器符合设计要求。
EX级设计符合要求。
3. IF级仿真
JR、J、Z都为0,PC输入只 为NextPC=PC+4,符合要求。 {JR、J、Z}=100 PC=JrAddr {JR、J、Z}=010 PC=JumpAddr {JR、J、Z}=001 PC=branchAddr 符合设计要求
IF级符合设计要求。
PC_IFWrite=0,PC保持。 符合设计要求 28
4. 顶层仿真
测试指令为:
dout=32'h0800000b ; // j later
dout=32'h20080042 ; //earlier: addi $t0,$0,42 dout=32'h20090004 ; // addi $t1,$0,4
dout=32'h01095022 ; // sub $t2,$t0,$t1 (操作B一阶相关,操作A二阶相关) dout=32'h01485825 ; // or $t3,$t2,$t0 (操作A一阶相关,操作B三阶相关) dout=32'hac0b000c ; // sw $t3,0c($0) dout=32'h8d2c0008 ; // lw $t4,08($t1)
dout=32'h000c4080 ; // sll $t0,$t4,2 (数据冒险) dout=32'h8d2b0008 ; // lw $t3,08($t1) dout=32'h012a582b ; // sltu $t3,$t1,$t2 dout=32'h0800000a ; //done: j done
dout=32'h14000001 ; //later: bne $0,$0,end (分支条件不成立) dout=32'h1000fff4 ; // beq $0,$0,earlier (分支条件成立) dout=32'h00000000 ; //end: nop
JumpFlag={JR、J、Z}
初始指令为J指令,J=1, 所以IF_flash=1 ,清空IF/ID级寄存器,下一周 期指令=0.
J=1,使PC跳转 bne分支不成立 beq分支成立,Z=1,IF_flash=1,清空IF/ID级寄存器,下一周期指令=0. 29
加立即数4,下一周期操作数B=4,$0始终寄存0,操作数A=0,故ALUResult=4 数据相关,可以看到前两个指令的结果正确转发到操作数A与B 加立即数42,下一周期 $0始终寄操作数B=42,存0,操作数 A=0,故 ALUResult=42 没有跳转,可以看到PC正常增加 LW指令,$t1寄存4,即为操作数A,操作数B为立即数8 Sll位移运算,操作数为Sa=2 同样的LW指令,下一周期不存在数据冒险 $t3 SW指令,操作数B为立即数0c。储存$t3=0000007e,在两周期后存入DataRAM
数据冒险,阻塞信号Stall=1,流水线被阻塞 30