OpenCores
URL https://opencores.org/ocsvn/fwrisc/fwrisc/trunk

Subversion Repositories fwrisc

[/] [fwrisc/] [trunk/] [ve/] [fwrisc/] [tests/] [riscv-compliance/] [riscv-target/] [riscvOVPsim/] [compliance_io.h] - Rev 2

Compare with Previous | Blame | View Log

// RISC-V Compliance IO Test Header File
 
/*
 * Copyright (c) 2005-2018 Imperas Software Ltd., www.imperas.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
 
 
//
// In general the following registers are reserved
// ra, a0, t0, t1
//
 
#ifndef _COMPLIANCE_IO_H
#define _COMPLIANCE_IO_H
 
#define RVTEST_IO_QUIET
 
//-----------------------------------------------------------------------
// RV IO Macros (Character transfer by custom instruction)
//-----------------------------------------------------------------------
#define STRINGIFY(x) #x
#define TOSTRING(x)  STRINGIFY(x)
 
#define RVTEST_CUSTOM1 0x0005200B
 
#ifdef RVTEST_IO_QUIET
 
#define RVTEST_IO_INIT
#define RVTEST_IO_WRITE_STR(_STR)
#define RVTEST_IO_CHECK()
#define RVTEST_IO_ASSERT_GPR_EQ(_R, _I)
#define RVTEST_IO_ASSERT_SFPR_EQ(_F, _R, _I)
#define RVTEST_IO_ASSERT_DFPR_EQ(_D, _R, _I)
 
#else
 
#define LOCAL_IO_WRITE_GPR(_R)                                          \
    mv          a0, _R;                                                 \
    jal         FN_WriteA0;
 
#define LOCAL_IO_WRITE_FPR(_F)                                          \
    fmv.x.s     a0, _F;                                                 \
    jal         FN_WriteA0;
 
#define LOCAL_FPD_WRITE_REG(_V1, _V2)                                   \
    mv          a0, _V1;                                                \
    jal         FN_WriteA0; \
    mv          a0, _V2; \
    jal         FN_WriteA0; \
 
#define LOCAL_IO_PUTC(_R)                                               \
    .word RVTEST_CUSTOM1;                                               \
 
#define RVTEST_IO_INIT
 
// Assertion violation: file file.c, line 1234: (expr)
// _R = GPR
// _I = Immediate
#define RVTEST_IO_ASSERT_GPR_EQ(_R, _I)                                 \
    li          t0, _I;                                                 \
    beq         _R, t0, 20002f;                                         \
    RVTEST_IO_WRITE_STR("Assertion violation: file ");                  \
    RVTEST_IO_WRITE_STR(__FILE__);                                      \
    RVTEST_IO_WRITE_STR(", line ");                                     \
    RVTEST_IO_WRITE_STR(TOSTRING(__LINE__));                            \
    RVTEST_IO_WRITE_STR(": ");                                          \
    RVTEST_IO_WRITE_STR(# _R);                                          \
    RVTEST_IO_WRITE_STR("(");                                           \
    LOCAL_IO_WRITE_GPR(_R);                                             \
    RVTEST_IO_WRITE_STR(") != ");                                       \
    RVTEST_IO_WRITE_STR(# _I);                                          \
    RVTEST_IO_WRITE_STR("\n");                                          \
    li TESTNUM, 100;                                                    \
    RVTEST_FAIL;                                                        \
20002:
 
// _F = FPR
// _C = GPR
// _I = Immediate
#define RVTEST_IO_ASSERT_SFPR_EQ(_F, _C, _I) \
    fmv.x.s     t0, _F; \
    beq         _C, t0, 20003f;                                         \
    RVTEST_IO_WRITE_STR("Assertion violation: file ");                  \
    RVTEST_IO_WRITE_STR(__FILE__);                                      \
    RVTEST_IO_WRITE_STR(", line ");                                     \
    RVTEST_IO_WRITE_STR(TOSTRING(__LINE__));                            \
    RVTEST_IO_WRITE_STR(": ");                                          \
    RVTEST_IO_WRITE_STR(# _F);                                          \
    RVTEST_IO_WRITE_STR("(");                                           \
    LOCAL_IO_WRITE_FPR(_F);                                             \
    RVTEST_IO_WRITE_STR(") != ");                                       \
    RVTEST_IO_WRITE_STR(# _I);                                          \
    RVTEST_IO_WRITE_STR("\n");                                          \
    li TESTNUM, 100;                                                    \
    RVTEST_FAIL;                                                        \
20003:
 
// _D = DFPR
// _R = GPR
// _I = Immediate
#define RVTEST_IO_ASSERT_DFPR_EQ(_D, _R, _I) \
    fmv.x.d     t0, _D; \
    beq         _R, t0, 20005f;                                         \
    RVTEST_IO_WRITE_STR("Assertion violation: file ");                  \
    RVTEST_IO_WRITE_STR(__FILE__);                                      \
    RVTEST_IO_WRITE_STR(", line ");                                     \
    RVTEST_IO_WRITE_STR(TOSTRING(__LINE__));                            \
    RVTEST_IO_WRITE_STR(": ");                                          \
    RVTEST_IO_WRITE_STR(# _D);                                          \
    RVTEST_IO_WRITE_STR("(");                                           \
    LOCAL_FPD_WRITE_REG(_D);                                            \
    RVTEST_IO_WRITE_STR(") != ");                                       \
    RVTEST_IO_WRITE_STR(# _I);                                          \
    RVTEST_IO_WRITE_STR("\n");                                          \
    li TESTNUM, 100;                                                    \
    RVTEST_FAIL;                                                        \
20005:
 
#define RVTEST_IO_WRITE_STR(_STR)                                       \
    .section .data.string;                                              \
20001:                                                                  \
    .string _STR;                                                       \
    .section .text.init;                                                \
    la a0, 20001b;                                                      \
    jal FN_WriteStr;
 
// generate assertion listing
#define RVTEST_IO_CHECK()                                               \
    li zero, -1;                                                        \
 
//
// FN_WriteStr: Uses a0, t0
//
FN_WriteStr:
    mv          t0, a0;
10000:
    lbu         a0, (t0);
    addi        t0, t0, 1;
    beq         a0, zero, 10000f;
    LOCAL_IO_PUTC(a0);
    j           10000b;
10000:
    ret;
 
//
// FN_WriteA0: write register a0(x10) (destroys a0(x10), t0-t2(x5-x7))
//
FN_WriteA0:
        mv          t0, a0
        // determine architectural register width
        li          a0, -1
        srli        a0, a0, 31
        srli        a0, a0, 1
        bnez        a0, FN_WriteA0_64
 
FN_WriteA0_32:
        // reverse register when xlen is 32
        li          t1, 8
10000:  slli        t2, t2, 4
        andi        a0, t0, 0xf
        srli        t0, t0, 4
        or          t2, t2, a0
        addi        t1, t1, -1
        bnez        t1, 10000b
        li          t1, 8
        j           FN_WriteA0_common
 
FN_WriteA0_64:
        // reverse register when xlen is 64
        li          t1, 16
10000:  slli        t2, t2, 4
        andi        a0, t0, 0xf
        srli        t0, t0, 4
        or          t2, t2, a0
        addi        t1, t1, -1
        bnez        t1, 10000b
        li          t1, 16
 
FN_WriteA0_common:
        // write reversed characters
        li          t0, 10
10000:  andi        a0, t2, 0xf
        blt         a0, t0, 10001f
        addi        a0, a0, 'a'-10
        j           10002f
10001:  addi        a0, a0, '0'
10002:  LOCAL_IO_PUTC(a0)
        srli        t2, t2, 4
        addi        t1, t1, -1
        bnez        t1, 10000b
        ret
 
#endif // RVTEST_IO_QUIET
 
#endif // _COMPLIANCE_IO_H
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.