版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LoongArch32精简版指令集介绍20102指令集概述指令集用户态部分介绍30102指令集概述指令集用户态部分介绍龙芯自主指令系统架构LoongArch4“充分考虑兼容需求的自主指令系统”遵循RISC指令设计风格32位定长指令编码风格load/store架构32个通用寄存器32个浮点/向量寄存器分为32位和64位两个版本,简称LA32和LA64架构采用基础部分加扩展部分的整体架构基础指令集(~340条)二进制翻译扩展、向量扩展、虚拟化扩展面向高校教学科研的LoongArch精简版5基于LoongArch32位版本的精简子集——LoongArch32
Reduced用户态:保留典型应用中最常用的指令整数指令~50条,访存指令仅“基址+偏移”寻址方式且要求地址对齐浮点数指令可以不实现,也可以只实现单精度部分原子同步指令仅LL/SC,软件维护指令与数据Cache的数据一致性核心态:支持主流类Unix操作系统仅包含PLV0和PLV3两个特权等级支持例外与中断,但入口为同一个支持TLBMMU,软件负责TLB重填软件生态:维护一个独立的小系统QEMU、GCC、……PMON、Linuxkernel、busybox、buildroot60102指令集概述指令集用户态部分介绍指令集用户态部分介绍提纲7数据类型寄存器指令编码格式用户态指令功能速览C语言的机器表示数据类型8比特(bit,简记b)字节(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程序计数器(PC)32位宽独立于通用寄存器,仅被转移指令修改浮点指令操作浮点寄存器,其独立于通用寄存器LAMIPSIRV32I通用寄存器32个32位(0号恒为0)32个32位(0号恒为0)32个32位(0号恒为0)程序计数器独立于通用寄存器,仅被转移指令修改独立于通用寄存器,仅被转移指令修改独立于通用寄存器,仅被转移指令修改浮点寄存器独立于通用寄存器独立于通用寄存器独立于通用寄存器LA精简版指令格式10指令都是32位长指令均需4字节边界对齐8种指令格式单一操作码域(opcode)寄存器操作数域(rd,rj,rk,ra)rd—通常作为目的寄存器rj—通常作为源寄存器1rk—通常作为源寄存器2ra—通常作为源寄存器3立即数域(imm)(1+)5种不同的长度访存与整型计算:12位CSR寻址:14位转移指令:16位、21位、26位所有指令至多一个目的寄存器“两源一目的”的3R-type是最常见的指令格式;4R-type仅出现在浮点运算中。LA精简版指令格式举例11三种RISC指令格式比较12三种RISC指令格式具有共性:定长1、对齐、指令格式种类少操作码域、寄存器域和立即数域“两源一目的”三寄存器操作数格式最常用要读写的寄存器号出现的位置(基本)固定不变RV最彻底,MIPS和LA有少量例外注:1.严格来说,RISC-V的指令长度是16位的倍数,是一种具有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整数加减运算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)表示将数值A符号扩展到32位宽。例如sext32(0x01)=0x00000001,sext32(0x80)=0xffffff80。整数比较运算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
将两个操作数视作有符号数进行小于比较;<unsigned
将两个操作数视作无符号数进行小于比较。逻辑位运算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)将数值A零扩展到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
表示算术右移。立即数装载18lu12i(loadupperfrombit12
immediate)
lu12ird,si20 GR[rd]={si20,12’b0}与ori指令配合装载一个值落在[-211,212-1]之外的32位立即数IMMlu12i$t0,IMM[31:12]ori$t0,$t0,IMM[11:0]MIPS采用高、低两个16位的拆分风格,因其普通立即数运算指令的立即数是16位宽RV32I采用高20位、低12位的拆分风格,因其普通立即数运算指令的立即数是12位宽RV32I不能只用“lui+ori”的指令对,因其ori指令的立即数采用的是符号扩展LAMIPSIRV32Ilu12ird,si20luird,si16luird,si20PC相对计算19pcaddu12i(pc
add
upperfrombit12
immediate)
pcaddu12ird,si20 GR[rd]=PC+{si20,12’b0}与jirl、load/store指令配合完成PC相对32位偏移地址的跳转、访存pcaddu12i$t0,IMMH#假设期望的PC相对32位偏移值为OFFSET,且为4的倍数jirl$zero,$t0,IMML#OFFSET={IMMH[19:0],12’b0}+sext32({IMML,2’b0},32}pcaddu12i$t0,IMMH#假设期望的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
将两个操作数视作有符号数进行乘法;*unsigned
将两个操作数视作无符号数进行乘法。/signed
将两个操作数视作有符号数进行除法取商,%signed
将两个操作数视作有符号数进行除法取余;/unsigned
将两个操作数视作无符号数进行除法取商,%unsigned
将两个操作数视作无符号数进行除法取余。注:取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跳转22b(branch)
boffs26
PC=BrTargetbl(branchandlink) bloffs26 GR[1]=PC+4;PC=BrTargetLAMIPSIRV32Iboffs26jtargetjalzero,offs20bloffs26jaltargetjalrd,offs20BrTarget=PC+sext32({off26,2’b0})有延迟槽没有延迟槽没有延迟槽无条件间接跳转23jirl(jumpindirectregisterlink)
jirlrd,rj,offs16
GR[rd]=PC+4; PC=GR[rj]+sext32({offs16,2’b0})几种常用的间接跳转指令是jirl指令的特殊形式1)非link的间接跳转:jrrj,其实是jirlr0,rj,0;其中最常见的函数返回jrra,是jirlr0,r1,02)常用间接函数调用(用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)])没有实现Cache时,preld的执行应视同nop;即使实现Cache,将preld实现为nop也不会导致正常程序功能出错。preld不应触发任何与地址错误相关的异常。LAMIPSIRV32Ipreldhint,rj,si12N.A.N.A.栅障指令27dbar(databarrier) dbarhint
Setadatabarrierbetweenload/storeoperationsibar(instructionbarrier) ibarhint
Setamemorybarrierbetweenpreviousload/storeoperations andfollowinginstructionfetchingdbar的hint=0是必须实现的,其余hint可以按照hint=0实现。实现时,dbar前的load/store指令都彻底执行完成(执行效果全局可见)后,dbar后的load/store指令才能开始执行。ibar指令主要应用在有自修改代码的场景中。为降低硬件实现复杂度,LA32R相比于LA要求软件负责自修改代码场景中数据Cache和指令Cache间的一致性维护,这就意味着ibar的实现能简化为:等到ibar前的访存类指令(含cacop指令)都执行完成退出流水线后,ibar后的指令才能开始取指。LAMIPS32RV32IdbarhintsyncfenceibarhintN.A.fence.i系统调用及陷入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龙芯架构32位精简版定义了一个恒定频率计时器,其主体是一个64位的计数器,称为StableCounter。StableCounter在复位后置为0,随后每个计数时钟周期自增1,当计数至全1时自动绕回至0继续自增。同时每个计时器都有一个软件可配置的全局唯一编号,称为CounterID。当处理器没有时钟变频设计时,恒定频率计时器可以直接使用处理器核的时钟。LAMIPSIRV32Irdcntvl.wrdN.A.rdcylerdrdcntvh.wrdN.A.rdcylehrdrdcntidrjN.A.N.A.C语言的机器表示30C语言的控制流语句选择语句:if~else,switch~case循环语句:for,while,do~while辅助控制语句:break,continue,goto,returnC语言的控制流语句在LoongArch汇编中映射为各种分支指令(B类)或其组合选择语句和循环语句映射为条件分支辅助控制语句映射为无条件分支或跳转(return语句)LoongArchABI31应用程序二进制接口(ApplicationBinaryInterface,简称ABI)数据表示和对齐寄存器使用函数调用栈布局目标文件和可执行文件格式……LoongArchABI分为3种LP32:
32位处理器上执行的32位程序LPX32: 64位处理器上执行的64位程序,但指针和long整型的宽度为32位LP64: 在64位处理器上执行的64位程序LoongArchABI寄存器使用约定32LoongArchABI有以下约定a0-a7:函数参数v0/v1:函数返回值,a0/a1别名t*:临时变量,子函数可改s*:子函数不改的变量ra:返回地址tp:线程指针sp:栈顶指针fp:栈帧指针寄存器号助记符Saver0zero-1racaller2tp-3spcallee4-11a0-a7v0/v1=a0/a1caller12-20t0-t8caller21reserved-22fpcallee23-31s0-s8callee流程控制语句–示例133当条件表达式t0等于0(BEQZ)时,跳转到标号.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采用跳转表实现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采用一串比较实现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过程调用–示例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过程调用流程调用者(Caller)将实参放入寄存器或栈中使用调用指令调用被调用者(Callee)Callee在栈中分配自己所需的局部变量空间执行callee过程Callee释放局部变量空间(将栈指针还原)Callee使用JR返回调用者数字电路与Verilog知识回顾390102实验相关的Verilog知识常用电路及其Verilog实现示例400102实验相关的Verilog知识常用电路及其Verilog实现示例CPU实验中Verilog的使用41CPU实验中有两个地方用到Verilog语言:一个地方是要求用Verilog语言进行电路设计,另一个地方是用Verilog语言搭建功能验证平台(testbench)CPU的实现就属于电路设计的范畴。为了验证所实现的CPU是否正确,我们通常会搭建一个简单的系统,包括总线、内存、串口,把测试CPU的程序装载到内存中,同时给系统以复位和时钟。这些总线、内存、串口、时钟以及复位、程序的装载等都属于testbench的范畴。为了减少学生的学习负担,我们也用Verilog语言进行testbench的开发用Verilog进行电路设计是重点,要求学生写的Verilog代码都属于这一类。这其中的关键是要求学生掌握Verilog中的可综合子集,并知晓常见电路的Verilog描述方法用Verilog写的testbench在实验环境中都已提供,因此不要求学生动手写,能看得懂就可以。面向硬件电路的Verilog设计思路42CPU本质上是一个数字逻辑电路,所以电路是设计的对象,Verilog只是描述电路的一个工具而已Verilog语言的很多语法要素与C语言很像,而且Verilog语言也支持行为级建模。这就使得很多同学习惯于用C程序开发的思路去使用Verilog语言,这种串行的过程化的思维对于Verilog语言设计来说是有很大弊端的。要求学生必须采用这样的设计步骤:先进行电路结构设计,再进行Verilog代码编写当电路设计已经被清晰地分解为结构图中的各个模块和模块之间的连接、模块内部的数据通路和状态机、数据通路中的电路逻辑以及状态机中的状态转换图,那么接下来的Verilog代码设计就只是一个简单的“翻译”而已可综合Verilog43Verilog和VHDL这类硬件描述语言设计最初是用于大型数字电路的建模、仿真,由基于HDL的设计转换为逻辑门相互连接的电路图的工作仍是由设计人员手工完成的,这个过程既费时费力又容易出错。后来逻辑综合工具的出现和发展改变了这一状况。设计者可以使用HDL在RTL级对电路进行描述,然后选定标准单元库并定义相关设计约束,那么逻辑综合工具就会自动的将HDL语言转换为门级网表,这个转换的过程称为逻辑综合。在逻辑综合过程中,工具能够支持的语言要素是Verilog语言的一个子集,也就是说并不是所有的Verilog语言要素都可以进行逻辑综合要求同学们采用RTL(RegisterTransferLevel,寄存器传输级)设计,且要求设计可以被EDA工具综合成最终的电路,那么同学们在进行电路设计时只能用到Verilog语言的可综合子集440102实验相关的Verilog知识常用电路及其Verilog实现示例模块声明和实例化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基础逻辑门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触发器53moduledff(inputclk,inputdin,outputregq);always@(posedgeclk)beginq<=din;endendmodule带使能端的D触发器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设计实验58010203实验内容阶段一CPU设计与代码解读阶段一实验开发环境介绍04阶段二CPU设计方案05阶段二实验开发环境介绍59010203实验内容阶段一CPU设计与代码解读阶段一实验开发环境介绍04阶段二CPU设计方案05阶段二实验开发环境介绍实验内容60阶段一实验任务:完善一个单周期LA32CPU设计,支持add.w、addi.w、ld.w、st.w和bne指令功能,最终上板测试通过。补充缺失代码的实现方式。阶段二实验任务:向阶段一的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),最终上板测试通过。调试并修正已有实现中的错误的实现方式。61010203实验内容阶段一CPU设计与代码解读阶段一实验开发环境介绍04阶段二CPU设计方案05阶段二实验开发环境介绍CPU本质上是一个数字逻辑电路,它的设计遵循数字逻辑电路设计的一般性方法首先设计出数据通路,再确定控制逻辑数据在电路中流转的路径称为数据通路,如CPU中的运算逻辑、存储单元、输入输出及模块间的连接总线。数据通路中的多路选择器、时序逻辑器件等包含控制信号,产生这些控制信号的逻辑称为控制逻辑CPU设计的特点:根据指令系统规范中的定义设计出“数据通路+控制逻辑”对指令系统中定义的指令逐条进行功能分解,得到一系列操作和操作的对象,这些操作和操作的对象必然对应其各自的数据通路因为指令间存在一些相同或相近的操作和操作对象,所以我们可以只设计一套数据通路供多个指令公用对于确实存在差异无法共享数据通路的情况,只能各自设计一套,再用多路选择器从中选择出所需的结果CPU的一般性设计方法62务必先明确设计方案,再进行代码实现待实现指令定义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每执行完一条指令,继续执行其后面的指令(PC+4)支持add.w指令64add.w指令从寄存器堆中读取两个源操作数将两个源操作数相加加法结果写回寄存器堆支持add.w指令65支持add.w指令66addi.w指令与add.w指令的差异仅在于相加所用的第2个源操作数不是来自于寄存器堆而是指令中立即数符号扩展至32位支持addi.w指令67ld.w指令的地址计算功能可以复用addi.w指令的数据通路ld.w指令从数据存储器中读取数据取回的数据与加法器结果二选一,写回寄存器堆支持ld.w指令68st.w指令的地址计算可以复用ld.w指令的st.w指令写数据存储器st.w指令写入数据存储器的值来自于寄存器堆,不过这个源操作数的寄存器号在rd域st.w指令不写寄存器堆支持st.w指令69bne指令对来自寄存器堆的两个源操作数比较决定是否跳转(br_taken)bne指令跳转的目标是PC加上指令码中的offsetbne指令不跳转时,仍是顺序取指支持bne指令70单周期CPU控制信号生成71add.waddi.wld.wst.wbnesel_rf_ra200011sel_alu_src201110data_ram_ce00110data_ram_we00010sel_rf_res00100rf_we11100代码与设计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;代码与设计73……always@(posedgeclk)beginif(!resetn)beginpc<=32’h1c000000;endelsebeginpc<=nextpc;endend……代码与设计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=//在这里实现inst_st_w指令的译码assigninst_bne=op_31_26_d[6'h17];assignsrc2_is_imm=//在这里实现立即数选择信号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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高职安全工程技术(风险评估)模拟试题
- 2025年大学园艺产品贮藏与加工(贮藏技术应用)试题及答案
- 大学(采购管理)采购计划制定2026年综合测试题及答案
- 2026年临床医学(临床医学)综合测试题及答案
- 2025年高职(分析检验技术)仪器分析试题及答案
- 2025年中职城市燃气智能输配与应用(燃气输配技术)试题及答案
- 2025年大学食品质量与安全(质量控制体系)试题及答案
- 2026年平面设计(LOGO设计)综合测试题及答案
- 2025年大学微生物学与免疫学基础(微生物检测)试题及答案
- 2025年中职美容化妆技术(化妆实操训练)试题及答案
- 2025品牌年度规划方案框架模板
- 龙华区锂电池安全培训课件
- 教练挂靠与驾校合同范本
- 维修工具基础知识培训课件
- 义务教育质量监测学校成绩分析报告
- 民兵教练面试题目及答案
- 尿红细胞位相检测临床应用
- 消防设施故障应急预案
- 2025年社会人文社会文化知识竞赛-全运会知识竞赛历年参考题库含答案解析(5套典型考题)
- 2022建设工程文件归档与档案验收移交指南
- 2025商品专卖店劳动合同书
评论
0/150
提交评论