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] - Diff between revs 2 and 4

Show entire file | Details | Blame | View Log

Rev 2 Rev 4
Line 6... Line 6...
 */
 */
 
 
#ifndef __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
#ifndef __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
#define __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
#define __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
 
 
#include "iclass.h"
#include <riscv-isa.h>
#include "iservice.h"
 
#include "ihap.h"
 
#include "async_tqueue.h"
 
#include "coreservices/ithread.h"
 
#include "coreservices/icpuriscv.h"
 
#include "coreservices/imemop.h"
 
#include "coreservices/iclock.h"
 
#include "coreservices/iclklistener.h"
 
#include "instructions.h"
#include "instructions.h"
 
#include "generic/cpu_generic.h"
 
#include "coreservices/icpuriscv.h"
 
#include "coreservices/isocinfo.h"
 
 
namespace debugger {
namespace debugger {
 
 
class CpuRiscV_Functional : public IService,
class CpuRiver_Functional : public CpuGeneric,
                 public IThread,
                            public ICpuRiscV {
                 public ICpuRiscV,
 
                 public IClock,
 
                 public IHap {
 
public:
public:
    CpuRiscV_Functional(const char *name);
    explicit CpuRiver_Functional(const char *name);
    virtual ~CpuRiscV_Functional();
    virtual ~CpuRiver_Functional();
 
 
    /** IService interface */
    /** IService interface */
    virtual void postinitService();
    virtual void postinitService();
 
 
    /** ICpuRiscV interface */
    /** IResetListener itnterface */
 
    virtual void reset(bool active);
 
 
 
    /** ICpuGeneric interface */
    virtual void raiseSignal(int idx);
    virtual void raiseSignal(int idx);
    virtual void lowerSignal(int idx);
    virtual void lowerSignal(int idx);
    virtual void nb_transport_debug_port(DebugPortTransactionType *trans,
    virtual void raiseSoftwareIrq() {}
                                         IDbgNbResponse *cb);
    virtual uint64_t getIrqAddress(int idx) { return readCSR(CSR_mtvec); }
 
 
    /** IClock */
    // Common River methods shared with instructions:
    virtual uint64_t getStepCounter() { return cpu_context_.step_cnt; }
    uint64_t *getpRegs() { return portRegs_.getpR64(); }
    virtual void registerStepCallback(IClockListener *cb, uint64_t t);
    uint64_t readCSR(int idx);
 
    void writeCSR(int idx, uint64_t val);
    /** IHap */
 
    virtual void hapTriggered(IFace *isrc, EHapType type, const char *descr);
 
 
 
protected:
protected:
    /** IThread interface */
    /** CpuGeneric common methods */
    virtual void busyLoop();
    virtual EEndianessType endianess() { return LittleEndian; }
 
    virtual GenericInstruction *decodeInstruction(Reg64Type *cache);
private:
    virtual void generateIllegalOpcode();
    bool isHalt() { return dbg_state_ == STATE_Halted; }
    virtual void handleTrap();
    void halt(const char *descr=NULL);
    /** Tack Registers changes during execution */
    void go();
    virtual void trackContextStart();
    void step(uint64_t cnt);
    /** // Stop tracking and write trace file */
    uint64_t getReg(uint64_t idx);
    virtual void trackContextEnd();
    void setReg(uint64_t idx, uint64_t val);
 
    uint64_t getPC();
    void addIsaUserRV64I();
    void setPC(uint64_t val);
    void addIsaPrivilegedRV64I();
    uint64_t getNPC();
    void addIsaExtensionA();
    void setNPC(uint64_t val);
    void addIsaExtensionC();
    void addBreakpoint(uint64_t addr);
    void addIsaExtensionF();
    void removeBreakpoint(uint64_t addr);
    void addIsaExtensionM();
    void hitBreakpoint(uint64_t addr);
    unsigned addSupportedInstruction(RiscvInstruction *instr);
 
 
    CpuContextType *getpContext() { return &cpu_context_; }
 
    uint32_t hash32(uint32_t val) { return (val >> 2) & 0x1f; }
    uint32_t hash32(uint32_t val) { return (val >> 2) & 0x1f; }
 
    /** Compressed instruction */
    void updatePipeline();
    uint32_t hash16(uint16_t val) {
    void updateState();
        uint32_t t1 = val & 0x3;
    void updateDebugPort();
        return 0x20 | ((val >> 13) << 2) | t1;
    void updateQueue();
    }
 
 
    bool isRunning();
 
    void reset();
 
    void handleTrap();
 
    void fetchInstruction();
 
    IInstruction *decodeInstruction(uint32_t *rpayload);
 
    void executeInstruction(IInstruction *instr, uint32_t *rpayload);
 
    void debugRegOutput(const char *marker, CpuContextType *pContext);
 
 
 
private:
private:
    static const int INSTR_HASH_TABLE_SIZE = 1 << 5;
 
 
 
    AttributeType isEnable_;
 
    AttributeType bus_;
 
    AttributeType listExtISA_;
    AttributeType listExtISA_;
    AttributeType freqHz_;
    AttributeType vendorID_;
    AttributeType generateRegTraceFile_;
    AttributeType vectorTable_;
    AttributeType generateMemTraceFile_;
 
    AttributeType resetVector_;
 
    event_def config_done_;
 
 
 
    AsyncTQueueType queue_;
 
    uint64_t last_hit_breakpoint_;
 
 
 
    Axi4TransactionType trans_;
 
    uint32_t cacheline_[512/4];
 
 
 
    // Registers:
    static const int INSTR_HASH_TABLE_SIZE = 1 << 6;
    AttributeType listInstr_[INSTR_HASH_TABLE_SIZE];
    AttributeType listInstr_[INSTR_HASH_TABLE_SIZE];
    CpuContextType cpu_context_;
 
 
 
    enum EDebugState {
    GenericReg64Bank portRegs_;
        STATE_Halted,
    GenericReg64Bank portSavedRegs_;
        STATE_Normal,
    GenericReg64Bank portCSR_;
        STATE_Stepping
 
    } dbg_state_;
 
    uint64_t dbg_step_cnt_;
 
 
 
    char tstr[1024];
 
    uint64_t iregs_prev[32]; // to detect changes
 
    struct DebugPortType {
 
        bool valid;
 
        DebugPortTransactionType *trans;
 
        IDbgNbResponse *cb;
 
 
 
        // local registers
 
        uint64_t stepping_mode_steps;
 
    } dport;
 
};
};
 
 
DECLARE_CLASS(CpuRiscV_Functional)
DECLARE_CLASS(CpuRiver_Functional)
 
 
}  // namespace debugger
}  // namespace debugger
 
 
#endif  // __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
#endif  // __DEBUGGER_CPU_RISCV_FUNCTIONAL_H__
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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