µ±Ç°Î»ÖãºÊ×Ò³ > MIPSÁ÷Ë®ÏßCPUµÄverilogʵÏÖ - ͼÎÄ
Instruction_id = 32'h01e85022; //sub $t2,$t1,$t0
²âÊԼĴæÆ÷¼Ä´æ¹¦ÄÜ¡£¶¨Òå¿ØÖÆÐźÅRegWrite_wb=1£»RegWriteAddr_wb=5'b01111£»RegWriteData_wb=32'b1111¡£
¿É¿´µ½Á¢¼´ÊýImm£¬SaÔÚ²»Í¬Ö¸ÁîÖж¼½øÐÐÁËÎÞ·ûºÅÀ©Õ¹£»Rs¡¢Rt¼Ä´æÆ÷µÄÊý¾ÝºÍµØÖ·¶¼¿ÉÒԵõ½¼Ä´æ£¬¿ÉÒÔ±£³ÖÖ±µ½Êý¾ÝµØÖ·±ØÐë¸ü¸Ä¡£Óɴ˵óö¼Ä´æÆ÷¶ÑÄ£¿éRegistersÉè¼Æ·ûºÏÒªÇó¡£
c)¹Û²ìBrandAddrÐźţ¬¿ÉÒÔ·¢ÏÖÆäÂú×ã
BranchAddr=NextPC_id+(sign-extend(Imm_id)<<2)
d)¹Û²ìZÐźſɷ¢ÏÖÆäÂú×ãʽ×Ó
RsData[31] || ~ (| RsData[31: 0]) £» ALUCode=alu _blez RsData[31] £» ALUCode=alu _bltz ~ RsData[31] && (| RsData[31: 0]) £» ALUCode=alu _bgtz Z= ~ RsData[31]£» ALUCode=alu _bgez
| ( RsData[31: 0] ^ RtData[31: 0]) £» ALUCode=alu_bne & ( RsData[31: 0] ~^ RtData[31: 0] )£» ALUCode=alu_beq 0£» ALUCode=OTHER
e) ¹Û²ìStallÐźźÍPC_IFWriteÐźſɷ¢ÏÖÆäÂú×ã¹ØÏµÊ½£º
Stall=((RegWriteAddr_ex==RsAddr_id)||
(RegWriteAddr_ex==RtAddr_id))&&MemRead_ex PC_IFWrite=~Stall
25
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·Ö±ðÊDzÙ×÷Êý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
¹²·ÖÏí92ƪÏà¹ØÎĵµ