Skip to content

File uvm.h

File List > include > simtix > uvm.h

Go to the documentation of this file

#pragma once

#include <simtix/clocked.h>
#include <simtix/sm.h>

#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <vector>

namespace simtix {

namespace uvm {

using pipelined::PipelinedSM;

class FrontendGolden : sim::Clocked {
 public:
  using Param = PipelinedSM::Param;

  struct Input {
    std::vector<bool> starving_warps;
    std::vector<bool> issuing_warps;
    std::vector<bool> capacious_warps;
    std::vector<uint64_t> fetch_pc;

    explicit Input(const uint32_t num_warps)
        : starving_warps(num_warps),
          issuing_warps(num_warps),
          capacious_warps(num_warps),
          fetch_pc(num_warps, 0) {}
  };

  struct Output {
    uint32_t wid;
    bool addr_misaligned;
    bool access_fault;
    uint64_t wpc;
    uint32_t iword;
  };

  explicit FrontendGolden(const std::string &name, uint32_t cid,
                          const ArchParam &p = kDefaultArchParam,
                          const Param &pp = PipelinedSM::kDefaultParam);

  ~FrontendGolden() override;

  void Put(Input input);
  std::optional<Output> Get();
  void AttachIMem(mem::MemoryInterface *imem);

 protected:
  void Tick() override;
  bool HasPendingTasks() override;

  class Impl;
  std::unique_ptr<Impl> impl_;
};
}  // namespace uvm

}  // namespace simtix