15 #include "fletchgen/mmio.h"
17 #include <fletcher/fletcher.h>
18 #include <fletcher/common.h>
19 #include <cerata/api.h>
20 #include <cerata/vhdl/vhdl.h>
26 #include "fletchgen/axi4_lite.h"
27 #include "fletchgen/basic_types.h"
32 using cerata::component;
38 default:
return "control";
46 default:
return Port::Dir::OUT;
51 const std::shared_ptr<ClockDomain> &domain) :
52 Port(name, reg.width == 1 ? cerata::bit() : vector(reg.width), dir, domain), reg(reg) {}
55 return std::make_shared<MmioPort>(name(), dir_,
reg, domain_);
58 std::shared_ptr<MmioPort>
mmio_port(Port::Dir dir,
const MmioReg ®,
const std::shared_ptr<ClockDomain> &domain) {
59 return std::make_shared<MmioPort>(reg.
name, dir, reg, domain);
62 std::shared_ptr<Component>
mmio(
const std::vector<fletcher::RecordBatchDescription> &batches,
63 const std::vector<MmioReg> ®s,
67 auto kcd = port(
"kcd",
cr(), Port::Dir::IN,
kernel_cd());
69 auto comp = component(
"mmio", {kcd});
71 for (
const auto ® : regs) {
72 auto dir = ToDir(reg.behavior);
75 port->SetName(
"f_" + reg.name + (std::string(dir == Port::Dir::IN ?
"_write" :
"") +
"_data"));
83 comp->SetMeta(cerata::vhdl::meta::PRIMITIVE,
"true");
84 comp->SetMeta(cerata::vhdl::meta::LIBRARY,
"work");
85 comp->SetMeta(cerata::vhdl::meta::PACKAGE,
"mmio_pkg");
91 static size_t AddrSpaceUsed(uint32_t width, uint32_t alignment) {
92 return (alignment / 8) * (width / alignment + (width % alignment != 0));
95 static size_t Offset(uint32_t address, uint32_t alignment) {
96 return 8 * (address % (alignment / 8));
101 std::optional<size_t *> next_addr) {
102 std::stringstream ss;
104 size_t next_free_addr = axi_spec.
offset;
108 " doc: Fletchgen generated MMIO configuration.\n"
111 " bus-flatten: yes\n"
112 " bus-prefix: mmio_\n"
113 " clock-name: kcd_clk\n"
114 " reset-name: kcd_reset\n"
117 " bus-width: " << std::to_string(axi_spec.
data_width) <<
"\n";
118 ss <<
" optimize: yes\n"
126 for (
const auto &sub : regs) {
127 for (
auto &r : *sub) {
131 ss <<
" - address: " << axi_spec.
offset + *r.addr <<
"\n";
135 next_free_addr = axi_spec.
offset + *r.addr + AddrSpaceUsed(r.width, 32);
138 ss <<
" - address: " << next_free_addr <<
"\n";
139 r.addr = next_free_addr;
140 next_free_addr += AddrSpaceUsed(r.width, 32);
143 ss <<
" name: " << r.name <<
"\n";
144 if (!r.desc.empty()) {
145 ss <<
" doc: " << r.desc <<
"\n";
147 auto offset = Offset(r.addr.value(), axi_spec.
data_width);
149 ss <<
" bitrange: " << offset + r.index + r.width - 1 <<
".." << offset + r.index <<
"\n";
151 ss <<
" bitrange: " << offset + r.index <<
"\n";
153 ss <<
" behavior: " << ToString(r.behavior) <<
"\n";
159 **next_addr = next_free_addr;
170 default:
return false;
Contains all classes and functions related to Fletchgen.
std::shared_ptr< MmioPort > mmio_port(Port::Dir dir, const MmioReg ®, const std::shared_ptr< ClockDomain > &domain)
Create an mmio port.
std::shared_ptr< ClockDomain > kernel_cd()
Fletcher accelerator clock domain.
std::shared_ptr< Type > cr()
Fletcher clock/reset;.
MmioBehavior
Register access behavior enumeration.
@ STATUS
Register contents is controlled by hardware kernel.
@ STROBE
Register contents is asserted for one cycle by host software.
std::shared_ptr< Type > bus(const BusSpecParams &spec)
Fletcher bus type with access mode conveyed through spec of params.
std::shared_ptr< Axi4LitePort > axi4_lite(Port::Dir dir, const std::shared_ptr< ClockDomain > &domain, Axi4LiteSpec spec)
Make a new AXI4-lite port, returning a shared pointer to it.
MmioFunction
Register intended use enumeration.
@ KERNEL
Registers for the kernel.
@ BATCH
Registers for RecordBatch metadata.
@ DEFAULT
Default registers.
bool ExposeToKernel(MmioFunction fun)
Return true if an mmio register's function must cause it to be exposed to the user kernel.
std::shared_ptr< ClockDomain > bus_cd()
Fletcher bus clock domain.
std::string GenerateVhdmmioYaml(const std::vector< std::vector< MmioReg > * > ®s, Axi4LiteSpec axi_spec, std::optional< size_t * > next_addr)
Returns a YAML string for the vhdmmio tool based on a set of registers.
std::shared_ptr< Component > mmio(const std::vector< fletcher::RecordBatchDescription > &batches, const std::vector< MmioReg > ®s, Axi4LiteSpec axi_spec)
Generate the MMIO component for the nucleus.
AXI4-lite bus specification.
size_t offset
The offset for all registers.
size_t data_width
The data width.
std::shared_ptr< Object > Copy() const override
Make a copy of this MmioPort.
MmioReg reg
The Mmio register this port will represent.
MmioPort(const std::string &name, Port::Dir dir, const MmioReg ®, const std::shared_ptr< ClockDomain > &domain=cerata::default_domain())
MmioPort constructor.
Structure to represent an MMIO register.
std::string name
Register mame.