RISC-V

Allikas: Vikipeedia
Mine navigeerimisribale Mine otsikasti
RISC-V logo

RISC-V on kärbitud käsustik (RISC), mille arendusega alustati 2010. aastal. [1] RISC-V on avatud standard ning selle spetsifikatsioon on avalikult saadaval vastavalt Creative Commons litsentsile.[2] Käsustiku litsents lubab igaühele luua implementatsiooni ilma litsentsitasu maksmata, ka ärieesmärgil.[3] Käsustikku arendab RISC-V Foundation.[1]

2020. aasta seisuga on olemas mõned RISC-V protsessori tuumad ja süsteemikiibid.[4]

Ajalugu[muuda | muuda lähteteksti]

RISC-V sai algust California Ülikooli Berkeleys paralleelsete arvutuste laboris, kus Krste Asanović, Yunsup Lee ja Andrew Waterman alustasid 2010. aastal vaba käsustiku arendamise projekti. 13. mail 2011. aastal avaldati esimene RISC-V'd käsitlev publikatsioon. Samal aastal tehti esimene RISC-V kiibi disain.

2015. aastal loodi sihtasutus RISC-V Foundation käsustiku edasiseks arendamiseks. Alates 2018. aastast teeb RISC-V Foundation koostööd Linux Foundationiga.[1]

Disain[muuda | muuda lähteteksti]

RISC-V käsustiku disain on modulaarne, st implementatsiooni loojad saavad valida millised käskuhulgad on tarvis realiseerida: kas ainult baaskäskude hulk või lisada ka lisakäsud. See potentsiaalselt võimaldab RISC-V kasutada erinevate seadete loomiseks alates mikrokontrolleritest kuni superarvutiteni.

Mäluaadresseerimine[muuda | muuda lähteteksti]

Sõna pikkus on 32 baiti.[2]

RISC-V võimaldab kuni 128-biti mäluadresseerimist.[5] Üks RISC-V riistvaraline lõim omab mäluaadressiruumi suurusega 2n baiti, kus n on täisarvu registri suurus bittides (nt 32-bitises mäluaadressiruumis on registri suurus 32 bitti). Mäluaadressiruum on nö ringkujuline ehk aadressis 2n-1 asuv bait külgneb aadressil 0 asuva baitiga.

Iga käsu täitmine toob kaasa ühe või rohkem mällupöördumist. Mällupöördumine võib olla kas kaudne (implicit) või ilmne (explicit). Kaudse mällupöördumise puhul sooritatakse mälust lugemise operatsiooni käsu aadressi äratoomiseks (instuction fetch). Ilmse mällupöördumise puhul sooritatakse kas lugemise või kirjutamise operatsiooni käsus määratud mäluaadressil.

Käskude hulgad[muuda | muuda lähteteksti]

RISC-V saab käsitleda mitte ühte käsustikuna, vaid nelja baaskäsustikkude perekonnana:[2]

  • RV32I (32-bitine mäluaadressiruum)
  • RV64I (64-bitine mäluaadressiruum)
  • RV32E (RV32I lihtsustatud variant mikrokontrollerite jaoks, registrite arv on kaks korda väiksem RV32I-ga võrreldes)
  • RV128I (128-bitine mäluaadressiruum)

Iga RISC-V implementatsioon peab realiseerima mingit baaskäsustikku. Peale baaskäske on olemas ka teised käskude hulgad, milled nimetatakse laiendusteks. Sellised laiendused sisaldavad käske lisafunktsionaalsuse realiseerimiseks. Näiteks kui implementatsioon kasutab RV32I käsustikku, siis sellele implementatsioonile saab lisada järgnevaid laiendusi:

  • RV32M (korrutamise ja jagamise käskude jaoks)
  • RV32A (aatomioperatsioonide jaoks)
  • RV32F (lihttäpsusega ujukomaarvude käskude jaoks)
  • RV32D (topelttäpsusega ujukomaarvude käskude jaoks)
  • RV32C (sisaldab käskude 16-bitised variandid)

Nende laienduste kogumi koos baaskäsustikuga nimetatakse RV32G. Laiendused teiste baaskäsustikkude jaoks on nimetatud samal moel nagu eeltoodud näites: viimane täht tähendab millise funktsionaalsuse realiseerimiseks seda käsustikku kasutatakse (nt 64-bitise mäluaadressiruumiga käsustik korrutamise ja jagamise käskude jaoks on nimetatud RV64M jne).[2][6]

Käskude pikkuse määramine[muuda | muuda lähteteksti]

RISC-V käsud on väga lühikesed.[5] Baaskäsud on 32-bitised ning peavad olema joondutud 32-biti piiris. RISC-V toetab ka käske, milliste pikkus on 16*n biti (n on positiivne täisarv). Kui tegemist on 16-bitiste käskudega siis joondus on 16 biti, vastasel juhul on see tavaliselt 32 biti. RISC-V implementatsiooni maksimaalne käsu pikkus on võrdne positiivse täisarvuga korrutatud joondusega ning sõltub sellest milliseid käskude hulki (baaskäsud koos laiendustega) implementatsioon realiseerib. Sõltuvalt käsu pikkusest omavad käsu vähima kaaludega bitid erinevaid kindlaid väärtusi:

  • 16-bitiste käskude puhul 2 vähima kaaludega bitide väärtused saavad olla kas 00, 01, 10, kuid mitte 11
  • 32-bitiste käskude puhul 2 vähima kaaludega bitide väärtused on alati 11; järgmiste suurema kaaludega bitide väärtused ei saa olla 111
  • 48-bitiste käskude puhul 6 vähima kaaludega bitide väärtused on alati 011111
  • 64-bitiste käskude puhul 7 vähima kaaludega bitide väärtused on alati 0111111
  • kui käskude pikkus on 80-biti või rohkem kuid vähem kui 192-biti, siis 16 vähima kaaludega bitide väärtused on xnnnxxxxx1111111, kus nnn = (käskude pikkus - 80)/16 binaarkujul
  • kui käskude pikkus on 192 biti, siis 16 vähima kaaludega bitide väärtused on x111xxxxx1111111

Baaskäsustikud[muuda | muuda lähteteksti]

Basskäsustikud sisaldavad 6 käsuformaati:

  • R (Register)
  • I (Immediate)
  • S (Store)
  • U (Upper immediate)
  • B (Branch)
  • J (Jump)

Allpool on toodud käsuformaatide tabel RV32I näitel:

Formaat Bit
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
R (Register) funct7 rs2 rs1 funct3 rd opcode
I (Immediate) imm[11:0] rs1 funct3 rd opcode
U (Upper immediate) imm[31:12] rd opcode
S (Store) imm[11:5] rs2 rs1 funct3 imm[4:0] opcode
B (Branch) [12] imm[10:5] rs2 rs1 funct3 imm[4:1] [11] opcode
J (Jump) [20] imm[10:1] [11] imm[19:12] rd opcode

  • opcode: määrab käsuformaadi
  • funct7 ja funct3: määravad operatsiooni (käsku), mida sooritatakse
  • rs1: viitab lähteregistrile, mis sisaldab esimest operandi (e lähteandmeid, mille peale sooritatakse operatsiooni)
  • rs2: viitab lähteregistrile, mis sisaldab teist operandi
  • rd: viitab sihiregistrile, kuhu suunatakse operatsiooni tulemust
  • imm: sisaldab otsest väärtust (immediate value), mida kasutatakse operatsiooni sooritades

Arvutuskäsud[muuda | muuda lähteteksti]

Käskude üldkuju on KÄSK rd[a], operand1, operand2. Näiteks kui sooritatakse operatsiooni registri väärtuse ja otsese väärtuse peale, siis käsu kuju on KÄSK rd, rs1[b], imm.

I[c]-tüüpi formaadi käsud:

  • ADDI: liidab otsest väärtust ja rs1 registri väärtust
  • SLTI/SLTIU: võrdleb rs1 registri väärtus ja otsest väärtust; kui rs1 väärtus on vähem kui otsene väärtus sihiregistrile pannakse 1, vastasel juhul sihiregistrile pannakse 0
  • ANDI: sooritab AND loogilist operatsiooni; tulemust pannakse sihiregistrile
  • ORI: sooritab OR loogilist operatsiooni
  • XORI: sooritab XOR loogilist operatsiooni
  • SLLI: sooritab loogilist nihet vasakule
  • SRLI: sooritab loogilist nihet paremale
  • SRAI: sooritab artimeetilist nihet paremale

R[d]-tüüpi formaadi käsud:

  • ADD: liidab rs1 ja rs2 registrite väärtusi
  • SUB: lahutab rs2 registri väärtusest rs1 registri väärtust
  • SLT/SLTU: võrdleb rs1 registri ja rs2 registri väärtusi; kui rs1 väärtus on vähem kui rs2 väärtus sihiregistrile pannakse 1, vastasel juhul sihiregistrile pannakse 0
  • AND: sooritab AND loogilist operatsiooni; tulemust pannakse sihiregistrile
  • OR: sooritab OR loogilist operatsiooni
  • XOR: sooritab XOR loogilist operatsiooni
  • SLL: sooritab loogilist nihet vasakule
  • SRL: sooritab loogilist nihet paremale
  • SRA: sooritab artimeetilist nihet paremale

Load-Store käsud[muuda | muuda lähteteksti]

Load käsk sooritab andmete ülekannet mälust registrisse. Store käsk sooritab andmete ülekannet registrist mällu. Load on I-tüüpi formaadi käsk; Store on S[e]-tüüpi formaadi käsk.

Teised käsud[muuda | muuda lähteteksti]

Baaskäsustikus on olemas ka teised käsud:

  • JAL ja JALR: tingimata hargnemiskäsud
  • BEQ, BNE, BLT, BLTU, BGE ja BGEU: tingitud hargnemiskäsud
  • FENCE: käsk mälu järjestamiseks sisend/väljund seadmetega töötamisel
  • ECALL käsu abil programm saab sooritada süsteemikutset täitmiskeskkonnale
  • EBREAK käsu abil saadakse programmi sooritamise juhtimist silumise keskkonnale
  • Kõik baaskäsustikud sisaldavad kõik ülaltoodud käske. Peale neid sisaldavad RV64I ja RV128I käsustikud ka teisi lisakäske.

Käsud korrutamise ja jagamise jaoks[muuda | muuda lähteteksti]

RISC-V sisaldab laiendused korrutamise ja jagamise jaoks. Kõikide laienduste ühised käsud on sellised:

  • MUL: rs1 ja rs2 registrite sisu korrutamine ja tulemuse panemine rd registrile
  • DIV: rs1 registri sisu jagamine rs2 registri sisuga, ümardades nulli poole; tulemust pannakse rd registrile
  • REM: rs1 registri sisu jagamine rs2 registri sisuga, ümardades nulli poole; tulemusena pannakse jagamise jääki rd registrile[2]

Privilegeeritud täitmine[muuda | muuda lähteteksti]

RISC-V saab toetada erinevaid tarkvaravirnu, mis võimaldavad implementeerida privilegeeritud täitmist. On olemas 3 täitmise keskkonna (execution environment) tüüpi:

  • AEE[f] (rakenduse täitmise keskkond): käivitab ainult ühte rakendust, mis on kodeeritud kindla binaarse rakendusliidesega täitmiseks. Binaarne rakendusliides on siin täitmise keskkonna ja rakenduse vahendajaks: rakendus ei tööta täitmise keskkonnaga otseselt, vaid binaarse rakendusliidese kaudu. Sellisel juhul töötab implementatsioonil samaaegselt ainult üks rakendus.
  • SEE[g] (superviisori täitmise keskkond): käivitab operatsioonisüsteemi binaarse superviisorliidese kaudu. Operatsioonisüsteem omakorda käivitab rakendusi binaarse rakendusliidese kaudu. Sellisel juhul töötab implementatsioonil samaaegselt üks operatsioonisüsteem, mis saab käivitada ühte või mitut rakendusi.
  • HEE[h] (hüperviisori täitmise keskkond): käivitab hüperviisori binaarse hüperviisorliidese kaudu. Hüperviisor omakorda käivitab operatsioonisüsteeme binaarse superviisorliidese kaudu, milled saavad käivitada rakendusi binaarse rakendusliidese kaudu. Sellisel juhul saavad implementatsioonil töötada mitut operatsioonisüsteeme.

Iga RISC-V riistvaraline lõim töötab mingisugusel hetkel mingi privileegitasemel, mis on määratud kontroll- ja staatusregistrites. Kokku on olemas 3 privileegitaset: U (User/Application; Kasutaja/Rakendus); S (Supervisor; Superviisor); M (Machine; Masin). Mõned käsud on võimalik sooritada ainult juhul, kui riistvaraline lõim töötab mingil privileegitasemel. Kui proovitakse sooritada mingit käsku, mis ei saa sooritada jooksva privileegitasemel, siis visatakse erindit.[7]

Ülalpool kirjeldatud käsud saab RISC-V implementatsioon täita olenemata sellest milles privileegitasemel antud implementatsioon töötab.[2]

Tarkvara[muuda | muuda lähteteksti]

Vaatamata sellele, et RISC-V 2020. aasta seisuga ei ole laikasutusel mõne tarkvara toetab seda käsustikku või oli RISC-V käsustikusse porditud:[8]

Märkused[muuda | muuda lähteteksti]

  1. Sihiregister.
  2. Lähteregister.
  3. Immediate
  4. Register
  5. Store
  6. Application Execution Environment
  7. Supervisor Execution Environment
  8. Hypervisor Execution Environment

Viited[muuda | muuda lähteteksti]

  1. 1,0 1,1 1,2 RISC-V History 27.04.2020
  2. 2,0 2,1 2,2 2,3 2,4 2,5 Waterman, Andrew jt.. "The RISC-V Instruction Set Manual Volume I: Unprivileged ISA (Document Version 20191213)". 13. detsember 2019. Berkeley: University of California, Berkeley. Failitüüp: pdf. Vaadatud 28.04.2020. Inglise keeles.
  3. FAQ - RISC-V International 28.04.2020
  4. RISC-V Cores 28.04.2020
  5. 5,0 5,1 RISC rides again: New RISC-V architecture hopes to battle ARM and x86 by being totally open source 28.04.2020
  6. Chen, Tony; Patterson, David A.. "RISC-V Geneology". 26. jaanuar 2016. Berkeley: University of California at Berkeley. Failitüüp: pdf. Vaadatud 27.04.2020. Inglise keeles.
  7. Waterman, Andrew jt.. "The RISC-V Instruction Set Manual Volume II: Privileged Architecture (Document Version 20190608-Priv-MSU-Ratified)". 8. juuni 2019. Berkeley: University of California, Berkeley. Failitüüp: pdf. Vaadatud 28.04.2020. Inglise keeles.
  8. Software Status - RISC-V International 28.04.2020