प्रौद्योगिकी साझेदारी

Riscv आर्किटेक्चरस्य अनुपालनपरीक्षणम्

2024-07-12

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

वयं प्रत्यक्षतया riscv-arch-test इत्यत्र ध्यानं दत्तवन्तः इति कारणं अस्ति यत् RISCOF test framework riscv-arch-test इत्यस्य उपयोगं करोति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

1. वास्तुपरीक्षा

वास्तुपरीक्षा एकः परीक्षणः अस्ति यः लघुतमं परीक्षणसङ्केतं प्रतिनिधियति यत् संकलितं चालयितुं च शक्यते । इदं असेंबली कोड् इत्यत्र लिखितम् अस्ति तथा च तस्य उत्पादः परीक्षणहस्ताक्षरम् अस्ति । वास्तुपरीक्षायां बहुविधपरीक्षाप्रकरणाः भवितुं शक्नुवन्ति ।

2. RISC-V वास्तुपरीक्षणकुण्डः

RISC-V वास्तुपरीक्षणकुण्डे सर्वेषां अनुमोदितवास्तुपरीक्षापरीक्षाः सन्ति येषां संकलनं परीक्षणरूपरेखाद्वारा वास्तुपरीक्षणसमूहे कर्तुं शक्यते RISC-V आर्किटेक्चर परीक्षणपुस्तकालयाः परीक्षणलक्ष्य अज्ञेयवादीः भवितुमर्हन्ति (अतः कस्मिन् अपि अनुरूपलक्ष्ये सम्यक् चालितव्याः) । कृपया ज्ञातव्यं यत् एतत् अकार्यात्मकपरीक्षणं सत्यापनस्य अथवा उपकरणपरीक्षणस्य विकल्पः नास्ति ।

२.१ परीक्षणकुण्डसंरचना

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)
मिसा = 0x800000000094112च
द्विचक्रीय प्रतिनिधित्व: 100000000000000000000000000000000000000000100100100010010010010101111
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

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/ विशेषाधिकार/ P_unratified/ Zfh/ Zfinx/ Zicond/ Zifencei/

3. RISC-V वास्तुपरीक्षणसमूहः

RISC-V वास्तुपरीक्षणसमूहः विशिष्टस्य RISC-V विन्यासस्य अनुरूपतायाः परीक्षणार्थं वास्तुपरीक्षणपूलतः चयनितपरीक्षाणां समुच्चयः अस्ति । परीक्षणपरिणामाः परीक्षणसूटहस्ताक्षररूपेण प्राप्यन्ते । परीक्षणचयनं लक्ष्यस्य प्रतिपादनविन्यासस्य, विनिर्देशस्य, निष्पादनवातावरणस्य, अथवा मञ्चस्य आवश्यकतायाः आधारेण भवति । अनुरूपः प्रोसेसरः अथवा प्रोसेसर मॉडलः परीक्षितस्य विशिष्टविन्यासस्य समानं Gold Reference Test Suite हस्ताक्षरं प्रदर्शयितुं अर्हति ।

4. परीक्षणप्रकरणम्

परीक्षणप्रकरणाः वास्तुपरीक्षणस्य भागाः भवन्ति तथा च विनिर्देशस्य केवलमेकं कार्यं परीक्षन्ते ।
नोट्: एकस्मिन् परीक्षणे बहुविधपरीक्षाप्रकरणाः भवितुं शक्नुवन्ति, येषु प्रत्येकस्य स्वकीयाः परीक्षणसमावेशशर्ताः सन्ति (RVTEST_CASE मैक्रो इत्यस्य cond_str पैरामीटर् द्वारा परिभाषिताः) ।

४.१ परीक्षणनामकरणम्

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

riscv-arch-test / riscv-test-suite / rv64i_m / मैं / src $ ls
add-01.S and-01.S bge-01.S bne-01.S lb-align-01.S lhu-align-01.S गलत संरेखण1-जलर-01.S sd-संरेखित-01.S slliw- 01.S sltiu-01.S sraiw-01.S srliw-01.S स्व-संरेखित-01.S
अड्डि-०१.S अण्डि-०१.S बगेउ-०१.S बाड़-०१.S lbu-संरेखित-०१.S लुई-०१.S or-01.S श-संरेखित-०१.S sllw-०१.S sltu -01.S sraw-01.S srlw-01.S xor-01.S
addiw-01.S auipc-01.S blt-01.S जल-01.S ld-संरेखित-01.S lw-संरेखित-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-संरेखित-01.S lwu-संरेखित-01.S sb-संरेखित-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. टिप्पणीं समावेशयितुं शीर्षकम्

#इयं असेंबली सञ्चिका add ​​covergroup कृते RISC-V I विस्तारस्य add निर्देशस्य परीक्षणं करोति ।

  1. शीर्षकसञ्चिकाः समाविष्टाः सन्ति

#include “model_test.h” इति ।
#include “arch_test.h” इति ।

प्रत्येकं परीक्षणे केवलं निम्नलिखितशीर्षकसञ्चिकाः समाविष्टाः भवेयुः:
model_test.h - लक्ष्य-विशिष्टानि मैक्रोः परिभाषयति, यत्र आवश्यकाः वैकल्पिकाः च मैक्रोः सन्ति: (उदा. RVMODEL_xxx)
arch_test.h - पूर्वनिर्धारितपरीक्षणमैक्रो परिभाषयति, यत्र आवश्यकाः मैक्रोः वैकल्पिकाः मैक्रोः च सन्ति: (यथा RVTEST_xxx)

  1. परीक्षणस्य TVM सेट् कुर्वन्तु

RVTEST_ISA (“आरवी32I”) 1.1.

  1. लक्ष्यविशिष्टं बूट-कोड् परीक्षणं कुर्वन्तु

RVMODEL_BOOT इति

  1. GPR आरम्भ-दिनचर्यायाः आरम्भः परीक्षणसङ्केतः च

RVTEST_CODE_BEGIN इति

  1. RVTEST_CASE स्ट्रिंग् तथा कण्डिशन् परिभाषयन्तु

# ifdef परीक्षण_प्रकरण_1
// इदं परीक्षणं rv32I विस्तारं कार्यान्वितं उपकरणानां कृते अभिप्रेतम् अस्ति तथा च संकलनं सक्षमीकरणस्य आवश्यकता वर्तते
// मैक्रो TEST_CASE_1. इयं परीक्षणं “add” कवरेजलेबलस्य योगदानं करिष्यति ।
RVTEST_CASE (0,“//ISA:=regex (.32.);जाँच ISA:=regex (.अहम्‌।);def TEST_CASE_1=सत्य;”,जोडतु)

  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 मैक्रोस् इत्यस्य उपयोगेन उत्तरदायी भवतिपरीक्षणप्रकरणहस्ताक्षरमूल्यं पङ्क्तौ लिख्यते, वामे महत्त्वपूर्णबाइट् तः आरभ्य, प्रारूपे<hex_value> , यत्र मूल्यस्य दीर्घता ३२ बिट् (अतः ८ वर्णाः) भविष्यति, यदा तु वास्तविकपरीक्षागणना मूल्यस्य दीर्घतां न गृह्णाति । सञ्चिकाः हस्ताक्षरस्य न्यूनतमपते मूल्यात् आरभ्य (अर्थात् RVMODEL_DATA_BEGIN तः RVMODEL_DATA_END पर्यन्तं) संग्रहीतव्याः । तदतिरिक्तं हस्ताक्षरं सर्वदा १६-बाइट् (१२८-बिट्) सीमायां आरभ्यते, हस्ताक्षरस्य आकारः च ४ बाइट्-गुणकः भवेत् (अर्थात् ४-बाइट्-सीमायां अपि समाप्तः भवेत्)

8. परीक्षणसूटहस्ताक्षरम्

परीक्षणसमूहस्य हस्ताक्षरं परीक्षणहस्ताक्षराणां समुच्चयरूपेण परिभाषितं भवति यत् दत्तवास्तुशिल्पपरीक्षासमूहस्य कृते मान्यं भवति । इदं विशिष्टस्य RISC-V विन्यासस्य कृते चयनितस्य वास्तुशिल्पपरीक्षासमूहस्य परीक्षणहस्ताक्षरं प्रतिनिधियति ।

9. RISCOF परीक्षणरूपरेखा

RISCOF - RISC-V संगततारूपरेखा एकः पायथन्-आधारितः रूपरेखा अस्ति यः मानक RISC-V स्वर्णसन्दर्भेण सह संगततायाः कृते RISC-V लक्ष्यस्य (हार्डवेयर अथवा सॉफ्टवेयर कार्यान्वयनम्) परीक्षणार्थं RISC-V वास्तुपरीक्षणसमूहस्य समुच्चयस्य उपयोगं सक्षमं करोति मॉडल सेक्स।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
RISC-V विन्यास प्रमाणक : RISCV-Config
RISC-V अनुपालन परीक्षण जनरेटर : RISC-V CTG
RISC-V ISA कवरेज : RISC-V ISAC
RISCOF इत्यस्य परीक्षणं सामान्यतया चालयितुं निम्नलिखितसामग्री प्रदातव्या:

  • config.ini: एषा सञ्चिका मूलभूतविन्याससञ्चिका अस्ति या ini वाक्यविन्यासस्य अनुसरणं करोति । इयं सञ्चिका सूचनां गृह्णीयात् यथा: DUT/सन्दर्भप्लगिन् इत्यस्य नाम, प्लगिन् इत्यस्य मार्गः, riscv-config इत्यस्य आधारेण YAML सञ्चिकायाः ​​मार्गः इत्यादयः ।
  • dut-plugin निर्देशिका: RISCOF इत्यस्य आवश्यकता अस्ति यत् परीक्षितं DUT मॉडलं Python प्लग-इन् इत्यस्य रूपेण प्रदत्तं भवेत् । पायथन् प्लग-इन् वस्तुतः पायथन् सञ्चिका अस्ति यस्मिन् परीक्षणसंकलनं, निष्पादनं, हस्ताक्षरनिष्कासनं च कर्तुं कतिपयानि मानकानि परिभाषितानि च कार्याणि सन्ति । अस्याः पायथन् सञ्चिकायाः ​​नाम riscof_ इत्यनेन उपसर्गं करणीयम् अस्ति तथा च dut-plugin निर्देशिकायां भवितव्यम् । एतत् Python सञ्चिकां कथं लिखितव्यम् इति ज्ञातुं भवान् Python प्लग-इन् सञ्चिकाविभागं द्रष्टुं शक्नोति ।
    अस्मिन् निर्देशिकायां riscv-config इत्यस्य आधारेण isa तथा platform YAML सञ्चिकाः अपि समाविष्टाः भवितुम् अर्हन्ति, ये DUT इत्यस्य परिभाषां प्रददति । एतानि YAML सञ्चिकाः DUT इत्यत्र चालनीयानि परीक्षणानि छानयितुं उपयुज्यन्ते ।
    अन्ते dut-plugin निर्देशिकायां env निर्देशिकायाः ​​अस्तित्वस्य आवश्यकता वर्तते, यस्मिन् वातावरणसञ्चिकाः सन्ति, यथा model_test.h, ये परीक्षणानां संकलनार्थं चालनार्थं च आवश्यकाः सन्ति । कृपया model_test.h सञ्चिकायां उपयोक्तुं शक्यमाणानां मैक्रोस् परिभाषाणां कृते TestFormat विनिर्देशं पश्यन्तु । env निर्देशिकायां अन्यसञ्चिकाः अपि भवितुम् अर्हन्ति, यथा लिङ्कर् स्क्रिप्ट्, पोस्ट-प्रोसेसिंग् स्क्रिप्ट् च येषां आवश्यकता उपयोक्तृभ्यः भवितुम् अर्हति ।
  • reference-plugin निर्देशिका: DUT प्लग-इन् इत्यस्य सदृशं RISCOF इत्यस्य अपि सन्दर्भ-प्रतिरूपस्य प्लग-इन् इत्यस्य आवश्यकता भवति । निर्देशिका सञ्चिकासंरचना च DUT इत्यस्य समाना अस्ति । परन्तु isa तथा platform YAML सञ्चिकानां आवश्यकता नास्ति यतोहि RISCOF सर्वदा DUT प्लग-इन् तः सर्वेषां प्रयोजनानां कृते YAML सञ्चिकाः चयनं करिष्यति ।
    संचालनं सरलीकर्तुं RISCOF सेट् आदेशानां माध्यमेन उपयोक्तृणां कृते मानक DUT तथा सन्दर्भप्रतिरूपं पूर्वनिर्धारितं टेम्पलेट् जनयति, यथा निम्नलिखितचित्रे दर्शितम् अस्ति:

$ riscof सेटअप --dutname = स्पाइक

उपरिष्टात् आदेशः वर्तमाननिर्देशिकायां निम्नलिखितसञ्चिकाः निर्देशिकाश्च जनयिष्यति ।

├──config.ini # riscof कृते विन्याससञ्चिका
├──spike/ # DUT प्लगइन टेम्पलेट्स
├── env
│ ├── link.ld # DUT लिंकर स्क्रिप्ट
│ └── model_test.h # DUT विशिष्टशीर्षकसञ्चिका
├── riscof_spike.py # DUT पायथन प्लगइन
├── spike_isa.yaml # DUT ISA riscv-config इत्यस्य आधारेण yaml
└── spike_platform.yaml # DUT riscv-config इत्यस्य आधारेण मञ्चः yaml
├──sail_cSim/ # सन्दर्भ प्लगइन टेम्पलेट्स
├── env
│ ├── link.ld # सन्दर्भ लिङ्कर लिपि
│ └── model_test.h # सन्दर्भ मॉडलविशिष्टशीर्षकसञ्चिका
├── init.प्य्
└── riscof_sail_cSim.py # सन्दर्भ मॉडल पायथन प्लगइन।

केवलं उपरिष्टात् स्पाइकं C920 प्लगिन् मध्ये परिवर्तयन्तु अवश्यं, भवद्भिः प्रत्येकं विन्याससञ्चिकां पायथन् सञ्चिकां च परिवर्तयितुं आवश्यकम् ।
ग९२०_इसा.यम्ल

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_प्लेटफॉर्म.यम्ल

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 तः case list निष्कास्य प्रत्येकं case चालयितुं शक्नुवन्ति तेषु केचन टिप्पणीं कर्तुं शक्नुवन्ति तथा च केवलं केचन cases चालयितुं शक्नुवन्ति ।

riscof चालयन्तु --config=config.ini
–suite=riscv-arch-test/riscv-test-suite/ 1.1.1.1.
–env=riscv-arch-test/riscv-test-suite/env
–testfile = riscof_work/परीक्षण_सूची.yaml

निम्नलिखित आदेशं निष्पादयन् test_list.yaml उत्पन्नं भविष्यति तथा च प्रतिगमनं चालयिष्यति

riscof चालयन्तु --config=config.ini
–suite=riscv-arch-test/riscv-test-suite/ 1.1.1.1.
–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 इत्यस्मिन् मैक्रो अपि अस्ति

// 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” इत्यस्य सामग्री निम्नलिखितरूपेण अस्ति ।

ई७ड४ख२८१
६च५का३०९
00000000
00000000
ग0000004
ffffffff
फेफ्फ्फे
ffffffff
ffffffbf
००७fffff इति
00000080
00000000
66666665
ई६६६६६६६
00000001
00000000
0001ffff
80000000
10000001
00000000
ffffffeff

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु