CPU設(shè)計實戰(zhàn):LoongArch版 課件全套 01-LoongArch32精簡版指令部分介紹 -09-Cache設(shè)計實驗_第1頁
CPU設(shè)計實戰(zhàn):LoongArch版 課件全套 01-LoongArch32精簡版指令部分介紹 -09-Cache設(shè)計實驗_第2頁
CPU設(shè)計實戰(zhàn):LoongArch版 課件全套 01-LoongArch32精簡版指令部分介紹 -09-Cache設(shè)計實驗_第3頁
CPU設(shè)計實戰(zhàn):LoongArch版 課件全套 01-LoongArch32精簡版指令部分介紹 -09-Cache設(shè)計實驗_第4頁
CPU設(shè)計實戰(zhàn):LoongArch版 課件全套 01-LoongArch32精簡版指令部分介紹 -09-Cache設(shè)計實驗_第5頁
已閱讀5頁,還剩168頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

LoongArch32精簡版指令集介紹20102指令集概述指令集用戶態(tài)部分介紹30102指令集概述指令集用戶態(tài)部分介紹龍芯自主指令系統(tǒng)架構(gòu)LoongArch4“充分考慮兼容需求的自主指令系統(tǒng)”遵循RISC指令設(shè)計風格32位定長指令編碼風格load/store架構(gòu)32個通用寄存器32個浮點/向量寄存器分為32位和64位兩個版本,簡稱LA32和LA64架構(gòu)采用基礎(chǔ)部分加擴展部分的整體架構(gòu)基礎(chǔ)指令集(~340條)二進制翻譯擴展、向量擴展、虛擬化擴展面向高校教學科研的LoongArch精簡版5基于LoongArch32位版本的精簡子集——LoongArch32

Reduced用戶態(tài):保留典型應用中最常用的指令整數(shù)指令~50條,訪存指令僅“基址+偏移”尋址方式且要求地址對齊浮點數(shù)指令可以不實現(xiàn),也可以只實現(xiàn)單精度部分原子同步指令僅LL/SC,軟件維護指令與數(shù)據(jù)Cache的數(shù)據(jù)一致性核心態(tài):支持主流類Unix操作系統(tǒng)僅包含PLV0和PLV3兩個特權(quán)等級支持例外與中斷,但入口為同一個支持TLBMMU,軟件負責TLB重填軟件生態(tài):維護一個獨立的小系統(tǒng)QEMU、GCC、……PMON、Linuxkernel、busybox、buildroot60102指令集概述指令集用戶態(tài)部分介紹指令集用戶態(tài)部分介紹提綱7數(shù)據(jù)類型寄存器指令編碼格式用戶態(tài)指令功能速覽C語言的機器表示數(shù)據(jù)類型8比特(bit,簡記b)字節(jié)(Byte,簡記B,8bit)半字(Halfword,簡記H,16bit)字

(Word,簡記W,32bit)LAMIPSIRV32Ibitbitbitbit8bitByte,BByte,BByte,B16bitHalfword,HHalfword,HHalfword,H32bitWord,WWord,WWord,W寄存器9通用寄存器(GR)32個32位寬寄存器,0號寄存器恒為0程序計數(shù)器(PC)32位寬獨立于通用寄存器,僅被轉(zhuǎn)移指令修改浮點指令操作浮點寄存器,其獨立于通用寄存器LAMIPSIRV32I通用寄存器32個32位(0號恒為0)32個32位(0號恒為0)32個32位(0號恒為0)程序計數(shù)器獨立于通用寄存器,僅被轉(zhuǎn)移指令修改獨立于通用寄存器,僅被轉(zhuǎn)移指令修改獨立于通用寄存器,僅被轉(zhuǎn)移指令修改浮點寄存器獨立于通用寄存器獨立于通用寄存器獨立于通用寄存器LA精簡版指令格式10指令都是32位長指令均需4字節(jié)邊界對齊8種指令格式單一操作碼域(opcode)寄存器操作數(shù)域(rd,rj,rk,ra)rd—通常作為目的寄存器rj—通常作為源寄存器1rk—通常作為源寄存器2ra—通常作為源寄存器3立即數(shù)域(imm)(1+)5種不同的長度訪存與整型計算:12位CSR尋址:14位轉(zhuǎn)移指令:16位、21位、26位所有指令至多一個目的寄存器“兩源一目的”的3R-type是最常見的指令格式;4R-type僅出現(xiàn)在浮點運算中。LA精簡版指令格式舉例11三種RISC指令格式比較12三種RISC指令格式具有共性:定長1、對齊、指令格式種類少操作碼域、寄存器域和立即數(shù)域“兩源一目的”三寄存器操作數(shù)格式最常用要讀寫的寄存器號出現(xiàn)的位置(基本)固定不變RV最徹底,MIPS和LA有少量例外注:1.嚴格來說,RISC-V的指令長度是16位的倍數(shù),是一種具有RISC編碼風格的變長指令編碼。不過,教學中常用的RV32G所包含的指令都是32位定長的。LoongArch32Reduced指令簡明列表13ADD.Wrd,rj,rkADDI.Wrd,rj,si12SUB.Wrd,rj,rkLU12I.Wrd,si20PCADDU12Ird,si20SLTrd,rj,rkSLTUrd,rj,rkSLTIrd,rj,si12SLTUIrd,rj,si12NORrd,rj,rkANDrd,rj,rkORrd,rj,rkXORrd,rj,rkORNrd,rj,rkANDNrd,rj,rkANDIrd,rj,ui12ORIrd,rj,ui12XORIrd,rj,ui12SLL.Wrd,rj,rkSRL.Wrd,rj,rkSRA.Wrd,rj,rkSLLI.Wrd,rj,ui5SRLI.Wrd,rj,ui5SRAI.Wrd,rj,ui5MUL.Wrd,rj,rkMULH.Wrd,rj,rkMULH.WUrd,rj,rkDIV.Wrd,rj,rkMOD.Wrd,rj,rkDIV.WUrd,rj,rkMOD.WUrd,rj,rkLD.Brd,rj,si12LD.Hrd,rj,si12LD.Wrd,rj,si12ST.Brd,rj,si12ST.Hrd,rj,si12ST.Wrd,rj,si12LD.BUrd,rj,si12LD.HUrd,rj,si12LL.Wrd,rj,si14SC.Wrd,rj,si14PRELDhint,rj,si12DBARhintIBARhintJIRLrd,rj,offsBoffsBLoffsBEQrj,rd,offsBNErj,rd,offsBLTrj,rd,offsBGErj,rd,offsBLTUrj,rd,offsBGEUrj,rd,offsRDCNTVL.WrdRDCNTVH.WrdRDCNTIDrjBREAKcodeSYSCALLcodeCSRRDrd,csrCSRWRrd,csrCSRXCHGrd,rj,csrCACOPcode,rj,si12TLBSRCH

TLBRD

TLBWR

TLBFILL

INVTLBop,rj,rkERTN

IDLEhint整數(shù)加減運算14add.w(add

word)

add.wrd,rj,rk GR[rd]=GR[rj]

+

GR[rk]sub.w(subtractword)

sub.wrd,rj,rk GR[rd]=GR[rj]-GR[rk]addi.w(add

immediateword)

addi.wrd,rj,si12 GR[rd]=GR[rj]+sext32(si12)LAMIPSIRV32Iadd.wrd,rj,rkaddurd,rs,rtaddrd,rs1,rs2sub.wrd,rj,rksuburd,rs,rtsubrd,rs1,rs2addi.wrd,rj,si12addiurs,rs,si16addird,rs1,si12注:sext32(A)表示將數(shù)值A(chǔ)符號擴展到32位寬。例如sext32(0x01)=0x00000001,sext32(0x80)=0xffffff80。整數(shù)比較運算15slt(setlessthan)

sltrd,rj,rk GR[rd]=GR[rj]<signed

GR[rk]sltu(setlessthanunsigned) slturd,rj,rk GR[rd]=GR[rj]<unsigned

GR[rk]slti(setlessthanimmediate)

sltrd,rj,si12 GR[rd]=GR[rj]<signedsext32(si12)sltui(setlessthanunsignedimmediate)

sltrd,rj,si12 GR[rd]=GR[rj]<unsigned

sext32(si12)LAMIPSIRV32Isltrd,rj,rksltrd,rs,rtsltrd,rs1,rs2slturd,rj,rkslturd,rs,rtslturd,rs1,rs2sltird,rj,si12sltird,rs,si16sltird,rs1,si12sltuird,rj,si12sltiurd,rs,si16sltiurd,rs1,si12注:<signed

將兩個操作數(shù)視作有符號數(shù)進行小于比較;<unsigned

將兩個操作數(shù)視作無符號數(shù)進行小于比較。邏輯位運算16and(and)

andrd,rj,rk GR[rd]=GR[rj]&GR[rk]or(or) orrd,rj,rk GR[rd]=GR[rj]|GR[rk]nor(notor) norrd,rj,rk GR[rd]=~(GR[rj]|GR[rk])xor(exclusiveor) xorrd,rj,rk GR[rd]=GR[rj]^GR[rk]andi(and

immediate) andird,rj,ui12 GR[rd]=GR[rj]&zext32(ui12)ori(or

immediate) orird,rj,ui12 GR[rd]=GR[rj]|zext32(ui12)xori(exclusiveor

immediate) xorird,rj,ui12 GR[rd]=GR[rj]^zext32(ui12)LAMIPSIRV32Iandrd,rj,rkandrd,rs,rtandrd,rs1,rs2orrd,rj,rkorrd,rs,rtorrd,rs1,rs2norrd,rj,rknorrd,rs,rtN.A.xorrd,rj,rkxorrd,rs,rtxorrd,rs1,rs2andird,rj,ui12andird,rs,ui16andird,rs,si12orird,rj,ui12orird,rs,ui16ordird,rs,si12xorird,rj,ui12xorird,rs,ui16xorird,rs,si12注:zext32(A)將數(shù)值A(chǔ)零擴展到32位寬。例如zext32(0x01)=0x00000001,zext32(0x80)=0x00000080。移位運算17sll.w(shiftleftlogicword)

sll.wrd,rj,rk GR[rd]=GR[rj]<<GR[rk][4:0]srl.w(shiftrightlogicword) srl.wrd,rj,rk GR[rd]=GR[rj]>>logic

GR[rk][4:0]sra.w(shiftrightarithmeticword) sra.wrd,rj,rk GR[rd]=GR[rj]>>arithGR[rk][4:0]slli.w(shiftleftlogicimmediateword) slli.wrd,rj,ui5 GR[rd]=GR[rj]<<ui5srli.w(shiftrightlogicimmediateword) srli.wrd,rj,ui5 GR[rd]=GR[rj]>>logicui5srai.w(shiftrightarithmeticimmediateword) srai.wrd,rj,ui5 GR[rd]=GR[rj]>>arithui5LAMIPSIRV32Isll.wrd,rj,rksllvrd,rt,rssllrd,rs1,rs2srl.wrd,rj,rksrlvrd,rt,rssrlrd,rs1,rs2sra.wrd,rj,rksravrd,rt,rssrard,rs1,rs2slli.wrd,rj,ui5sllrd,rt,sasllird,rs1,shamtsrli.wrd,rj,ui5srlrd,rt,sasrlird,rs1,shamtsrai.wrd,rj,ui5srard,rt,sasraird,rs1,shamt注:>>logic

表示邏輯右移,>>arith

表示算術(shù)右移。立即數(shù)裝載18lu12i(loadupperfrombit12

immediate)

lu12ird,si20 GR[rd]={si20,12’b0}與ori指令配合裝載一個值落在[-211,212-1]之外的32位立即數(shù)IMMlu12i$t0,IMM[31:12]ori$t0,$t0,IMM[11:0]MIPS采用高、低兩個16位的拆分風格,因其普通立即數(shù)運算指令的立即數(shù)是16位寬RV32I采用高20位、低12位的拆分風格,因其普通立即數(shù)運算指令的立即數(shù)是12位寬RV32I不能只用“l(fā)ui+ori”的指令對,因其ori指令的立即數(shù)采用的是符號擴展LAMIPSIRV32Ilu12ird,si20luird,si16luird,si20PC相對計算19pcaddu12i(pc

add

upperfrombit12

immediate)

pcaddu12ird,si20 GR[rd]=PC+{si20,12’b0}與jirl、load/store指令配合完成PC相對32位偏移地址的跳轉(zhuǎn)、訪存pcaddu12i$t0,IMMH#假設(shè)期望的PC相對32位偏移值為OFFSET,且為4的倍數(shù)jirl$zero,$t0,IMML#OFFSET={IMMH[19:0],12’b0}+sext32({IMML,2’b0},32}pcaddu12i$t0,IMMH#假設(shè)期望的PC相對32位偏移值為OFFSETld.b$t1,$t0,IMML#OFFSET={IMMH[19:0],12’b0}+sext32(IMML,32)LAMIPSIRV32Ipcaddu12ird,si20N.A.auipcrd,si20乘除運算20mul.w(multiplywordsigned)

mul.wrd,rj,rk GR[rd]=(GR[rj]*signed

GR[rk])[31:0]mulh.w(multiplyhighwordsigned) mulh.wrd,rj,rk GR[rd]=(GR[rj]*signed

GR[rk])[63:32]mulh.wu(multiplyhighwordunsigned) mulh.wurd,rj,rk GR[rd]=(GR[rj]*unsigned

GR[rk])[63:32]div.w(dividewordsigned) div.wrd,rj,rk GR[rd]=GR[rj]/signed

GR[rk]mod.w(modulowordsigned) mod.wrd,rj,rk GR[rd]=GR[rj]%signed

GR[rk]div.wu(dividewordunsigned) div.wurd,rj,rk GR[rd]=GR[rj]/unsigned

GR[rk]mod.wu(modulowordunsigned) mod.wurd,rj,rk GR[rd]=GR[rj]%unsigned

GR[rk]LAMIPSIRV32Mmul.wrd,rj,rkmultrs,rtmulrd,rs1,rs2mulh.wrd,rj,rkmultrs,rtmulhrd,rs1,rs2mulh.wurd,rj,rkmulturs,rtmulhurd,rs1,rs2div.wrd,rj,rkdivrs,rtdivrd,rs1,rs2mod.wrd,rj,rkdivrs,rtremrd,rs1,rs2div.wurd,rj,rkdivurs,rtdivurd,rs1,rs2mod.wurd,rj,rkdivurs,rtremurd,rs1,rs2注:*signed

將兩個操作數(shù)視作有符號數(shù)進行乘法;*unsigned

將兩個操作數(shù)視作無符號數(shù)進行乘法。/signed

將兩個操作數(shù)視作有符號數(shù)進行除法取商,%signed

將兩個操作數(shù)視作有符號數(shù)進行除法取余;/unsigned

將兩個操作數(shù)視作無符號數(shù)進行除法取商,%unsigned

將兩個操作數(shù)視作無符號數(shù)進行除法取余。注:取64位乘積低32位取64位乘積高32位條件分支21beq(branchonequal)

beqrj,rd,off16

if(GR[rj]==GR[rd])PC=TakenTgtbne(branchonnotequal) bnerj,rd,offs16 if(GR[rj]!=GR[rd])PC=TakenTgtblt(branchonlessthansigned) bltrj,rd,offs16 if(GR[rj]<signedGR[rd])PC=TakenTgtbge(branchongreaterthanorequalsigned)

bgerj,rd,offs16

if(GR[rj]>=signedGR[rd])PC=TakenTgtbltu(branchonlessthanunsigned) blturj,rd,offs16 if(GR[rj]<unsignedGR[rd])PC=TakenTgtbgeu(branchongreaterthanorequalunsigned)

bgeurj,rd,offs16

if(GR[rj]>=unsignedGR[rd])PC=TakenTgtLAMIPSIRV32Ibeqrj,rd,offs16beqrs,rt,off16beqrs1,rs2,offs12bnerj,rd,offs16bners,rt,off16bners1,rs2,offs12bltrj,rd,offs16N.A.bltrs1,rs2,offs12bgerj,rd,offs16N.A.bgers1,rs2,offs12blturj,rd,offs16N.A.blturs1,rs2,offs12bgeurj,rd,offs16N.A.bgeurs1,rs2,offs12TakenTgt=PC+sext32({off16,

2’b0})有延遲槽沒有延遲槽沒有延遲槽無條件相對PC跳轉(zhuǎn)22b(branch)

boffs26

PC=BrTargetbl(branchandlink) bloffs26 GR[1]=PC+4;PC=BrTargetLAMIPSIRV32Iboffs26jtargetjalzero,offs20bloffs26jaltargetjalrd,offs20BrTarget=PC+sext32({off26,2’b0})有延遲槽沒有延遲槽沒有延遲槽無條件間接跳轉(zhuǎn)23jirl(jumpindirectregisterlink)

jirlrd,rj,offs16

GR[rd]=PC+4; PC=GR[rj]+sext32({offs16,2’b0})幾種常用的間接跳轉(zhuǎn)指令是jirl指令的特殊形式1)非link的間接跳轉(zhuǎn):jrrj,其實是jirlr0,rj,0;其中最常見的函數(shù)返回jrra,是jirlr0,r1,02)常用間接函數(shù)調(diào)用(用jrra指令返回的):jirlrj,其實是jirlr1,rj,0。LAMIPSIRV32Ijirlrd,rj,offs16jrrsjalrrd,rsjalrrd,rs1,offs12有延遲槽沒有延遲槽沒有延遲槽普通訪存24ld.b(load

bytesigned)

ld.brd,rj,si12 GR[rd]=sext32(MEM[GR[rj]+sext32(si12)][7:0])ld.bu(load

byteunsigned)

ld.burd,rj,si12 GR[rd]=zext32(MEM[GR[rj]+sext32(si12)][7:0])ld.h(load

halfwordsigned)

ld.hrd,rj,si12 GR[rd]=sext32(MEM[GR[rj]+sext32(si12)][15:0])ld.hu(load

halfwordunsigned)

ld.hurd,rj,si12 GR[rd]=zext32(MEM[GR[rj]+sext32(si12)][15:0])ld.w(load

wordsigned)

ld.wrd,rj,si12 GR[rd]=MEM[GR[rj]+sext32(si12)][31:0]st.b(storebyte)

st.brd,rj,si12

MEM[GR[rj]+sext32(si12)][7:0]=GR[rd][7:0]st.h(storehalfword)

st.hrd,rj,si12

MEM[GR[rj]+sext32(si12)][15:0]=GR[rd][15:0]st.w(storeword)

st.wrd,rj,si12

MEM[GR[rj]+sext32(si12)][31:0]=GR[rd][31:0]LAMIPSIRV32Ild.brd,rj,si12lbrt,offs16(rs)lbrd,offs12(rs1)ld.burd,rj,si12lburt,offs16(rs)lburd,offs12(rs1)ld.hrd,rj,si12lhrt,offs16(rs)lhrd,offs12(rs1)ld.hurd,rj,si12lhurt,offs16(rs)lhurd,offs12(rs1)ld.wrd,rj,si12lwrt,offs16(rs)lwrd,offs12(rs1)st.brd,rj,si12sbst,offs16(rs)sbrs2,offs12(rs1)st.hrd,rj,si12shst,offs16(rs)shrs2,offs12(rs1)st.wrd,rj,si12swst,offs16(rs)swrs2,offs12(rs1)原子訪存25ll.w(loadlinkedword)

ll.wrd,rj,si14 GR[rd]=MEM[GR[rj]+sext32({si14,2’b0})][31:0];LLbit=1sc.w(storeconditionalword) sc.wrd,rj,si14 ifatomic_update_is_ok MEM[GR[rj]+sext32({si14,2’b0})][31:0]=GR[rd]; GR[rd]=1 else GR[rd]=0LAMIPSIRV32All.wrd,rj,si14llrt,offs16(rs)lr.wrd,(rs1)sc.wrd,rj,si14scrt,offs16(rs)sc.wrd,rs2,(rs1)//compare_and_swapMEM[a0],GR[a1]--expectedvalue,GR[a2]--newvalue1: ori t0,a2,0 //movet0,a2 ll.w t1,a0,0 bne t1,a1,2f sc.w t0,a0,0 beq t0,r0,1b2:預取指令26preld(preload)

preld

hint,rj,si12

Prefetch(hint,MEM[GR[rj]+sext(si12)])沒有實現(xiàn)Cache時,preld的執(zhí)行應視同nop;即使實現(xiàn)Cache,將preld實現(xiàn)為nop也不會導致正常程序功能出錯。preld不應觸發(fā)任何與地址錯誤相關(guān)的異常。LAMIPSIRV32Ipreldhint,rj,si12N.A.N.A.柵障指令27dbar(databarrier) dbarhint

Setadatabarrierbetweenload/storeoperationsibar(instructionbarrier) ibarhint

Setamemorybarrierbetweenpreviousload/storeoperations andfollowinginstructionfetchingdbar的hint=0是必須實現(xiàn)的,其余hint可以按照hint=0實現(xiàn)。實現(xiàn)時,dbar前的load/store指令都徹底執(zhí)行完成(執(zhí)行效果全局可見)后,dbar后的load/store指令才能開始執(zhí)行。ibar指令主要應用在有自修改代碼的場景中。為降低硬件實現(xiàn)復雜度,LA32R相比于LA要求軟件負責自修改代碼場景中數(shù)據(jù)Cache和指令Cache間的一致性維護,這就意味著ibar的實現(xiàn)能簡化為:等到ibar前的訪存類指令(含cacop指令)都執(zhí)行完成退出流水線后,ibar后的指令才能開始取指。LAMIPS32RV32IdbarhintsyncfenceibarhintN.A.fence.i系統(tǒng)調(diào)用及陷入28syscall

syscallcode

CauseaSYSexceptionbreak breakcode

CauseaBRKexceptionLAMIPSIRV32Isyscallcodesyscallecallbreakcodebreakebreak時間讀取29rdcntvl.w rdcntvl.wrd

readthe64-bitstablecounter,wirtecnt[31:0]toGR[rd]rdcntvh.w rdcntvh.wrd

readthe64-bitstablecounter,wirtecnt[63:32]toGR[rd]rdcntid rdcntidrj

readidofthisstablecounter龍芯架構(gòu)32位精簡版定義了一個恒定頻率計時器,其主體是一個64位的計數(shù)器,稱為StableCounter。StableCounter在復位后置為0,隨后每個計數(shù)時鐘周期自增1,當計數(shù)至全1時自動繞回至0繼續(xù)自增。同時每個計時器都有一個軟件可配置的全局唯一編號,稱為CounterID。當處理器沒有時鐘變頻設(shè)計時,恒定頻率計時器可以直接使用處理器核的時鐘。LAMIPSIRV32Irdcntvl.wrdN.A.rdcylerdrdcntvh.wrdN.A.rdcylehrdrdcntidrjN.A.N.A.C語言的機器表示30C語言的控制流語句選擇語句:if~else,switch~case循環(huán)語句:for,while,do~while輔助控制語句:break,continue,goto,returnC語言的控制流語句在LoongArch匯編中映射為各種分支指令(B類)或其組合選擇語句和循環(huán)語句映射為條件分支輔助控制語句映射為無條件分支或跳轉(zhuǎn)(return語句)LoongArchABI31應用程序二進制接口(ApplicationBinaryInterface,簡稱ABI)數(shù)據(jù)表示和對齊寄存器使用函數(shù)調(diào)用棧布局目標文件和可執(zhí)行文件格式……LoongArchABI分為3種LP32:

32位處理器上執(zhí)行的32位程序LPX32: 64位處理器上執(zhí)行的64位程序,但指針和long整型的寬度為32位LP64: 在64位處理器上執(zhí)行的64位程序LoongArchABI寄存器使用約定32LoongArchABI有以下約定a0-a7:函數(shù)參數(shù)v0/v1:函數(shù)返回值,a0/a1別名t*:臨時變量,子函數(shù)可改s*:子函數(shù)不改的變量ra:返回地址tp:線程指針sp:棧頂指針fp:棧幀指針寄存器號助記符Saver0zero-1racaller2tp-3spcallee4-11a0-a7v0/v1=a0/a1caller12-20t0-t8caller21reserved-22fpcallee23-31s0-s8callee流程控制語句–示例133當條件表達式t0等于0(BEQZ)時,跳轉(zhuǎn)到標號.L1標號.L2為公用的程序出口//Cif~elseif(cond_exp)<then_statement>else<else_statement>#ASMif~elsemove $t0,cond_expbeqz $t0,.L1<then_statement>b .L2.L1:<else_statement>.L2:流程控制語句–示例234//Cforinttest_for(inta){intsum=0;inti=0;for(i=0;i<a;i++){sum+=i;}returnsum;}//Cwhileinttest_while(inta){intsum=0;inti=0;while(i<a){sum+=i;i++;}returnsum;}//Cdo-whileinttest_dowhile(inta){intsum=0;inti=0;do{sum+=i;i++;}while(i<a);returnsum;}test_for: or $t0,$r0,$r0 or $t1,$r0,$r0.L2: blt $t0,$a0,.L3 or $a0,$t1,$r0 jr $ra.L3: add.w $t1,$t1,$t0 addi.w $t0,$t0,1 b .L2test_while: or $t0,$r0,$r0 or $t1,$r0,$r0.L2: blt $t0,$a0,.L3 or $a0,$t1,$r0 jr $ra.L3: add.w $t1,$t1,$t0 addi.w $t0,$t0,1 b .L2test_dowhile: or $t0,$r0,$r0 or $t3,$r0,$r0.L2: add.w $t1,$t3,$t0 addi.w $t2,$t0,1 or $t3,$t1,$r0 or $t0,$t2,$r0 blt $t2,$a0,.L2

or $a0,$t1,$r0 jr $ra流程控制語句–示例335switch-case采用跳轉(zhuǎn)表實現(xiàn)intst(inta,intb,intc){switch(a){case15:c=b&0xf;case10:returnc+50;case12:case17:returnb+50;case14:returnb;default:returna;}} .textst: addi.w $t0,$a0,-10 //a-10 sltiu $t1,$t0,8 beqz $t1,default //(a-10)>=8 la $t2,jr_table slli.w $t1,$t1,2 //(a-10)*4 add.w $t1,$t1,$t2

//(a-10)*4+jr_table ld.w $t0,$t1,0 jr $t0default: or $a1,$a0,$r0case_14: or $a0,$a1,$r0 jr $ra //returnbforcase_14,

//returnafordefaultcase_15: andi $a2,$a1,0xf //b&0xfcase_10: addi.w $a1,$a2,50 //c+50 b case_14case_12_17: addi.w $a1,$a1,50 //b+50 b case_14#jumptable.section .rodata.align 3jr_table:.word case_10.word default.word case_12_17.word default.word case_14.word case_15.word default.word case_12_17流程控制語句–示例436switch-case采用一串比較實現(xiàn)intst(inta,intb,intc){switch(a){case15:c=b&0xf;case10:returnc+50;case12:case17:returnb+50;case14:returnb;default:returna;}}st:

addi.w $t0,$r0,14

beq $a0,$t0,.L7 //(a==14)?

blt $t0,$a0,.L3 //(a>14)?

addi.w $t0,$r0,10

beq $a0,$t0,.L4 //(a==10)?

addi.w $t0,$r0,12

beq $a0,$t0,.L5 //(a==12)?

jr $ra //returna.L3:

addi.w $t0,$r0,15

beq $a0,$t0,.L6 //(a==15)?

addi.w $t0,$r0,17

beq $a0,$t0,.L5 //(a==17)?

jr $ra //returna.L6:

andi $a2,$a1,0xf //b&0xf.L4:

addi.w $a0,$a2,50 //c+50

jr $ra.L5:

addi.w $a0,$a1,50 //b+50

jr $ra.L7:

or $a0,$a1,$r0 //returnb

jr $ra過程調(diào)用–示例37intadd(inta,intb){

returna+b;}intref(){

intt1=12;

intt2=34;

returnadd(t1,t2);}add:

add.w

$a0,$a0,$a1 //a+b

jr $ra

//returnref:

addi.w $sp,$sp,-16

//stackallocate addi.w $a1,$r0,34 //t2=34

addi.w $a0,$r0,12 //t1=12

st.w $ra,$sp,4 //save$ra

bl add

//calladd()

ld.w $ra,$sp,4 //restore$ra

addi.w $sp,$sp,16 //stackrelease

jr $ra //return過程調(diào)用流程調(diào)用者(Caller)將實參放入寄存器或棧中使用調(diào)用指令調(diào)用被調(diào)用者(Callee)Callee在棧中分配自己所需的局部變量空間執(zhí)行callee過程Callee釋放局部變量空間(將棧指針還原)Callee使用JR返回調(diào)用者數(shù)字電路與Verilog知識回顧390102實驗相關(guān)的Verilog知識常用電路及其Verilog實現(xiàn)示例400102實驗相關(guān)的Verilog知識常用電路及其Verilog實現(xiàn)示例CPU實驗中Verilog的使用41CPU實驗中有兩個地方用到Verilog語言:一個地方是要求用Verilog語言進行電路設(shè)計,另一個地方是用Verilog語言搭建功能驗證平臺(testbench)CPU的實現(xiàn)就屬于電路設(shè)計的范疇。為了驗證所實現(xiàn)的CPU是否正確,我們通常會搭建一個簡單的系統(tǒng),包括總線、內(nèi)存、串口,把測試CPU的程序裝載到內(nèi)存中,同時給系統(tǒng)以復位和時鐘。這些總線、內(nèi)存、串口、時鐘以及復位、程序的裝載等都屬于testbench的范疇。為了減少學生的學習負擔,我們也用Verilog語言進行testbench的開發(fā)用Verilog進行電路設(shè)計是重點,要求學生寫的Verilog代碼都屬于這一類。這其中的關(guān)鍵是要求學生掌握Verilog中的可綜合子集,并知曉常見電路的Verilog描述方法用Verilog寫的testbench在實驗環(huán)境中都已提供,因此不要求學生動手寫,能看得懂就可以。面向硬件電路的Verilog設(shè)計思路42CPU本質(zhì)上是一個數(shù)字邏輯電路,所以電路是設(shè)計的對象,Verilog只是描述電路的一個工具而已Verilog語言的很多語法要素與C語言很像,而且Verilog語言也支持行為級建模。這就使得很多同學習慣于用C程序開發(fā)的思路去使用Verilog語言,這種串行的過程化的思維對于Verilog語言設(shè)計來說是有很大弊端的。要求學生必須采用這樣的設(shè)計步驟:先進行電路結(jié)構(gòu)設(shè)計,再進行Verilog代碼編寫當電路設(shè)計已經(jīng)被清晰地分解為結(jié)構(gòu)圖中的各個模塊和模塊之間的連接、模塊內(nèi)部的數(shù)據(jù)通路和狀態(tài)機、數(shù)據(jù)通路中的電路邏輯以及狀態(tài)機中的狀態(tài)轉(zhuǎn)換圖,那么接下來的Verilog代碼設(shè)計就只是一個簡單的“翻譯”而已可綜合Verilog43Verilog和VHDL這類硬件描述語言設(shè)計最初是用于大型數(shù)字電路的建模、仿真,由基于HDL的設(shè)計轉(zhuǎn)換為邏輯門相互連接的電路圖的工作仍是由設(shè)計人員手工完成的,這個過程既費時費力又容易出錯。后來邏輯綜合工具的出現(xiàn)和發(fā)展改變了這一狀況。設(shè)計者可以使用HDL在RTL級對電路進行描述,然后選定標準單元庫并定義相關(guān)設(shè)計約束,那么邏輯綜合工具就會自動的將HDL語言轉(zhuǎn)換為門級網(wǎng)表,這個轉(zhuǎn)換的過程稱為邏輯綜合。在邏輯綜合過程中,工具能夠支持的語言要素是Verilog語言的一個子集,也就是說并不是所有的Verilog語言要素都可以進行邏輯綜合要求同學們采用RTL(RegisterTransferLevel,寄存器傳輸級)設(shè)計,且要求設(shè)計可以被EDA工具綜合成最終的電路,那么同學們在進行電路設(shè)計時只能用到Verilog語言的可綜合子集440102實驗相關(guān)的Verilog知識常用電路及其Verilog實現(xiàn)示例模塊聲明和實例化45modulebottom#(parameterA_WIDTH=8,parameterB_WIDTH=4,parameterY_WIDTH=2)(inputwire[A_WIDTH-1:0]a,inputwire[B_WIDTH-1:0]b,inputwire[3:0]c,outputwire[Y_WIDTH-1:0]y,outputregz);endmodulemoduletop;wire[15:0]btm_a;wire[7:0]btm_b;wire[3:0]btm_c;wire[3:0]btm_y;wirebtm_z;bottom#(.A_WIDTH(16),.B_WIDTH(8),.Y_WIDTH(4))inst_btm(.a(btm_a),//I.b(btm_b),//I.c(btm_c),//I.y(btm_y),//O.z(btm_z)//O);endmodule基礎(chǔ)邏輯門46wire[7:0]a;wire[7:0]b;assigny1=~a;//反相器assigny2=a&b;//與assigny3=a|b;//或assigny4=a?b;//異或assigny5=~(a&b);//與非assigny6=~(a|b);//或非譯碼器47moduledecoder_3_8(input[2:0]in,output[7:0]out);assignout[0]=(in==3'd0);assignout[1]=(in==3'd1);assignout[2]=(in==3'd2);assignout[3]=(in==3'd3);assignout[4]=(in==3'd4);assignout[5]=(in==3'd5);assignout[6]=(in==3'd6);assignout[7]=(in==3'd7);endmodule編碼器48moduleencoder_8_3(input[7:0]in,output[2:0]out);assignout=in[0]?3'd0:in[1]?3'd1:in[2]?3'd2:in[3]?3'd3:in[4]?3'd4:in[5]?3'd5:in[6]?3'd6:3'd7;endmodulemoduleencoder_8_3(input[7:0]in,output[2:0]out);assignout=({3{in[0]}}&3'd0)|({3{in[1]}}&3'd1)|({3{in[2]}}&3'd2)|({3{in[3]}}&3'd3)|({3{in[4]}}&3'd4)|({3{in[5]}}&3'd5)|({3{in[6]}}&3'd6)|({3{in[7]}}&3'd7);endmodule多路選擇器49modulemux5_8b(input[7:0]in0,in1,in2,in3,in4,input[2:0]sel,output[7:0]out);assignout=(sel==3'd0)?in0:(sel==3'd1)?in1:(sel==3'd2)?in2:(sel==3'd3)?in3:(sel==3'd4)?in4:8'b0;endmodulemodulemux5_8b(input[7:0]in0,in1,in2,in3,in4,input[2:0]sel,output[7:0]out);assignout=({8{sel==3'd0}}&in0)|({8{sel==3'd1}}&in1)|({8{sel==3'd2}}&in2)|({8{sel==3'd3}}&in3)|({8{sel==3'd4}}&in4);endmodulemodulemux5_8b_onehot(input[7:0]in0,in1,in2,in3,in4,input[4:0]sel,output[7:0]out);assignout=({8{sel[0]}}&in0)|({8{sel[1]}}&in1)|({8{sel[2]}}&in2)|({8{sel[3]}}&in3)|({8{sel[4]}}&in4);endmoduleALU模塊50modulesimple_alu(input[11:0]alu_op,input[31:0]alu_src1,input[31:0]alu_src2,output[31:0]alu_result);……assignop_add =alu_op[0];assignop_sub =alu_op[1];assignop_slt =alu_op[2];assignop_sltu=alu_op[3];assignop_and =alu_op[4];assignop_nor =alu_op[5];assignop_or =alu_op[6];assignop_xor =alu_op[7];assignop_sll =alu_op[8];assignop_srl =alu_op[9];assignop_sra =alu_op[10];assignop_lui =alu_op[11];ALU模塊51assignand_result=alu_src1&alu_src2;assignor_result=alu_src1|alu_src2;assignnor_result=~or_result;assignxor_result=alu_src1?alu_src2;assignlui_result={alu_src2[19:0],12’b0};assignadder_a=alu_src1;assignadder_b=(op_sub|op_slt|op_sltu)?~alu_src2:alu_src2;assignadder_cin=(op_sub|op_slt|op_sltu)?1'b1:1'b0;assign{adder_cout,adder_result}=adder_a+adder_b+adder_cin;assignadd_sub_result=adder_result;assignslt_result[31:1]=31’b0;assignslt_result[0]=(alu_src1[31]&~alu_src2[31])|(~(alu_src1[31]?alu_src2[31])&adder_result[31]);assignsltu_result[31:1]=31’b0;assignsltu_result[0]=~adder_cout;assignsll_result=alu_src2<<alu_src1[4:0];assignsrl_result=alu_src2>>alu_src1[4:0];assignsra_result=($signed(alu_src2))>>>alu_src1[4:0];ALU模塊52assignalu_result=({32{op_add|op_sub }}&add_sub_result)|({32{op_slt }}&slt_result)|({32{op_sltu }}&sltu_result)|({32{op_and }}&and_result)|({32{op_nor }}&nor_result)|({32{op_or }}&or_result)|({32{op_xor }}&xor_result)|({32{op_sll }}&sll_result)|({32{op_srl }}&srl_result)|({32{op_sra }}&sra_result)|({32{op_lui }}&lui_result);endmoduleD觸發(fā)器53moduledff(inputclk,inputdin,outputregq);always@(posedgeclk)beginq<=din;endendmodule帶使能端的D觸發(fā)器54moduledff_en(inputclk,inputen,inputdin,outputregq);always@(posedgeclk)beginif(en)q<=din;endendmodule實驗中CPU所用的寄存器堆55moduleregfile(inputclk,input[4:0]raddr1,output[31:0]rdata1,input[4:0]raddr2,output[31:0]rdata2,inputwe,input[4:0]waddr,input[31:0]wdata);reg[31:0]reg_array[31:0];//WRITEalways@(posedgeclk)beginif(we)reg_array[waddr]<=wdata;end//READOUT1assignrdata1=(raddr1==5’b0)?32’b0:reg_array[raddr1];//READOUT2assignrdata2=(raddr2==5’b0)?32’b0:reg_array[raddr2];endmodule單周期CPU設(shè)計實驗58010203實驗內(nèi)容階段一CPU設(shè)計與代碼解讀階段一實驗開發(fā)環(huán)境介紹04階段二CPU設(shè)計方案05階段二實驗開發(fā)環(huán)境介紹59010203實驗內(nèi)容階段一CPU設(shè)計與代碼解讀階段一實驗開發(fā)環(huán)境介紹04階段二CPU設(shè)計方案05階段二實驗開發(fā)環(huán)境介紹實驗內(nèi)容60階段一實驗任務:完善一個單周期LA32CPU設(shè)計,支持add.w、addi.w、ld.w、st.w和bne指令功能,最終上板測試通過。補充缺失代碼的實現(xiàn)方式。階段二實驗任務:向階段一的CPU中添加指令,支持20條指令(add.w、addi.w、sub.w、ld.w、st.w、bne、beq、b、bl、jirl、slt、sltu、slli.w、srli.w、srai.w、lu12i.w、and、or、nor、xor),最終上板測試通過。調(diào)試并修正已有實現(xiàn)中的錯誤的實現(xiàn)方式。61010203實驗內(nèi)容階段一CPU設(shè)計與代碼解讀階段一實驗開發(fā)環(huán)境介紹04階段二CPU設(shè)計方案05階段二實驗開發(fā)環(huán)境介紹CPU本質(zhì)上是一個數(shù)字邏輯電路,它的設(shè)計遵循數(shù)字邏輯電路設(shè)計的一般性方法首先設(shè)計出數(shù)據(jù)通路,再確定控制邏輯數(shù)據(jù)在電路中流轉(zhuǎn)的路徑稱為數(shù)據(jù)通路,如CPU中的運算邏輯、存儲單元、輸入輸出及模塊間的連接總線。數(shù)據(jù)通路中的多路選擇器、時序邏輯器件等包含控制信號,產(chǎn)生這些控制信號的邏輯稱為控制邏輯CPU設(shè)計的特點:根據(jù)指令系統(tǒng)規(guī)范中的定義設(shè)計出“數(shù)據(jù)通路+控制邏輯”對指令系統(tǒng)中定義的指令逐條進行功能分解,得到一系列操作和操作的對象,這些操作和操作的對象必然對應其各自的數(shù)據(jù)通路因為指令間存在一些相同或相近的操作和操作對象,所以我們可以只設(shè)計一套數(shù)據(jù)通路供多個指令公用對于確實存在差異無法共享數(shù)據(jù)通路的情況,只能各自設(shè)計一套,再用多路選擇器從中選擇出所需的結(jié)果CPU的一般性設(shè)計方法62務必先明確設(shè)計方案,再進行代碼實現(xiàn)待實現(xiàn)指令定義63add.w(add

word)

add.wrd,rj,rk GR[rd]=GR[rj]

+

GR[rk]addi.w(add

immediateword)

addi.wrd,rj,si12 GR[rd]=GR[rj]+sext32(si12)ld.w(loadwordsigned) ld.wrd,rj,si12 GR[rd]=MEM[GR[rj]+sext32(si12)][31:0]st.w(storeword) st.wrd,rj,si12 MEM[GR[rj]+sext32(si12)][31:0]=GR[rd][31:0]bne(branchonnotequal) bnerj,rd,offs16 if(GR[rj]!=GR[rd])PC=PC+sext32({off16,2’b0})所有指令存放在存儲器(指令存儲器)中指令在指令存儲器中的地址是PC每執(zhí)行完一條指令,繼續(xù)執(zhí)行其后面的指令(PC+4)支持add.w指令64add.w指令從寄存器堆中讀取兩個源操作數(shù)將兩個源操作數(shù)相加加法結(jié)果寫回寄存器堆支持add.w指令65支持add.w指令66addi.w指令與add.w指令的差異僅在于相加所用的第2個源操作數(shù)不是來自于寄存器堆而是指令中立即數(shù)符號擴展至32位支持addi.w指令67ld.w指令的地址計算功能可以復用addi.w指令的數(shù)據(jù)通路ld.w指令從數(shù)據(jù)存儲器中讀取數(shù)據(jù)取回的數(shù)據(jù)與加法器結(jié)果二選一,寫回寄存器堆支持ld.w指令68st.w指令的地址計算可以復用ld.w指令的st.w指令寫數(shù)據(jù)存儲器st.w指令寫入數(shù)據(jù)存儲器的值來自于寄存器堆,不過這個源操作數(shù)的寄存器號在rd域st.w指令不寫寄存器堆支持st.w指令69bne指令對來自寄存器堆的兩個源操作數(shù)比較決定是否跳轉(zhuǎn)(br_taken)bne指令跳轉(zhuǎn)的目標是PC加上指令碼中的offsetbne指令不跳轉(zhuǎn)時,仍是順序取指支持bne指令70單周期CPU控制信號生成71add.waddi.wld.wst.wbnesel_rf_ra200011sel_alu_src201110data_ram_ce00110data_ram_we00010sel_rf_res00100rf_we11100代碼與設(shè)計72modulemycpu_top( inputclk,inputresetn, outputinst_sram_wen, output[31:0]inst_sram_addr, output[31:0]inst_sram_wdata, input[31:0]inst_sram_rdata, outputdata_sram_wen, output[31:0]data_sram_addr, output[31:0]data_sram_wdata, input[31:0]data_sram_rdata);assigninst_sram_wen=1'b0;assigninst_sram_addr=pc;assigninst_sram_wdata=32'b0;assigninst=inst_sram_rdata;assigndata_sram_wen=mem_we;assigndata_sram_addr=alu_result;assigndata_sram_wdata=rkd_value;代碼與設(shè)計73……always@(posedgeclk)beginif(!resetn)beginpc<=32’h1c000000;endelsebeginpc<=nextpc;endend……代碼與設(shè)計74assignop_31_26=inst[31:26];assignop_25_22=inst[25:22];assignop_21_20=inst[21:20];assignop_19_15=inst[19:15];……decoder_6_64u_dec0(.in(op_31_26),.co(op_31_26_d));decoder_4_16u_dec1(.in(op_25_22),.co(op_25_22_d));decoder_2_4u_dec2(.in(op_21_20),.co(op_21_20_d));decoder_5_32u_dec3(.in(op_19_15),.co(op_19_15_d));……assigninst_add_w=op_31_26_d[6'h00]&op_25_22_d[4'h0]&op_21_20_d[2'h1]&op_19_15_d[5'h00];assigninst_addi_w=op_31_26_d[6'h00]&op_25_22_d[4'ha];assigninst_ld_w=op_31_26_d[6'h0a]&op_25_22_d[4'h2];assigninst_st_w=//在這里實現(xiàn)inst_st_w指令的譯碼assigninst_bne=op_31_26_d[6'h17];assignsrc2_is_imm=//在這里實現(xiàn)立即數(shù)選擇信號assignres_from_mem=inst_ld_w;assigngr_we=inst_add_w|inst_ld_w|inst_addi_w;assignmem_we=inst_st_w;assig

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論