Teknologian jakaminen

Riscv-arkkitehtuurin yhteensopivuustestaus

2024-07-12

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

Syy siihen, miksi keskitymme suoraan riscv-arch-testiin, johtuu siitä, että RISCOF-testikehys käyttää riscv-arch-testiä.
Lisää kuvan kuvaus tähän

1. Arkkitehtoninen testi

Arkkitehtuuritesti on yksittäinen testi, joka edustaa pienintä testikoodia, joka voidaan kääntää ja suorittaa. Se on kirjoitettu kokoonpanokoodilla ja sen tuote on testiallekirjoitus. Arkkitehtuuritesti voi koostua useista testitapauksista.

2. RISC-V arkkitehtoninen testipooli

RISC-V arkkitehtoninen testipooli koostuu kaikista hyväksytyistä arkkitehtonisista testeistä, jotka testikehys voidaan koota arkkitehtoniseksi testisarjaksi. RISC-V-arkkitehtuurin testikirjastojen on oltava testikohteen agnostisia (ja siksi niiden tulee toimia oikein kaikissa yhteensopivissa kohteissa). Huomaa, että tämä ei-toiminnallinen testaus ei korvaa varmennusta tai laitetestausta.

2.1 Testaa altaan rakennetta

architectural-tests-suite (root)
|-- <architecture>_<mode>/<feature(s)>, where
<architecture> is [ RV32I | RV64I | RV32E ]
<mode> is [ M | MU | MS | MSU ], where
   M   Machine      mode tests - tests execute in M-mode only
   MU  Machine/User mode tests - tests execute in both M- & U-modes (S-mode may exist)
   MS  Machine/Supv mode tests - tests execute in both M- & S-modes (not U-mode)
   MSU All          mode tests - tests execute in all of M-, S-, & U-Modes
<feature(s)> are the lettered extension [A | B | C | M ...] or subextension [Zifencei | Zam | ...] when the tests involve extensions, or more general names when tests cut across extension definitionss (e.g. Priv, Interrupt, Vm). The feature string consists of an initial capital letter, followed by any further letters in lower case.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Konemoodin prosessorin ohjesarjan ominaisuusrekisteri (MISA)
misa = 0x800000000094112f
Binääriesitys: 100000000000000000000000000000000000000100101000001000100101111
Lisää kuvan kuvaus tähän

riscv-arch-test/riscv-test-suite$ ls
env/ Makefile.include README.md rv32e_m/ rv32i_m/ rv64i_m/
riscv-arch-test/riscv-test-suite/rv64i_m$ ls
A/ B/ C/ CMO/ D/ F/ I/ K/ M/ etuoikeus/ P_ratifioimaton/ Zfh/ Zfinx/ Zicond/ Zifencei/

3. RISC-V arkkitehtoninen testisarja

RISC-V arkkitehtoninen testisarja on joukko testejä, jotka on valittu arkkitehtonisesta testipoolista tietyn RISC-V-kokoonpanon vaatimustenmukaisuuden testaamiseksi. Testitulokset saadaan testisarjan allekirjoituksen muodossa. Testin valinta perustuu kohteen vahvistuskokoonpanoon, spesifikaatioon, suoritusympäristöön tai alustavaatimuksiin. Yhteensopivan prosessorin tai suoritinmallin tulee näyttää sama Gold Reference Test Suite -allekirjoitus kuin tietyssä testattavassa kokoonpanossa.

4. Testitapaus

Testitapaukset ovat osa arkkitehtonista testausta ja testaavat vain yhtä spesifikaation toimintoa.
Huomautus: Testi voi sisältää useita testitapauksia, ja jokaisella testitapauksella on omat testin sisällyttämisehdot (määritetty RVTEST_CASE-makron cond_str-parametrilla).

4.1 Testin nimeäminen

<test objective>-<test number>.S
  • 1

riscv-arch-test/riscv-test-suite/rv64i_m/I/src$ ls
add-01.S ja-01.S bge-01.S bne-01.S lb-align-01.S lhu-align-01.S misalign1-jar-01.S sd-align-01.S slliw- 01.S sltiu-01.S sraiw-01.S srliw-01.S sw-align-01.S
addi-01.S andi-01.S bgeu-01.S aita-01.S lbu-align-01.S lui-01.S or-01.S sh-align-01.S sllw-01.S sltu -01.S sraw-01.S srlw-01.S xor-01.S
addiw-01.S auipc-01.S blt-01.S jal-01.S ld-align-01.S lw-align-01.S ori-01.S sll-01.S slt-01.S sra -01.S srl-01.S sub-01.S xori-01.S
addw-01.S beq-01.S bltu-01.S jalr-01.S lh-align-01.S lwu-align-01.S sb-align-01.S slli-01.S slti-01. S srai-01.S srli-01.S subw-01.S

5. Kokoonpanotestiinfrastruktuuri (ota esimerkkinä ./rv32i_m/I/src/add-01.S)

//
// This assembly file tests the add instruction of the RISC-V I extension for the add covergroup.
// 
#include "model_test.h"
#include "arch_test.h"
RVTEST_ISA("RV32I")

.section .text.init
.globl rvtest_entry_point
rvtest_entry_point:
RVMODEL_BOOT
RVTEST_CODE_BEGIN

#ifdef TEST_CASE_1

RVTEST_CASE(0,"//check ISA:=regex(.*32.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add)

RVTEST_SIGBASE( x3,signature_x3_1)

inst_0:
// rs2 == rd != rs1, rs1==x4, rs2==x24, rd==x24, rs1_val > 0 and rs2_val > 0, rs2_val == 1, rs1_val == (2**(xlen-1)-1), rs1_val != rs2_val, rs1_val == 2147483647
// opcode: add ; op1:x4; op2:x24; dest:x24; op1val:0x7fffffff;  op2val:0x1
TEST_RR_OP(add, x24, x4, x24, 0x80000000, 0x7fffffff, 0x1, x3, 0, x18)

inst_1:
// rs1 == rs2 != rd, rs1==x10, rs2==x10, rd==x28, rs1_val > 0 and rs2_val < 0, rs2_val == -257, rs1_val == 131072
// opcode: add ; op1:x10; op2:x10; dest:x28; op1val:0x20000;  op2val:0x20000
TEST_RR_OP(add, x28, x10, x10, 0x40000, 0x20000, 0x20000, x3, 4, x18)

inst_2:
// rs1 == rs2 == rd, rs1==x21, rs2==x21, rd==x21, rs1_val < 0 and rs2_val < 0, rs1_val == -16777217
// opcode: add ; op1:x21; op2:x21; dest:x21; op1val:-0x1000001;  op2val:-0x1000001
TEST_RR_OP(add, x21, x21, x21, 0xfdfffffe, -0x1000001, -0x1000001, x3, 8, x18)
......
......
......
RVTEST_CODE_END
RVMODEL_HALT

RVTEST_DATA_BEGIN
.align 4

rvtest_data:
.word 0xbabecafe
.word 0xbabecafe
.word 0xbabecafe
.word 0xbabecafe
RVTEST_DATA_END

RVMODEL_DATA_BEGIN
rvtest_sig_begin:
sig_begin_canary:
CANARY;

signature_x3_0:
    .fill 0*(XLEN/32),4,0xdeadbeef

signature_x3_1:
    .fill 17*(XLEN/32),4,0xdeadbeef

signature_x8_0:
    .fill 16*(XLEN/32),4,0xdeadbeef

signature_x1_0:
    .fill 512*(XLEN/32),4,0xdeadbeef

signature_x1_1:
    .fill 43*(XLEN/32),4,0xdeadbeef

#ifdef rvtest_mtrap_routine

tsig_begin_canary:
CANARY;
mtrap_sigptr:
    .fill 64*(XLEN/32),4,0xdeadbeef
tsig_end_canary:
CANARY;

#endif

#ifdef rvtest_gpr_save

gpr_save:
    .fill 32*(XLEN/32),4,0xdeadbeef

#endif

sig_end_canary:
CANARY;
rvtest_sig_end:
RVMODEL_DATA_END
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

Lyhyt selitys yllä olevasta kokoonpanokoodista on seuraava:

  1. Kommenttien otsikko

#Tämä kokoonpanotiedosto testaa RISC-V I -laajennuksen lisäysohjetta add cover-ryhmälle.

  1. Sisältää otsikkotiedostoja

#include "model_test.h"
#include "arch_test.h"

Jokaisen testin tulee sisältää vain seuraavat otsikkotiedostot:
model_test.h - määrittää kohdekohtaiset makrot, mukaan lukien pakolliset ja valinnaiset makrot: (esim. RVMODEL_xxx)
arch_test.h - määrittää ennalta määritetyt testimakrot, mukaan lukien pakolliset makrot ja valinnaiset makrot: (kuten RVTEST_xxx)

  1. Aseta testin TVM

RVTEST_ISA("RV32I")

  1. Testaa kohdekohtaista käynnistyskoodia

RVMODEL_BOOT

  1. GPR:n alustusrutiinin ja testikoodin aloitus

RVTEST_CODE_BEGIN

  1. Määritä RVTEST_CASE-merkkijono ja ehdot

#ifdef TEST_CASE_1
// Tämä testi on tarkoitettu rv32I-laajennuksen toteuttaville laitteille ja vaatii kääntämisen sallimisen
// makro TEST_CASE_1. Tämä testi auttaa lisäämään kattavuusmerkinnän.
RVTEST_CASE(0,“//check ISA:=regex(.32.);tarkista ISA:=regex(.minä);def TEST_CASE_1=True;,add)

  1. Alusta osoitin allekirjoitusalueelle

RVTEST_SIGBASE(x16,signature_x16_1) // x16 osoittaa signature_x16_1-tunnisteen allekirjoitusalueella

  1. Määrittele testitapaukset
inst_0:
// rs2 == rd != rs1, rs1==x4, rs2==x24, rd==x24, rs1_val > 0 and rs2_val > 0, rs2_val == 1, rs1_val == (2**(xlen-1)-1), rs1_val != rs2_val, rs1_val == 2147483647
// opcode: add ; op1:x4; op2:x24; dest:x24; op1val:0x7fffffff;  op2val:0x1
TEST_RR_OP(add, x24, x4, x24, 0x80000000, 0x7fffffff, 0x1, x3, 0, x18)

inst_1:
// rs1 == rs2 != rd, rs1==x10, rs2==x10, rd==x28, rs1_val > 0 and rs2_val < 0, rs2_val == -257, rs1_val == 131072
// opcode: add ; op1:x10; op2:x10; dest:x28; op1val:0x20000;  op2val:0x20000
TEST_RR_OP(add, x28, x10, x10, 0x40000, 0x20000, 0x20000, x3, 4, x18)
...
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
//Tests for a instructions with register-register operand
#define TEST_RR_OP(inst, destreg, reg1, reg2, correctval, val1, val2, swreg, offset, testreg) 
    TEST_CASE(testreg, destreg, correctval, swreg, offset, 
      LI(reg1, MASK_XLEN(val1))                        ;
      LI(reg2, MASK_XLEN(val2))                        ;
      inst destreg, reg1, reg2                        ;
    )
#define TEST_CASE(testreg, destreg, correctval, swreg, offset, code... )        ;
    code                                ;
    RVTEST_SIGUPD(swreg,destreg,offset)        ;
    RVMODEL_IO_ASSERT_GPR_EQ(testreg, destreg, correctval)

 /* automatically adjust base and offset if offset gets too big, resetting offset                                 */
 /* RVTEST_SIGUPD(basereg, sigreg)          stores sigreg at offset(basereg) and updates offset by regwidth         */
 /* RVTEST_SIGUPD(basereg, sigreg,newoff) stores sigreg at newoff(basereg) and updates offset to regwidth+newoff */
#define RVTEST_SIGUPD(_BR,_R,...)                        ;
  .if NARG(__VA_ARGS__) == 1                                ;
        .set offset,_ARG1(__VA_OPT__(__VA_ARGS__,0))        ;
  .endif                                                ;
  CHK_OFFSET(_BR, REGWIDTH,0)                                ;
  SREG _R,offset(_BR)                                        ;
  .set offset,offset+REGWIDTH
  
  RVMODEL_IO_ASSERT_GPR_EQ 定义在target的model_test.h中```

在咱们得model_test.h中将RVMODEL_IO_ASSERT_GPR_EQ 宏定义如下:比较错误的话,往0xF00000801

```c
#define RVMODEL_IO_ASSERT_GPR_EQ(_S, _R, _I)  
    li _S, 0xF0000080;         
    mv t0, _R;                 
    li t3, _I;                 
    beq t0, t3, 1f;            
    li t2, 1;                  
    sw t2, 0(_S);              
    j 2f;                      
1:                             
    li t2, 0;                  
    sw t2, 0(_S);              
2:                             
    nop;```

在tb.v中加入监测对AXI 写地址总线,地址0xF0000080的监测,如果出现fail_cnt >0,可以判断该testcase错误

```c
// RVMODEL_IO_ASSERT_GPR_EQ(testreg, destreg, correctval) used to check destreg == correctval
// destreg != correctva write testreg 1, else write testreg 0
always @(posedge `CPU_CLK) begin
    if ((cpu_awaddr[31:0] == 32'hF000_0080) && cpu_wvalid && `clk_en && (cpu_wstrb[15:0] == 16'hf)) begin
       if(`SOC_TOP.biu_pad_wdata == 1'b1) begin
         fail_cnt ++;
       end
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  1. Muuta allekirjoituspohjarekisteriä
// this will change the signature base register to x3. x3 will not point to signature_x3_0 in
// the signature region
RVTEST_SIGBASE( x3,signature_x3_0)

// continue with new test cases ..
TEST_RR_OP(add, x4, x24, x27, 0x55555955, 0x00000400, 0x55555555, x3, 0, x5)
...
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. Lopeta testi ja pysäytä testikohde
RVTEST_CODE_END
RVMODEL_HALT
  • 1
  • 2
  1. Luo testisyöttötietoosio
RVTEST_DATA_BEGIN
rvtest_data:
.word 0xbabecafe
RVTEST_DATA_END
  • 1
  • 2
  • 3
  • 4
  1. Luo valmiiksi ladattu allekirjoitusalue
RVMODEL_DATA_BEGIN
rvtest_sig_begin:
sig_begin_canary:
CANARY;

signature_x3_0:
    .fill 0*(XLEN/32),4,0xdeadbeef

signature_x3_1:
    .fill 17*(XLEN/32),4,0xdeadbeef

signature_x8_0:
    .fill 16*(XLEN/32),4,0xdeadbeef

signature_x1_0:
    .fill 512*(XLEN/32),4,0xdeadbeef

signature_x1_1:
    .fill 43*(XLEN/32),4,0xdeadbeef

#ifdef rvtest_mtrap_routine

tsig_begin_canary:
CANARY;
mtrap_sigptr:
    .fill 64*(XLEN/32),4,0xdeadbeef
tsig_end_canary:
CANARY;

#endif

#ifdef rvtest_gpr_save

gpr_save:
    .fill 32*(XLEN/32),4,0xdeadbeef

#endif

sig_end_canary:
CANARY;
rvtest_sig_end:
RVMODEL_DATA_END
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

6. Testitapauksen allekirjoitus

Testitapauksen allekirjoitusta edustaa yksi tai useampi arvo. Arvo kirjoitetaan muistiin alkaen osoitteesta, jonka on määrittänyt RVMODEL_DATA_BEGIN ja päättyen osoitteeseen, jonka määrittää RVMODEL_DATA_END. Allekirjoitukset on helppo luoda käyttämällä RVTEST_SIGUPD-makroa.

7. Testin allekirjoitus

Testiallekirjoitus on arkkitehtonisen testiajon luoma tunnusarvo. Testiallekirjoitus voi koostua useista testitapausallekirjoituksista, joiden etuliitteenä on erillinen rivi, joka sisältää testin nimen ja yksilöllisen arvon, joka ilmaisee sen version. Testikohde vastaa arvojen purkamisesta muistista ja niiden asianmukaisesta muotoilusta käyttämällä kehyksen tarjoamia metatietoja RVMODEL_DATA_BEGIN- ja RVMODEL_DATA_END-makrojen avulla.Testitapauksen allekirjoitusarvo kirjoitetaan riveihin alkaen vasemmalla olevasta merkittävimmästä tavusta muodossa<hex_value> , jossa arvon pituus on 32 bittiä (eli 8 merkkiä), kun taas varsinaisessa testilaskelmassa ei oteta huomioon arvon pituutta. Tiedostot tulee tallentaa alkaen arvosta alimmassa allekirjoitusosoitteessa (eli RVMODEL_DATA_BEGIN - RVMODEL_DATA_END). Lisäksi allekirjoituksen tulee aina alkaa 16-tavuisesta (128-bittistä) rajasta ja allekirjoituksen koon tulee olla 4 tavun kerrannainen (eli sen tulee myös päättyä 4-tavuiseen rajaan).

8. Testisarjan allekirjoitus

Testisarjan allekirjoitus määritellään joukoksi testiallekirjoituksia, jotka ovat kelvollisia tietylle arkkitehtoniselle testisarjalle. Se edustaa tietylle RISC-V-kokoonpanolle valitun arkkitehtonisen testipaketin testiallekirjoitusta.

9. RISCOF-testauskehys

RISCOF - RISC-V Compatibility Framework on Python-pohjainen kehys, joka mahdollistaa RISC-V-arkkitehtonisten testisarjojen käytön testaamaan RISC-V-kohteita (laitteisto- tai ohjelmistototeutuksia) yhteensopivuuden varalta standardin RISC-V Golden Reference -viitteen kanssa. Malli seksiä.
Lisää kuvan kuvaus tähän
RISC-V Configuration Validator: RISCV-Config
RISC-V-yhteensopivuustestigeneraattori: RISC-V CTG
RISC-V ISA Kattavuus: RISC-V ISAC
Jotta RISCOF voi suorittaa testin normaalisti, seuraava sisältö on toimitettava:

  • config.ini: Tämä tiedosto on perusmääritystiedosto ja noudattaa ini-syntaksia. Tämä tiedosto kaappaa tietoja, kuten: DUT/reference-laajennuksen nimi, polku laajennukseen, polku riscv-config-pohjaiseen YAML-tiedostoon jne.
  • dut-plugin-hakemisto: RISCOF edellyttää, että testattu DUT-malli toimitetaan Python-laajennuksen muodossa. Python-laajennus on itse asiassa Python-tiedosto, joka sisältää tiettyjä vakiomuotoisia ja määriteltyjä toimintoja testin laatimiseen, suorittamiseen ja allekirjoitusten purkamiseen. Tämän Python-tiedoston nimessä on oltava riscof_-etuliite, ja sen on oltava dut-plugin-hakemistossa. Python-laajennustiedostoosiossa voit oppia tämän Python-tiedoston kirjoittamisesta.
    Tämän hakemiston tulee sisältää myös riscv-config-pohjaiset isa- ja alusta-YAML-tiedostot, jotka tarjoavat DUT:n määritelmän. Näitä YAML-tiedostoja käytetään suodattamaan testit, jotka on suoritettava DUT:ssa.
    Lopuksi dut-plugin-hakemistossa on oltava env-hakemisto, joka sisältää ympäristötiedostoja, kuten model_test.h, joita tarvitaan testien kääntämiseen ja suorittamiseen. Katso TestFormat-spesifikaatiosta makrojen määritelmät, joita voidaan käyttää model_test.h-tiedostossa. env-hakemisto voi sisältää myös muita tiedostoja, kuten linkkikomentosarjat ja jälkikäsittelykomentosarjat, joita käyttäjät saattavat tarvita.
  • reference-plugin directory: Kuten DUT-laajennus, RISCOF vaatii myös referenssimallilaajennuksen. Hakemisto- ja tiedostorakenne on sama kuin DUT:n. Isaa- ja alustan YAML-tiedostoja ei kuitenkaan tarvita, koska RISCOF valitsee aina YAML-tiedostot kaikkiin tarkoituksiin DUT-laajennuksesta.
    Toiminnan yksinkertaistamiseksi RISCOF luo standardinmukaisia ​​DUT- ja referenssimallien esiasetettuja malleja käyttäjille asetuskomentojen avulla, kuten seuraavassa kuvassa:

$ riscof asennus --dutname=spike

Yllä oleva komento luo seuraavat tiedostot ja hakemistot nykyiseen hakemistoon:

├──config.ini # riscofin asetustiedosto
├──spike/ # DUT-laajennusmalleja
├── ym
│ ├── link.ld # DUT-linker script
│ └── model_test.h # DUT-kohtainen otsikkotiedosto
├── riscof_spike.py # DUT python -laajennus
├── spike_isa.yaml # DUT ISA yaml perustuu riscv-config
└── spike_platform.yaml # DUT Platform yaml perustuu riscv-config
├──sail_cSim/ # viitelaajennusmalleja
├── ym
│ ├── link.ld # Viitelinkityksen komentosarja
│ └── model_test.h # Viitemallikohtainen otsikkotiedosto
├── sen sisällä.py
└── riscof_sail_cSim.py # Python-laajennus.

Vaihda yllä oleva piikki C920-laajennukseen Tietenkin sinun on muokattava jokaista konfiguraatiotiedostoa ja python-tiedostoa.
c920_isa.yaml

hart_ids: [0]
hart0:
  ISA: RV64IMAFDCVZicsr_Zicbom_Zicbop_Zicboz_Zihintpause_Zfh_Zca_Zcb_Zcd_Zba_Zbb_Zbc_Zbs
  physical_addr_sz: 40
  User_Spec_Version: "2.2"
  Privilege_Spec_Version: "1.10"
  hw_data_misaligned_support: false
  pmp_granularity: 4
  supported_xlen: [64]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

c920_platform.yaml

mtime:
  implemented: true
  address: 0xBFF8
mtimecmp:
  implemented: true
  address: 0x4000
nmi:
  label: nmi_vector
reset:
  address: 0x000000000 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

Seuraavan komennon suorittaminen purkaa tapausluettelon tiedostosta test_list.yaml ja suorittaa jokaisen tapauksen. Voit kommentoida joitakin niistä ja suorittaa vain joitain tapauksia.

riscof run --config=config.ini
–suite=riscv-arch-test/riscv-test-suite/
–env=riscv-arch-test/riscv-test-suite/env
–testfile=riscof_work/test_list.yaml

Seuraavan komennon suorittaminen luo test_list.yaml-tiedoston ja suorittaa regression

riscof run --config=config.ini
–suite=riscv-arch-test/riscv-test-suite/
–env=riscv-arch-test/riscv-test-suite/env

10. Testitulokset

Lisää kuvan kuvaus tähän
Virheen syyanalyysi:
Ensimmäinen:
Lisää kuvan kuvaus tähän
Tämä johtuu siitä, että käännöksen aikana tapahtui virhe

    INFO | Compiling test: /ssd_fes/jiongz/desktop/github/c920_riscof1/riscv-arch-test/riscv-test-suite/rv64i_m/I/src/beq-01.S
   ERROR | /opt/picocom/ThirdParty_Libs/T-head/C920_R2S0P21/C920_R2S0_manuals_and_tools/manuals_and_tools/08_toolchain_900_series_cpu_toolchain/V2.8.0/Xuantie-900-gcc-elf-newlib-x86_64-V2.8.0/bin/../lib/gcc/riscv64-unknown-elf/10.4.0/../../../../riscv64-unknown-elf/bin/ld: main.elf section `.text' will not fit in region `MEM1'
collect2: error: ld returned 1 exit status
  • 1
  • 2
  • 3

Toinen tyyppi:
Lisää kuvan kuvaus tähän
Se on vain, että c920 ei ota tiettyä komentoa oletusarvoisesti käyttöön.
Lisää kuvan kuvaus tähän

11. rv64i_m/I/src/add-01.S-aaltomuoto

Mallissa model_test.h on myös makro allekirjoituksen ja viimeistelyn simulointia varten

// This will dump the test results (signature) via the testbench dump module.
#define RVMODEL_HALT                                          
    signature_dump:                                           
      la   a0, begin_signature;                               
      la   a1, end_signature;                                 
      li   a2, 0xF0000040;                                    
    signature_dump_loop:                                      
      bge  a0, a1, signature_dump_end;                        
      lw   t0, 0(a0);                                         
      sw   t0, 0(a2);                                         
      addi a0, a0, 4;                                         
      j    signature_dump_loop;                               
    signature_dump_end:                                       
      nop;                                                    
    terminate_simulation:                                     
      li   a0, 0xF0000000;                                    
      li   a1, 0xCAFECAFE;                                    
      sw   a1, 0(a0);                                         
      j    terminate_simulation
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Vastaa tb.v

always @(posedge `CPU_CLK or negedge `CPU_RST) begin
    if (!`CPU_RST) begin
        msi <= 1'b0;
        mei <= 1'b0;
        mti <= 1'b0;
    end else begin
        //if ((wb_cpu.cyc == 1'b1) && (wb_cpu.stb == 1'b1) && (wb_cpu.we == 1'b1) && (cpu_awaddr[31:0] == 32'hF000_0000)) begin
        if ((cpu_awaddr[31:0] == 32'hF000_0000) && cpu_wvalid && `clk_en && (cpu_wstrb[15:0] == 16'hf)) begin
            case (`SOC_TOP.biu_pad_wdata[31:0])
                32'hCAFE_CAFE: begin // end simulation
                    $display("Finishing simulation.");
                    #100;
                    if(fail_cnt >0) begin
                     $error("This case test failed!");
                    end
                    $finish;
                end
                ......
 end

// Signature Dump
int dump_file; // Declare file handle
always @(posedge `CPU_CLK) begin
    if ((cpu_awaddr[31:0] == 32'hF000_0040) && cpu_wvalid && `clk_en && (cpu_wstrb[15:0] == 16'hf)) begin
        if (!dump_file) begin // Check if file is already open
            dump_file = $fopen("DUT-c920.signature", "w"); // Open file if not already opened
        end
        //for (int i = 7; i >= 0; i--) begin
        //    $fwrite(dump_file, "%hn", `SOC_TOP.biu_pad_wdata[i*4 +: 4]); // Write data
        //end
        $fwrite(dump_file, "%hn", `SOC_TOP.biu_pad_wdata[31:0]); // Write data
    end
    else if((cpu_awaddr[31:0] == 32'hF000_0000) && cpu_wvalid && `clk_en && (cpu_wstrb[15:0] == 16'hf)) begin
        if (dump_file) begin // If file is open, close it
            $fclose(dump_file);
            dump_file = 0; // Reset file handle to 0 indicating file is closed
        end
    end
end

// RVMODEL_IO_ASSERT_GPR_EQ(testreg, destreg, correctval) used to check destreg == correctval
// destreg != correctva write testreg 1, else write testreg 0
always @(posedge `CPU_CLK) begin
    if ((cpu_awaddr[31:0] == 32'hF000_0080) && cpu_wvalid && `clk_en && (cpu_wstrb[15:0] == 16'hf)) begin
       if(`SOC_TOP.biu_pad_wdata == 1'b1) begin
         fail_cnt ++;
       end
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
#include "model_test.h"
#include "arch_test.h"
RVTEST_ISA("RV64I")

.section .text.init
.globl rvtest_entry_point
rvtest_entry_point:
RVMODEL_BOOT
RVTEST_CODE_BEGIN

#ifdef TEST_CASE_1

RVTEST_CASE(0,"//check ISA:=regex(.*64.*);check ISA:=regex(.*I.*);def TEST_CASE_1=True;",add)

RVTEST_SIGBASE( x8,signature_x8_1)

inst_0:
// rs1 == rs2 != rd, rs1==x0, rs2==x0, rd==x20, rs1_val > 0 and rs2_val > 0, rs1_val == 4, rs1_val==4 and rs2_val==6148914691236517206, rs1_val != rs2_val
// opcode: add ; op1:x0; op2:x0; dest:x20; op1val:0x0;  op2val:0x0
TEST_RR_OP(add, x20, x0, x0, 0x0, 0x0, 0x0, x8, 0, x16)

inst_1:
// rs2 == rd != rs1, rs1==x2, rs2==x26, rd==x26, rs1_val > 0 and rs2_val < 0, rs2_val == -1073741825
// opcode: add ; op1:x2; op2:x26; dest:x26; op1val:0x5;  op2val:-0x40000001
TEST_RR_OP(add, x26, x2, x26, 0xffffffffc0000004, 0x5, -0x40000001, x8, 8, x16)

inst_2:
// rs1 == rs2 == rd, rs1==x22, rs2==x22, rd==x22, rs1_val < 0 and rs2_val < 0, rs1_val == -8388609
// opcode: add ; op1:x22; op2:x22; dest:x22; op1val:-0x800001;  op2val:-0x800001
TEST_RR_OP(add, x22, x22, x22, 0xfffffffffefffffe, -0x800001, -0x800001, x8, 16, x16)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

Tiedoston "riscof_work/rv64i_m/I/src/add-01.S/dut/DUT-c920.signature" sisältö on seuraava:

e7d4b281
6f5ca309
00000000
00000000
c0000004
ffffffff
feffffffe
ffffffff
ffffffbf
007ffff
00000080
00000000
66666665
e6666666
00000001
00000000
0001ffff
80000000
10000001
00000000
fffffeff

Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän