Partage de technologie

Tests de conformité pour l'architecture Riscv

2024-07-12

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

La raison pour laquelle nous nous concentrons directement sur riscv-arch-test est que le framework de test RISCOF utilise riscv-arch-test.
Insérer la description de l'image ici

1. Le test architectural

Un test architectural est un test unique qui représente le plus petit code de test pouvant être compilé et exécuté. Il est écrit en code assembleur et son produit est une signature de test. Un test architectural peut comprendre plusieurs cas de test.

2. Le pool de tests architecturaux RISC-V

Le pool de tests architecturaux RISC-V comprend tous les tests architecturaux approuvés qui peuvent être compilés par le cadre de test dans une suite de tests architecturaux. Les bibliothèques de tests d'architecture RISC-V doivent être indépendantes de la cible de test (et doivent donc s'exécuter correctement sur toute cible conforme). Veuillez noter que ces tests non fonctionnels ne remplacent pas la vérification ou le test de l'appareil.

2.1 Structure du pool de tests

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

Registre des caractéristiques du jeu d'instructions du processeur en mode machine (MISA)
misa = 0x800000000094112f
Représentation binaire : 100000000000000000000000000000000000000100101000001000100101111
Insérer la description de l'image ici

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/ privilège/ P_non ratifié/ Zfh/ Zfinx/ Zicond/ Zifencei/

3. La suite de tests d'architecture RISC-V

La suite de tests architecturaux RISC-V est un ensemble de tests sélectionnés dans le pool de tests architecturaux pour tester la conformité d'une configuration RISC-V spécifique. Les résultats des tests sont obtenus sous forme de signature de suite de tests. La sélection des tests est basée sur la configuration de l'assertion, la spécification, l'environnement d'exécution ou les exigences de la plate-forme de la cible. Un processeur ou un modèle de processeur conforme doit afficher la même signature Gold Reference Test Suite que la configuration spécifique testée.

4. Le cas de test

Les cas de test font partie des tests architecturaux et testent une seule fonction de la spécification.
Remarque : Un test peut contenir plusieurs cas de test, chacun ayant ses propres conditions d'inclusion de test (définies par le paramètre cond_str de la macro RVTEST_CASE).

4.1 Dénomination des tests

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

riscv-arch-test/riscv-test-suite/rv64i_m/I/src$ ls
add-01.S et-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
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. Infrastructure de test d'assemblage (prenez ./rv32i_m/I/src/add-01.S comme exemple)

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

Une brève explication du code assembleur ci-dessus est la suivante :

  1. En-tête pour inclure des commentaires

#Ce fichier d'assemblage teste l'instruction add de l'extension RISC-V I pour le covergroup add.

  1. Inclut les fichiers d'en-tête

#include « model_test.h »
#include « arch_test.h »

Chaque test doit inclure uniquement les fichiers d'en-tête suivants :
model_test.h - définit les macros spécifiques à la cible, y compris les macros obligatoires et facultatives : (par exemple RVMODEL_xxx)
arch_test.h - définit les macros de test prédéfinies, y compris les macros obligatoires et les macros facultatives : (telles que RVTEST_xxx)

  1. Régler le TVM du test

RVTEST_ISA(“RV32I”)

  1. Tester le code de démarrage spécifique à la cible

RVMODEL_BOOT

  1. Début de la routine d'initialisation GPR et du code de test

RVTEST_CODE_BEGIN

  1. Définir la chaîne et les conditions RVTEST_CASE

#ifdef CAS_TEST_1
// ce test est destiné aux appareils implémentant l'extension rv32I et nécessite l'activation de la compilation
// macro TEST_CASE_1. Ce test contribuera à l'étiquette de couverture « ajouter ».
RVTEST_CASE(0,“//vérifier ISA:=regex(.32.);vérifier ISA:=regex(.JE.);def TEST_CASE_1=Vrai;”,ajouter)

  1. Initialiser le pointeur vers la région de signature

RVTEST_SIGBASE( x16, signature_x16_1) // x16 pointera vers l'étiquette signature_x16_1 dans la région de signature

  1. Définir les cas de test
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. Changer le registre de base de signature
// 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. Terminer le test et arrêter la cible du test
RVTEST_CODE_END
RVMODEL_HALT
  • 1
  • 2
  1. Créer une section de données d'entrée de test
RVTEST_DATA_BEGIN
rvtest_data:
.word 0xbabecafe
RVTEST_DATA_END
  • 1
  • 2
  • 3
  • 4
  1. Créer une région de signature préchargée
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. La signature du cas de test

Une signature de scénario de test est représentée par une ou plusieurs valeurs. La valeur sera écrite dans la mémoire à partir de l'adresse spécifiée par RVMODEL_DATA_BEGIN et se terminant à l'adresse spécifiée par RVMODEL_DATA_END. Les signatures sont facilement générées à l'aide de la macro RVTEST_SIGUPD.

7. La signature du test

La signature de test est la valeur caractéristique générée par l'exécution du test architectural. Une signature de test peut être constituée de plusieurs signatures de scénario de test, préfixées par une ligne distincte contenant le nom du test et une valeur unique indiquant sa version. La cible de test est chargée d'extraire les valeurs de la mémoire et de les formater de manière appropriée, en utilisant les métadonnées fournies par le framework, à l'aide des macros RVMODEL_DATA_BEGIN et RVMODEL_DATA_END.La valeur de signature du scénario de test est écrite en lignes, en commençant par l'octet de poids fort à gauche, au format<hex_value> , où la longueur de la valeur sera de 32 bits (donc 8 caractères), alors que le calcul du test réel ne prend pas en compte la longueur de la valeur. Les fichiers doivent être stockés à partir de la valeur à l'adresse de signature la plus basse (c'est-à-dire de RVMODEL_DATA_BEGIN à RVMODEL_DATA_END). De plus, la signature doit toujours commencer sur une limite de 16 octets (128 bits) et sa taille doit être un multiple de 4 octets (c'est-à-dire qu'elle doit également se terminer sur une limite de 4 octets).

8. La signature de la suite de tests

Une signature de suite de tests est définie comme un ensemble de signatures de tests valides pour une suite de tests architecturaux donnée. Il représente la signature de test de la suite de tests architecturaux sélectionnée pour une configuration RISC-V spécifique.

9. Cadre de test RISCOF

RISCOF - Le cadre de compatibilité RISC-V est un cadre basé sur Python qui permet d'utiliser un ensemble d'ensembles de tests architecturaux RISC-V pour tester la compatibilité des cibles RISC-V (implémentations matérielles ou logicielles) avec la norme RISC-V Golden Reference. Modèle de sexe.
Insérer la description de l'image ici
Validateur de configuration RISC-V : RISCV-Config
Générateur de tests de conformité RISC-V : RISC-V CTG
Couverture ISA RISC-V : ISAC RISC-V
Pour que RISCOF puisse exécuter le test normalement, le contenu suivant doit être fourni :

  • config.ini : ce fichier est un fichier de configuration de base et suit la syntaxe ini. Ce fichier capturera des informations telles que : le nom du plugin DUT/référence, le chemin d'accès au plugin, le chemin d'accès au fichier YAML basé sur riscv-config, etc.
  • Répertoire dut-plugin : RISCOF nécessite que le modèle DUT testé soit fourni sous la forme d'un plug-in Python. Un plug-in Python est en fait un fichier Python qui contient certaines fonctions standard et définies pour effectuer des activités de compilation, d'exécution et d'extraction de signatures de tests. Le nom de ce fichier Python doit être préfixé par riscof_ et doit exister dans le répertoire dut-plugin. Vous pouvez vous référer à la section du fichier du plug-in Python pour savoir comment écrire ce fichier Python.
    Ce répertoire doit également contenir les fichiers isa et platform YAML basés sur riscv-config, qui fournissent la définition du DUT. Ces fichiers YAML serviront à filtrer les tests qui doivent être exécutés sur le DUT.
    Enfin, un répertoire env doit exister dans le répertoire dut-plugin, qui contient les fichiers d'environnement, tels que model_test.h, nécessaires à la compilation et à l'exécution des tests. Veuillez vous référer à la spécification TestFormat pour les définitions des macros pouvant être utilisées dans le fichier model_test.h. Le répertoire env peut également contenir d'autres fichiers, tels que des scripts d'éditeur de liens et des scripts de post-traitement dont les utilisateurs peuvent avoir besoin.
  • Répertoire du plugin de référence : similaire au plug-in DUT, RISCOF nécessite également un plug-in de modèle de référence. La structure des répertoires et des fichiers est la même que celle du DUT. Cependant, les fichiers YAML isa et platform ne sont pas requis car RISCOF sélectionnera toujours les fichiers YAML à toutes fins à partir du plug-in DUT.
    Afin de simplifier l'opération, RISCOF génère des modèles prédéfinis de DUT standard et de modèle de référence pour les utilisateurs via des commandes de configuration, comme le montre la figure suivante :

$ riscof configuration --dutname=spike

La commande ci-dessus générera les fichiers et répertoires suivants dans le répertoire actuel :

├──config.ini # fichier de configuration pour riscof
├──spike/ # Modèles de plugins DUT
├── env
│ ├── link.ld # script de liaison DUT
│ └── model_test.h # Fichier d'en-tête spécifique au DUT
├── riscof_spike.py # Plugin Python pour DUT
├── spike_isa.yaml # DUT ISA yaml basé sur riscv-config
└── spike_platform.yaml # Plateforme DUT yaml basée sur riscv-config
├──sail_cSim/ # modèles de plugins de référence
├── env
│ ├── link.ld # Script de lien de référence
│ └── model_test.h # Fichier d'en-tête spécifique au modèle de référence
├── initialisation.py
└── riscof_sail_cSim.py # Plugin Python de modèle de référence.

Remplacez simplement le pic ci-dessus par le plugin C920. Bien sûr, vous devez modifier chaque fichier de configuration et fichier 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

L'exécution de la commande suivante extraira la liste de cas de test_list.yaml et exécutera chaque cas. Vous pouvez en commenter certains et n'exécuter que certains cas.

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

L'exécution de la commande suivante générera test_list.yaml et exécutera la régression

riscof exécuter --config=config.ini
–suite=riscv-arch-test/riscv-test-suite/
–env=riscv-arch-test/riscv-test-suite/env

10. Résultats des tests

Insérer la description de l'image ici
Analyse de la cause de l'erreur :
La première:
Insérer la description de l'image ici
C'est parce qu'une erreur s'est produite lors de la compilation

    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

Deuxième type :
Insérer la description de l'image ici
C'est juste que c920 n'active pas une certaine commande par défaut.
Insérer la description de l'image ici

11. Forme d'onde rv64i_m/I/src/add-01.S

Il existe également une macro dans model_test.h pour la signature du dump et la simulation de finition.

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

Correspondant à 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

Le contenu de « riscof_work/rv64i_m/I/src/add-01.S/dut/DUT-c920.signature » ​​est le suivant :

e7d4b281
6f5ca309
00000000
00000000
c0000004
ffffffffff
fefffffe
ffffffffff
ffffffbf
007fffff
00000080
00000000
66666665
e6666666
00000001
00000000
0001ffff
80000000
10000001
00000000
fffffff

Insérer la description de l'image ici
Insérer la description de l'image ici