Κοινή χρήση τεχνολογίας

Δοκιμή συμμόρφωσης για την αρχιτεκτονική Riscv

2024-07-12

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

Ο λόγος για τον οποίο εστιάζουμε απευθείας στο riscv-arch-test είναι επειδή το πλαίσιο δοκιμής RISCOF χρησιμοποιεί riscv-arch-test.
Εισαγάγετε την περιγραφή της εικόνας εδώ

1. Η αρχιτεκτονική δοκιμή

Μια αρχιτεκτονική δοκιμή είναι μια ενιαία δοκιμή που αντιπροσωπεύει τον μικρότερο κώδικα δοκιμής που μπορεί να μεταγλωττιστεί και να εκτελεστεί. Είναι γραμμένο σε κώδικα συναρμολόγησης και το προϊόν του είναι δοκιμαστική υπογραφή. Ένα αρχιτεκτονικό τεστ μπορεί να αποτελείται από πολλαπλές περιπτώσεις δοκιμών.

2. Η πισίνα αρχιτεκτονικών δοκιμών RISC-V

Η ομάδα αρχιτεκτονικών δοκιμών RISC-V αποτελείται από όλες τις εγκεκριμένες αρχιτεκτονικές δοκιμές που μπορούν να συγκεντρωθούν από το πλαίσιο δοκιμής σε μια σειρά αρχιτεκτονικών δοκιμών. Οι βιβλιοθήκες δοκιμών αρχιτεκτονικής RISC-V πρέπει να είναι αγνωστικές στο στόχο δοκιμής (και επομένως θα πρέπει να εκτελούνται σωστά σε οποιονδήποτε συμμορφούμενο στόχο). Λάβετε υπόψη ότι αυτή η μη λειτουργική δοκιμή δεν υποκαθιστά την επαλήθευση ή τη δοκιμή συσκευής.

2.1 Δοκιμαστική δομή πισίνας

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

Μητρώο χαρακτηριστικών συνόλου εντολών επεξεργαστή λειτουργίας μηχανήματος (MISA)
misa = 0x800000000094112f
Δυαδική αναπαράσταση: 10000000000000000000000000000000000000010010100000000000000000000
Εισαγάγετε την περιγραφή της εικόνας εδώ

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/ privilege/ P_unratified/ Zfh/ Zfinx/ Zicond/ Zifencei/

3. Η σουίτα αρχιτεκτονικών δοκιμών RISC-V

Η σουίτα αρχιτεκτονικών δοκιμών RISC-V είναι ένα σύνολο δοκιμών που επιλέγονται από τη δεξαμενή αρχιτεκτονικών δοκιμών για τη δοκιμή της συμμόρφωσης μιας συγκεκριμένης διαμόρφωσης RISC-V. Τα αποτελέσματα των δοκιμών λαμβάνονται με τη μορφή υπογραφής σειράς δοκιμών. Η επιλογή δοκιμής βασίζεται στη διαμόρφωση, τις προδιαγραφές, το περιβάλλον εκτέλεσης ή τις απαιτήσεις πλατφόρμας του στόχου. Ένας συμβατός επεξεργαστής ή μοντέλο επεξεργαστή θα πρέπει να εμφανίζει την ίδια υπογραφή Gold Reference Test Suite με τη συγκεκριμένη διαμόρφωση που δοκιμάζεται.

4. Η δοκιμαστική υπόθεση

Οι δοκιμές αποτελούν μέρος των αρχιτεκτονικών δοκιμών και δοκιμάζουν μόνο μία λειτουργία της προδιαγραφής.
Σημείωση: Μια δοκιμή μπορεί να περιέχει πολλαπλές περιπτώσεις δοκιμής, καθεμία από τις οποίες έχει τις δικές της συνθήκες συμπερίληψης δοκιμής (που ορίζονται από την παράμετρο cond_str της μακροεντολής RVTEST_CASE).

4.1 Ονομασία δοκιμής

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

riscv-arch-test/riscv-test-suite/rv64i_m/I/src$ ls
add-01.S and-01.S bge-01.S bne-01.S lb-align-01.S lhu-align-01.S misalign1-jalr-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 fence-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 υπο-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. Υποδομή δοκιμής συναρμολόγησης (πάρτε παράδειγμα ./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

Μια σύντομη επεξήγηση του παραπάνω κώδικα συναρμολόγησης έχει ως εξής:

  1. Επικεφαλίδα για να περιλαμβάνει σχόλια

#Αυτό το αρχείο συναρμολόγησης ελέγχει την εντολή προσθήκης της επέκτασης RISC-V I για την κάλυψη της ομάδας προσθήκης.

  1. Περιλαμβάνει αρχεία κεφαλίδας

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

Κάθε δοκιμή πρέπει να περιλαμβάνει μόνο τα ακόλουθα αρχεία κεφαλίδας:
model_test.h - ορίζει μακροεντολές για συγκεκριμένους στόχους, συμπεριλαμβανομένων των απαιτούμενων και προαιρετικών μακροεντολών: (π.χ. RVMODEL_xxx)
arch_test.h - ορίζει προκαθορισμένες δοκιμαστικές μακροεντολές, συμπεριλαμβανομένων των απαιτούμενων μακροεντολών και των προαιρετικών μακροεντολών: (όπως RVTEST_xxx)

  1. Ρυθμίστε το TVM της δοκιμής

RVTEST_ISA ("RV32I")

  1. Δοκιμάστε τον κωδικό εκκίνησης συγκεκριμένου στόχου

RVMODEL_BOOT

  1. Έναρξη ρουτίνας αρχικοποίησης GPR και κωδικού δοκιμής

RVTEST_CODE_BEGIN

  1. Καθορίστε τη συμβολοσειρά και τις συνθήκες RVTEST_CASE

#ifdef TEST_CASE_1
// αυτή η δοκιμή προορίζεται για συσκευές που εφαρμόζουν την επέκταση rv32I και απαιτεί την ενεργοποίηση της μεταγλώττισης
// μακροεντολή TEST_CASE_1. Αυτή η δοκιμή θα συμβάλει στην ετικέτα κάλυψης "προσθήκη".
RVTEST_CASE(0,“//check ISA:=regex(.32.);ελέγξτε το ISA:=regex(.ΕΓΩ.);def TEST_CASE_1=True;”,προσθήκη)

  1. Εκκίνηση του δείκτη στην περιοχή υπογραφής

RVTEST_SIGBASE( x16,signature_x16_1) // x16 θα δείχνει στην ετικέτα signature_x16_1 στην περιοχή υπογραφής

  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)
...
...
  • 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. Αλλαγή μητρώου βάσης υπογραφής
// 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. Τερματίστε τη δοκιμή και σταματήστε τη δοκιμή-στόχο
RVTEST_CODE_END
RVMODEL_HALT
  • 1
  • 2
  1. Δημιουργία ενότητας δεδομένων εισαγωγής δοκιμής
RVTEST_DATA_BEGIN
rvtest_data:
.word 0xbabecafe
RVTEST_DATA_END
  • 1
  • 2
  • 3
  • 4
  1. Δημιουργία προφορτωμένης περιοχής υπογραφής
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. Η υπογραφή της δοκιμαστικής υπόθεσης

Μια υπογραφή περίπτωσης δοκιμής αντιπροσωπεύεται από μία ή πολλαπλές τιμές. Η τιμή θα γραφτεί στη μνήμη ξεκινώντας από τη διεύθυνση που καθορίζεται από το RVMODEL_DATA_BEGIN και τελειώνει στη διεύθυνση που καθορίζεται από το RVMODEL_DATA_END. Οι υπογραφές δημιουργούνται εύκολα χρησιμοποιώντας τη μακροεντολή RVTEST_SIGUPD.

7. Η υπογραφή δοκιμής

Η υπογραφή δοκιμής είναι η χαρακτηριστική τιμή που δημιουργείται από την αρχιτεκτονική δοκιμή. Μια υπογραφή δοκιμής μπορεί να αποτελείται από πολλαπλές υπογραφές περίπτωσης δοκιμής, με πρόθεμα μια ξεχωριστή γραμμή που περιέχει το όνομα της δοκιμής και μια μοναδική τιμή που υποδεικνύει την έκδοσή της. Ο δοκιμαστικός στόχος είναι υπεύθυνος για την εξαγωγή των τιμών από τη μνήμη και τη σωστή μορφοποίησή τους, χρησιμοποιώντας τα μεταδεδομένα που παρέχονται από το πλαίσιο, χρησιμοποιώντας τις μακροεντολές RVMODEL_DATA_BEGIN και RVMODEL_DATA_END.Η τιμή υπογραφής της δοκιμαστικής περίπτωσης γράφεται σε σειρές, ξεκινώντας από το πιο σημαντικό byte στα αριστερά, στη μορφή<hex_value> , όπου το μήκος της τιμής θα είναι 32 bit (άρα 8 χαρακτήρες), ενώ ο πραγματικός υπολογισμός δοκιμής δεν λαμβάνει υπόψη το μήκος της τιμής. Τα αρχεία θα πρέπει να αποθηκεύονται ξεκινώντας από την τιμή στη χαμηλότερη διεύθυνση υπογραφής (δηλαδή από RVMODEL_DATA_BEGIN έως RVMODEL_DATA_END). Επιπλέον, η υπογραφή πρέπει πάντα να ξεκινά σε ένα όριο 16 byte (128 bit) και το μέγεθος της υπογραφής πρέπει να είναι πολλαπλάσιο των 4 byte (δηλαδή, θα πρέπει επίσης να τελειώνει σε ένα όριο 4 byte).

8. Η υπογραφή της δοκιμαστικής σουίτας

Μια υπογραφή δοκιμαστικής σουίτας ορίζεται ως ένα σύνολο δοκιμαστικών υπογραφών που ισχύουν για μια δεδομένη σειρά αρχιτεκτονικών δοκιμών. Αντιπροσωπεύει τη δοκιμαστική υπογραφή της επιλεγμένης σειράς δοκιμών αρχιτεκτονικής για μια συγκεκριμένη διαμόρφωση RISC-V.

9. Πλαίσιο δοκιμών RISCOF

RISCOF - Το RISC-V Compatibility Framework είναι ένα πλαίσιο βασισμένο σε Python που επιτρέπει τη χρήση ενός συνόλου αρχιτεκτονικών δοκιμών RISC-V για τη δοκιμή στόχων RISC-V (υλοποιήσεις υλικού ή λογισμικού) για συμβατότητα με το πρότυπο RISC-V Golden Reference μοντέλο σεξ.
Εισαγάγετε την περιγραφή της εικόνας εδώ
RISC-V Configuration Validator : RISCV-Config
RISC-V Compliance Test Generator : RISC-V CTG
RISC-V ISA Κάλυψη : RISC-V ISAC
Προκειμένου το RISCOF να εκτελέσει κανονικά τη δοκιμή, πρέπει να παρέχεται το ακόλουθο περιεχόμενο:

  • config.ini: Αυτό το αρχείο είναι ένα βασικό αρχείο διαμόρφωσης που ακολουθεί τη σύνταξη ini. Αυτό το αρχείο θα καταγράψει πληροφορίες όπως: το όνομα της προσθήκης DUT/αναφοράς, τη διαδρομή προς την προσθήκη, τη διαδρομή προς το αρχείο YAML με βάση το riscv-config κ.λπ.
  • Κατάλογος dut-plugin: Το RISCOF απαιτεί να παρέχεται το δοκιμασμένο μοντέλο DUT με τη μορφή προσθήκης Python. Ένα plug-in Python είναι στην πραγματικότητα ένα αρχείο Python που περιέχει ορισμένες τυπικές και καθορισμένες συναρτήσεις για την εκτέλεση δραστηριοτήτων μεταγλώττισης, εκτέλεσης και εξαγωγής υπογραφών. Το όνομα αυτού του αρχείου Python πρέπει να έχει το πρόθεμα riscof_ και πρέπει να υπάρχει στον κατάλογο dut-plugin. Μπορείτε να ανατρέξετε στην ενότητα του αρχείου προσθήκης Python για να μάθετε πώς να γράφετε αυτό το αρχείο Python.
    Αυτός ο κατάλογος πρέπει επίσης να περιέχει τα αρχεία YAML isa και πλατφόρμας που βασίζονται στο riscv-config, τα οποία παρέχουν τον ορισμό του DUT. Αυτά τα αρχεία YAML θα χρησιμοποιηθούν για το φιλτράρισμα των δοκιμών που πρέπει να εκτελεστούν στο DUT.
    Τέλος, πρέπει να υπάρχει ένας κατάλογος env στον κατάλογο dut-plugin, ο οποίος περιέχει αρχεία περιβάλλοντος, όπως το model_test.h, τα οποία απαιτούνται για τη μεταγλώττιση και εκτέλεση δοκιμών. Ανατρέξτε στην προδιαγραφή TestFormat για ορισμούς μακροεντολών που μπορούν να χρησιμοποιηθούν στο αρχείο model_test.h. Ο κατάλογος env μπορεί επίσης να περιέχει άλλα αρχεία, όπως σενάρια σύνδεσης και σενάρια μετα-επεξεργασίας που μπορεί να χρειάζονται οι χρήστες.
  • κατάλογος προσθηκών αναφοράς: Παρόμοια με την προσθήκη DUT, το RISCOF απαιτεί επίσης μια προσθήκη μοντέλου αναφοράς. Ο κατάλογος και η δομή του αρχείου είναι ίδια με αυτή του DUT. Ωστόσο, τα αρχεία YAML isa και πλατφόρμας δεν απαιτούνται επειδή το RISCOF θα επιλέγει πάντα αρχεία YAML για όλους τους σκοπούς από την προσθήκη DUT.
    Προκειμένου να απλοποιηθεί η λειτουργία, το RISCOF δημιουργεί τυπικά προκαθορισμένα πρότυπα DUT και μοντέλο αναφοράς για τους χρήστες μέσω εντολών ρύθμισης, όπως φαίνεται στην παρακάτω εικόνα:

$ riscof setup --dutname=spike

Η παραπάνω εντολή θα δημιουργήσει τα ακόλουθα αρχεία και καταλόγους στον τρέχοντα κατάλογο:

├──config.ini # αρχείο διαμόρφωσης για riscof
├──spike/ # Πρότυπα προσθηκών DUT
├── φαν
│ ├── link.ld # Σενάριο σύνδεσης DUT
│ └── model_test.h # αρχείο κεφαλίδας συγκεκριμένου DUT
├── riscof_spike.py # πρόσθετο DUT python
├── spike_isa.yaml # DUT ISA yaml με βάση το riscv-config
└── spike_platform.yaml # DUT Platform yaml με βάση το riscv-config
├──sail_cSim/ # πρότυπα προσθηκών αναφοράς
├── φαν
│ ├── link.ld # Σενάριο σύνδεσης αναφοράς
│ └── model_test.h # Αρχείο κεφαλίδας συγκεκριμένου μοντέλου αναφοράς
├── μέσα σε αυτό.py
└── riscof_sail_cSim.py # Πρόσθετο μοντέλο αναφοράς python.

Απλώς αλλάξτε την παραπάνω ακίδα στην προσθήκη C920 Φυσικά, πρέπει να τροποποιήσετε κάθε αρχείο διαμόρφωσης και αρχείο python.
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

Η εκτέλεση της ακόλουθης εντολής θα εξαγάγει τη λίστα περιπτώσεων από το test_list.yaml και θα εκτελέσει κάθε περίπτωση. Μπορείτε να σχολιάσετε μερικές από αυτές και να εκτελέσετε μόνο κάποιες περιπτώσεις.

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

Η εκτέλεση της ακόλουθης εντολής θα δημιουργήσει test_list.yaml και θα εκτελέσει παλινδρόμηση

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

10. Αποτελέσματα δοκιμών

Εισαγάγετε την περιγραφή της εικόνας εδώ
Ανάλυση αιτίας σφάλματος:
Ο πρώτος:
Εισαγάγετε την περιγραφή της εικόνας εδώ
Είναι επειδή παρουσιάστηκε ένα σφάλμα κατά τη μεταγλώττιση

    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

Ο δεύτερος τύπος:
Εισαγάγετε την περιγραφή της εικόνας εδώ
Απλώς το c920 δεν ενεργοποιεί μια συγκεκριμένη εντολή από προεπιλογή.
Εισαγάγετε την περιγραφή της εικόνας εδώ

11. rv64i_m/I/src/add-01.S κυματομορφή

Υπάρχει επίσης μια μακροεντολή στο model_test.h για dump signature και φινίρισμα προσομοίωσης

// 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

Αντιστοιχεί στο 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

Το περιεχόμενο του "riscof_work/rv64i_m/I/src/add-01.S/dut/DUT-c920.signature" έχει ως εξής:

e7d4b281
6f5ca309
00000000
00000000
c0000004
φφφφφφφ
fefffffe
φφφφφφφ
φφφφφφφ
007φφφφ
00000080
00000000
66666665
e6666666
00000001
00000000
0001ffff
80000000
10000001
00000000
φφφφφφφ

Εισαγάγετε την περιγραφή της εικόνας εδώ
Εισαγάγετε την περιγραφή της εικόνας εδώ