#pragma once #include #include "pipeline.h" #include "cache.h" namespace vortex { class Core; class ExeUnit : public SimObject { public: SimPort Input; SimPort Output; ExeUnit(const SimContext& ctx, Core* core, const char* name) : SimObject(ctx, name) , Input(this) , Output(this) , core_(core) {} virtual ~ExeUnit() {} protected: Core* core_; }; /////////////////////////////////////////////////////////////////////////////// class NopUnit : public ExeUnit { public: NopUnit(const SimContext& ctx, Core*); void step(uint64_t cycle); }; /////////////////////////////////////////////////////////////////////////////// class LsuUnit : public ExeUnit { private: uint32_t num_threads_; HashTable> pending_dcache_; pipeline_trace_t* fence_state_; bool fence_lock_; public: LsuUnit(const SimContext& ctx, Core*); void step(uint64_t cycle); }; /////////////////////////////////////////////////////////////////////////////// class AluUnit : public ExeUnit { public: AluUnit(const SimContext& ctx, Core*); void step(uint64_t cycle); }; /////////////////////////////////////////////////////////////////////////////// class CsrUnit : public ExeUnit { public: CsrUnit(const SimContext& ctx, Core*); void step(uint64_t cycle); }; /////////////////////////////////////////////////////////////////////////////// class FpuUnit : public ExeUnit { public: FpuUnit(const SimContext& ctx, Core*); void step(uint64_t cycle); }; /////////////////////////////////////////////////////////////////////////////// class GpuUnit : public ExeUnit { private: uint32_t num_threads_; HashTable> pending_tex_reqs_; bool processTexRequest(uint64_t cycle, pipeline_trace_t* trace); public: GpuUnit(const SimContext& ctx, Core*); void step(uint64_t cycle); }; }