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