Berbagi teknologi

Pengujian kepatuhan untuk arsitektur Riscv

2024-07-12

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

Alasan mengapa kami fokus langsung pada riscv-arch-test adalah karena kerangka pengujian RISCOF menggunakan riscv-arch-test.
Masukkan deskripsi gambar di sini

1. Uji arsitektur

Pengujian arsitektur adalah pengujian tunggal yang mewakili kode pengujian terkecil yang dapat dikompilasi dan dijalankan. Itu ditulis dalam kode perakitan dan produknya adalah tanda tangan uji. Pengujian arsitektur dapat terdiri dari beberapa kasus pengujian.

2. Kumpulan pengujian arsitektur RISC-V

Kumpulan pengujian arsitektur RISC-V terdiri dari semua pengujian arsitektur yang disetujui yang dapat dikompilasi oleh kerangka pengujian ke dalam rangkaian pengujian arsitektur. Pustaka pengujian arsitektur RISC-V harus merupakan target pengujian agnostik (dan oleh karena itu harus berjalan dengan benar pada target yang sesuai). Harap dicatat bahwa pengujian non-fungsional ini bukan pengganti verifikasi atau pengujian perangkat.

2.1 Struktur kolam uji

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

Register Karakteristik Set Instruksi Prosesor Mode Mesin (MISA)
misa = 0x800000000094112f
Representasi biner: 100000000000000000000000000000000000000100101000001000100101111
Masukkan deskripsi gambar di sini

riscv-arch-test/paket-pengujian-riscv$ 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/ hak istimewa/ P_tidak diratifikasi/ Zfh/ Zfinx/ Zicond/ Zifencei/

3. Rangkaian uji arsitektur RISC-V

Rangkaian pengujian arsitektur RISC-V adalah serangkaian pengujian yang dipilih dari kumpulan pengujian arsitektur untuk menguji kesesuaian konfigurasi RISC-V tertentu. Hasil pengujian diperoleh berupa tanda tangan rangkaian pengujian. Pemilihan pengujian didasarkan pada konfigurasi pernyataan target, spesifikasi, lingkungan eksekusi, atau persyaratan platform. Prosesor atau model prosesor yang sesuai harus menampilkan tanda tangan Gold Referrence Test Suite yang sama dengan konfigurasi spesifik yang sedang diuji.

4. Kasus uji

Kasus uji adalah bagian dari pengujian arsitektur dan hanya menguji satu fungsi dari spesifikasi.
Catatan: Sebuah pengujian dapat berisi beberapa kasus pengujian, yang masing-masing memiliki kondisi penyertaan pengujiannya sendiri (ditentukan oleh parameter cond_str dari makro RVTEST_CASE).

4.1 Penamaan tes

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

riscv-arch-test/riscv-test-suite/rv64i_m/I/src$ ls
tambahkan-01.S dan-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 sub-01.S xori-01.S
tambahkan-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. Infrastruktur Uji Perakitan (ambil ./rv32i_m/I/src/add-01.S sebagai contoh)

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

Penjelasan singkat kode assembly di atas adalah sebagai berikut:

  1. Header untuk menyertakan komentar

#Berkas assembly ini menguji instruksi penambahan ekstensi RISC-V I untuk penambahan covergroup.

  1. Termasuk file header

#sertakan “model_test.h”
#sertakan “arch_test.h”

Setiap pengujian harus menyertakan hanya file header berikut:
model_test.h - mendefinisikan makro spesifik target, termasuk makro wajib dan opsional: (misalnya RVMODEL_xxx)
arch_test.h - mendefinisikan makro pengujian yang telah ditentukan sebelumnya, termasuk makro yang diperlukan dan makro opsional: (seperti RVTEST_xxx)

  1. Mengatur TVM pengujian

RVTEST_ISA("RV32I")

  1. Uji target kode boot tertentu

MODEL_RVM_BOOT

  1. Awal dari rutinitas inisialisasi GPR dan kode pengujian

KODE_RVTEST_MULAI

  1. Tentukan string dan kondisi RVTEST_CASE

#ifdef KASUS_UJI_1
// tes ini ditujukan untuk perangkat yang menerapkan ekstensi rv32I dan memerlukan pengaktifan kompilasi
// macro TEST_CASE_1. Pengujian ini akan berkontribusi pada label cakupan “tambah”.
RVTEST_CASE(0,“//periksa ISA:=regex(.32.);periksa ISA:=regex(.SAYA.);def TEST_CASE_1=Benar;”,tambahkan)

  1. Inisialisasi penunjuk ke wilayah tanda tangan

RVTEST_SIGBASE( x16,signature_x16_1) // x16 akan menunjuk ke label signature_x16_1 di wilayah tanda tangan

  1. Tentukan kasus pengujian
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. Ubah register dasar tanda tangan
// 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. Akhiri pengujian dan hentikan target pengujian
RVTEST_CODE_END
RVMODEL_HALT
  • 1
  • 2
  1. Buat bagian data input pengujian
RVTEST_DATA_BEGIN
rvtest_data:
.word 0xbabecafe
RVTEST_DATA_END
  • 1
  • 2
  • 3
  • 4
  1. Buat wilayah tanda tangan yang sudah dimuat sebelumnya
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. Tanda tangan kasus uji

Tanda tangan kasus uji diwakili oleh satu atau beberapa nilai. Nilai akan ditulis ke dalam memori dimulai dari alamat yang ditentukan oleh RVMODEL_DATA_BEGIN dan berakhir pada alamat yang ditentukan oleh RVMODEL_DATA_END. Tanda tangan mudah dibuat menggunakan makro RVTEST_SIGUPD.

7. Tanda tangan uji

Tanda tangan pengujian adalah nilai karakteristik yang dihasilkan oleh pengujian arsitektur yang dijalankan. Tanda tangan pengujian dapat terdiri dari beberapa tanda tangan kasus uji, diawali dengan baris terpisah yang berisi nama pengujian dan nilai unik yang menunjukkan versinya. Target pengujian bertanggung jawab untuk mengekstraksi nilai dari memori dan memformatnya dengan tepat, menggunakan metadata yang disediakan oleh kerangka kerja, menggunakan makro RVMODEL_DATA_BEGIN dan RVMODEL_DATA_END.Nilai tanda tangan kasus uji ditulis dalam baris, dimulai dari byte paling signifikan di sebelah kiri, dalam format<hex_value> , dimana panjang nilainya adalah 32 bit (jadi 8 karakter), sedangkan perhitungan pengujian sebenarnya tidak memperhitungkan panjang nilai. File harus disimpan mulai dari nilai di alamat tanda tangan terendah (yaitu, dari RVMODEL_DATA_BEGIN hingga RVMODEL_DATA_END). Selain itu, tanda tangan harus selalu dimulai pada batas 16-byte (128-bit), dan ukuran tanda tangan harus kelipatan 4 byte (artinya, tanda tangan juga harus diakhiri pada batas 4-byte).

8. Tanda tangan rangkaian pengujian

Tanda tangan rangkaian pengujian didefinisikan sebagai sekumpulan tanda tangan pengujian yang valid untuk rangkaian pengujian arsitektur tertentu. Ini mewakili tanda tangan pengujian dari rangkaian pengujian arsitektur yang dipilih untuk konfigurasi RISC-V tertentu.

9. Kerangka pengujian RISCOF

RISC-V - Kerangka Kompatibilitas RISC-V adalah kerangka kerja berbasis Python yang memungkinkan penggunaan serangkaian set pengujian arsitektur RISC-V untuk menguji target RISC-V (implementasi perangkat keras atau perangkat lunak) untuk kompatibilitas dengan Referensi Emas RISC-V standar Model seks.
Masukkan deskripsi gambar di sini
Validator Konfigurasi RISC-V : RISCV-Config
Generator Uji Kepatuhan RISC-V: RISC-V CTG
Cakupan ISA RISC-V: ISAC RISC-V
Agar RISCOF dapat menjalankan pengujian secara normal, konten berikut perlu disediakan:

  • config.ini: File ini adalah file konfigurasi dasar yang mengikuti sintaks ini. File ini akan menangkap informasi seperti: nama plugin DUT/referensi, jalur ke plugin, jalur ke file YAML berdasarkan riscv-config, dll.
  • direktori dut-plugin: RISCOF mengharuskan model DUT yang diuji disediakan dalam bentuk plug-in Python. Plug-in Python sebenarnya adalah file Python yang berisi fungsi standar dan terdefinisi tertentu untuk melakukan kompilasi pengujian, eksekusi, dan aktivitas ekstraksi tanda tangan. Nama file Python ini harus diawali dengan riscof_ dan harus ada di direktori dut-plugin. Anda dapat merujuk ke bagian file plugin Python untuk mempelajari cara menulis file Python ini.
    Direktori ini juga perlu berisi file isa dan platform YAML berdasarkan riscv-config, yang memberikan definisi DUT. File YAML ini akan digunakan untuk memfilter pengujian yang perlu dijalankan di DUT.
    Terakhir, direktori env harus ada di direktori dut-plugin, yang berisi file lingkungan, seperti model_test.h, yang diperlukan untuk mengkompilasi dan menjalankan pengujian. Silakan merujuk ke spesifikasi TestFormat untuk definisi makro yang dapat digunakan dalam file model_test.h. Direktori env mungkin juga berisi file lain, seperti skrip linker dan skrip pasca-pemrosesan yang mungkin diperlukan pengguna.
  • direktori plugin referensi: Mirip dengan plug-in DUT, RISCOF juga memerlukan plug-in model referensi. Direktori dan struktur file sama dengan DUT. Namun, file isa dan platform YAML tidak diperlukan karena RISCOF akan selalu memilih file YAML untuk semua tujuan dari plug-in DUT.
    Untuk menyederhanakan pengoperasian, RISCOF menghasilkan DUT standar dan templat preset model referensi untuk pengguna melalui perintah pengaturan, seperti yang ditunjukkan pada gambar berikut:

Pengaturan $ riscof --dutname=spike

Perintah di atas akan menghasilkan file dan direktori berikut di direktori saat ini:

├──config.ini # berkas konfigurasi untuk riscof
├──spike/ # Templat plugin DUT
├── lingkungan
│ ├── link.ld # Skrip penghubung DUT
│ └── model_test.h # Berkas header khusus DUT
├── riscof_spike.py # Plugin DUT python
├── spike_isa.yaml # DUT ISA yaml berdasarkan riscv-config
└── spike_platform.yaml # DUT Platform yaml berdasarkan riscv-config
├──sail_cSim/ # templat plugin referensi
├── lingkungan
│ ├── link.ld # Referensi skrip penghubung
│ └── model_test.h # Referensi file header spesifik model
├── inisiasiBahasa Indonesia: .py
└── riscof_sail_cSim.py # Model referensi plugin python.

Ubah saja spike di atas ke plugin C920. Tentunya Anda perlu memodifikasi setiap file konfigurasi dan file 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

Menjalankan perintah berikut akan mengekstrak daftar kasus dari test_list.yaml dan menjalankan setiap kasus. Anda dapat mengomentari beberapa kasus dan hanya menjalankan beberapa kasus.

riscof jalankan --config=config.ini
–suite=riscv-arch-test/riscv-test-suite/
–env=riscv-arch-test/riscv-test-suite/env
–file uji=riscof_work/daftar_uji.yaml

Menjalankan perintah berikut akan menghasilkan test_list.yaml dan menjalankan regresi

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

10. Hasil tes

Masukkan deskripsi gambar di sini
Analisis penyebab kesalahan:
Pertama:
Masukkan deskripsi gambar di sini
Itu karena terjadi kesalahan saat kompilasi

    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

Tipe kedua:
Masukkan deskripsi gambar di sini
Hanya saja c920 tidak mengaktifkan perintah tertentu secara default.
Masukkan deskripsi gambar di sini

11. bentuk gelombang rv64i_m/I/src/add-01.S

Ada juga makro di model_test.h untuk tanda tangan dump dan simulasi penyelesaian

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

Sesuai dengan 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

Isi “riscof_work/rv64i_m/I/src/add-01.S/dut/DUT-c920.signature” adalah sebagai berikut:

e7d4b281
6f5ca309
00000000
00000000
c0000004
ffffffff
feffffff
ffffffff
aduh sayang sekali
007ffffff
00000080
00000000
66666665
e6666666
00000001
00000000
0001ffff
80000000
10000001
00000000
fffffff

Masukkan deskripsi gambar di sini
Masukkan deskripsi gambar di sini