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

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [cpu_fnc_plugin/] [cpu_riscv_func.h] - Rev 4

Compare with Previous | Blame | View Log

/**
 * @file
 * @copyright  Copyright 2016 GNSS Sensor Ltd. All right reserved.
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
 * @brief      CPU functional simlator class definition.
 */
 
#ifndef __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
#define __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
 
#include <riscv-isa.h>
#include "instructions.h"
#include "generic/cpu_generic.h"
#include "coreservices/icpuriscv.h"
#include "coreservices/isocinfo.h"
 
namespace debugger {
 
class CpuRiver_Functional : public CpuGeneric,
                            public ICpuRiscV {
 public:
    explicit CpuRiver_Functional(const char *name);
    virtual ~CpuRiver_Functional();
 
    /** IService interface */
    virtual void postinitService();
 
    /** IResetListener itnterface */
    virtual void reset(bool active);
 
    /** ICpuGeneric interface */
    virtual void raiseSignal(int idx);
    virtual void lowerSignal(int idx);
    virtual void raiseSoftwareIrq() {}
    virtual uint64_t getIrqAddress(int idx) { return readCSR(CSR_mtvec); }
 
    // Common River methods shared with instructions:
    uint64_t *getpRegs() { return portRegs_.getpR64(); }
    uint64_t readCSR(int idx);
    void writeCSR(int idx, uint64_t val);
 
 protected:
    /** CpuGeneric common methods */
    virtual EEndianessType endianess() { return LittleEndian; }
    virtual GenericInstruction *decodeInstruction(Reg64Type *cache);
    virtual void generateIllegalOpcode();
    virtual void handleTrap();
    /** Tack Registers changes during execution */
    virtual void trackContextStart();
    /** // Stop tracking and write trace file */
    virtual void trackContextEnd();
 
    void addIsaUserRV64I();
    void addIsaPrivilegedRV64I();
    void addIsaExtensionA();
    void addIsaExtensionC();
    void addIsaExtensionF();
    void addIsaExtensionM();
    unsigned addSupportedInstruction(RiscvInstruction *instr);
    uint32_t hash32(uint32_t val) { return (val >> 2) & 0x1f; }
    /** Compressed instruction */
    uint32_t hash16(uint16_t val) {
        uint32_t t1 = val & 0x3;
        return 0x20 | ((val >> 13) << 2) | t1;
    }
 
 private:
    AttributeType listExtISA_;
    AttributeType vendorID_;
    AttributeType vectorTable_;
 
    static const int INSTR_HASH_TABLE_SIZE = 1 << 6;
    AttributeType listInstr_[INSTR_HASH_TABLE_SIZE];
 
    GenericReg64Bank portRegs_;
    GenericReg64Bank portSavedRegs_;
    GenericReg64Bank portCSR_;
};
 
DECLARE_CLASS(CpuRiver_Functional)
 
}  // namespace debugger
 
#endif  // __DEBUGGER_CPU_RISCV_FUNCTIONAL_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.