Teknologian jakaminen

NEMU DiffTestin perusperiaatteet

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Tämä artikkeli kuuluu"RISC-V-ohjesarjan differentiaalitesti (DiffTest) -sarjan opetusohjelmat"1, tervetuloa tutustumaan muihin artikkeleihin.

1 Lyhyt kuvaus DiffTest-periaatteesta

DiffTestin ydinidea: Kahden samaan spesifikaatioon perustuvan toteutuksen ja samalla määritellyllä syötteellä niiden käyttäytymisen tulisi olla johdonmukaista.
Takaisin prosessorin suunnitteluun, kahdessa riscv-käsikirjan mukaisessa toteutuksessa, samalla oikealla ohjelmalla, niiden tilamuutosten (rekisterit, muisti) tulisi olla johdonmukaisia ​​kahdessa toteutuksessa:

  • Yksi niistä on CPU;
  • Vaihtoehtoisesti voit valita simulaattorin referenssitoteutukseksi.
    Lisää kuvan kuvaus tähän
    Joka kerta, kun molemmat osapuolet suorittavat käskyn, he tarkistavat vastaavien rekisterien ja muistin tilan. Jos he huomaavat, että tila on epäjohdonmukainen, he ilmoittavat välittömästi virheestä ja lopettavat asiakasohjelman suorittamisen (vastaa väitteen tekemistä). jokainen ohje).
  • DiffTest = Online-komentotason käyttäytymisen vahvistusmenetelmä
    • Online = Tarkista ohjelmaa suoritettaessa
    • Käskytaso = jokainen suoritettu käsky varmistetaan
  • Voi muuntaa minkä tahansa ohjelman ohjetason testeiksi ja vahvistaa tilan
    • Tuki ohjelmia, jotka eivät lopu, kuten käyttöjärjestelmä
  • Ei tarvitse tietää toimenpiteen tulosta etukäteen
    • Koska vertaamme käskyjen suorittamisen käyttäytymistä, emme ohjelman semantiikkaa

DiffTestin suurimmat käyttötarkoitukset ovat:Kun dekoodaus- tai suoritusvirheitä ilmenee satojen tai tuhansien käskyjen suorittamisen jälkeen, kuinka löydämme nopeasti ensimmäisen virhekäskyn. Tämä on helvetin tason vaikeus?

Tässä artikkelissa valitsemme seuraavan esimerkin havainnollistamaan:

  • QEMU viiteobjektina (REF)
  • NEMU koehenkilönä (DUT)

Tietysti, jos haluat testata prosessorin laitteistoa, prosessoria voidaan käyttää myös DUT:na.

2 NEMU:n tukema DiffTest

make menuconfig
  • 1

Anna Testaus ja virheenkorjaus -> Ota differentiaalitestaus käyttöön -> Viitesuunnittelu seuraavasti:

Lisää kuvan kuvaus tähän
Kun NEMU:ta käytetään DUT:ssa, voit valita 5 simulaattoritilaa referenssisimulaattoriksi REF.

  • QEMU, dynaaminen kirjastotila, koodi sijaitsee hakemistossa NEMU/tools/qemu-dl-diff/
  • QEMU, Socket-tila, koodi sijaitsee kohdassa NEMU/tools/qemu-socket-diff/
  • KVM, koodi sijaitsee hakemistossa NEMU/tools/kvm-diff/
  • NEMU
  • PIIKKI

Kolmen viimeksi mainitun osalta kirjoittaja ei ole tehnyt erityistä tutkimusta, joten tässä artikkelissa ei esitetä niitä.

3 QEMU tekee REF:n (dynaaminen kirjastotila)

Voit vaihtaa NEMU/työkalut/qemu-dl-diff/, käännetty dynaamiseen kirjastoon riscv64-qemu-so.
NEMU:n, dynaamisten kirjastojen ja QEMU:n välinen suhde:
Lisää kuvan kuvaus tähän

  • Dynaaminen kirjasto: riscv64-qemu-so, joka vie difftest_xx-sarjan funktiorajapintoja.
  • QEMU: Suoritettavassa tiedostossa qemu-system-riscv64 on cpu_xx-, gdb_xx- ja qemu_xx-sarjan funktiorajapinnat.
  • NEMU: riscv64-nemu-tulkkiohjelma kutsuu dynaamista kirjastoa, joka sitten kutsuu QEMU:ta.

erityinen prosessi:

  • NEMU-suoritettava ohjelma riscv64-nemu-interpreter lataa riscv64-qemu-so kutsumalla dlopen-funktiota ja jäsentää difftest_xx-sarjan funktiosymbolit myöhempiä kutsuja varten.
  • Sitten NEMU kutsuu difftest_init-funktion alustusta varten.
  • Difftest_init-funktiossa dlopen-funktiota kutsutaan uudelleen qemu-system-riscv64-suoritettavan tiedoston lataamiseksi ja funktiosymbolien cpu_xx-, gdb_xx- ja qemu_xx-sarjojen jäsentämiseksi. Nämä funktiosymbolit ovat itse asiassa difftest_xx-funktiosarjan toteutuskoodi .
  • Tiedostosta qemu-system-riscv64 jäsennysfunktio on päätoiminto, ja sitten difftest_init-funktio kutsuu sitä käynnistääkseen qemu-ohjelman.
  • Sitten, jos kaikki on normaalia, voit kutsua qemu-funktiota vertaillaksesi käskytuloksia.

4 QEMU REF:lle (Socket-tila)

Voit vaihtaa NEMU/työkalut/qemu-socket-diff/, käännetty dynaamiseen kirjastoon riscv64-qemu-so.
NEMU:n, dynaamisten kirjastojen ja QEMU:n välinen suhde:
Lisää kuvan kuvaus tähän

  • Dynaaminen kirjasto: riscv64-qemu-so, joka vie difftest_xx-sarjan funktiorajapintoja.
  • QEMU: Suoritettavassa tiedostossa qemu-system-riscv64 on cpu_xx- ja gdb_xx-sarjan funktiorajapinnat.
  • NEMU: riscv64-nemu-tulkkiohjelma kutsuu dynaamista kirjastoa. Dynaaminen kirjasto lähettää komentopaketin socketin kautta ja jäsentää sen ja päättää, mikä toiminto kutsuu suoritettavaksi.

erityinen prosessi:

  • NEMU-suoritettava ohjelma riscv64-nemu-interpreter lataa riscv64-qemu-so kutsumalla dlopen-funktiota ja jäsentää difftest_xx-sarjan funktiosymbolit myöhempiä kutsuja varten.
  • Sitten NEMU kutsuu difftest_init-funktion alustusta varten.
  • Difftest_init-funktiossa aliprosessi fork():n ja käynnistää QEMU:n kutsumalla execlp-funktiota, kun emoprosessi jatkaa suoritustaan, muodostaa yhteyden QEMU:hun socketin kautta ja kutsuu init_isa-funktion alustaakseen.
  • Sitten, jos kaikki on normaalia, voit verrata komentojen tuloksia socketin kautta.

Viitedokumentaatio: