Skip to content

Commit 50c7c05

Browse files
committed
Merge branch 'feature/add-kria-accelerator-interation' into develop
2 parents 83bc523 + 4c19a1d commit 50c7c05

File tree

7 files changed

+175
-19
lines changed

7 files changed

+175
-19
lines changed

examples/basic-example.cpp

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
#include <cstdint>
11+
#include <iostream>
1112
#include <memory>
1213
#include <string>
1314

@@ -26,8 +27,8 @@ static constexpr char kBitstream[] = EXAMPLE_BITSTREAM_LOCATION;
2627
static constexpr char kXclBin[] = EXAMPLE_DEFAULT_XCLBIN_LOCATION;
2728

2829
// Given by the design
29-
static constexpr uint64_t kAccelAddress = 0xa0000000;
30-
static constexpr uint64_t kDmaAddress = 0xa0010000;
30+
static constexpr uint64_t kAccelAddress = EXAMPLE_ACCEL_ADDR;
31+
static constexpr uint64_t kDmaAddress = EXAMPLE_DMA_ADDR;
3132

3233
// Addresses of the accelerator
3334
static constexpr uint64_t kAccelNumDataAddr = 0x20;
@@ -60,12 +61,29 @@ int main() {
6061

6162
// Fill data on *in_data*...
6263

63-
// Configure the accel
64-
accel->Write(kAccelNumDataAddr, &kNumData, kNumData);
65-
6664
// Start the accel in autorestart
6765
accel->Start(StartMode::Continuous);
6866

67+
// Read the defaults:
68+
uint32_t incols = 0;
69+
uint32_t outcols = 0;
70+
71+
accel->Read(32, &incols, 1);
72+
accel->Read(48, &outcols, 1);
73+
std::cout << "Initial InCols: " << incols << std::endl;
74+
std::cout << "Initial OutCols: " << outcols << std::endl;
75+
76+
// Configure the accel
77+
incols = kNumData;
78+
outcols = kNumData;
79+
accel->Write(24, &incols, 1);
80+
accel->Write(40, &outcols, 1);
81+
82+
accel->Read(32, &incols, 1);
83+
accel->Read(48, &outcols, 1);
84+
std::cout << "Configured InCols: " << incols << std::endl;
85+
std::cout << "Configured OutCols: " << outcols << std::endl;
86+
6987
// Move the data
7088
in_mem->Sync(SyncType::HostToDevice);
7189
mover->Upload(in_mem, in_mem->Size(), ExecutionType::Sync);

include/cynq/accelerator.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@
1414
#include <cynq/status.hpp>
1515

1616
namespace cynq {
17+
/**
18+
* @brief Define an abstract representation of the accelerator parameters
19+
* with some prefilled fields
20+
*/
21+
struct AcceleratorParameters {
22+
/** Virtual destructor required for the inheritance */
23+
virtual ~AcceleratorParameters() = default;
24+
};
25+
1726
/**
1827
* @brief Interface for standardising the API for any Accelerator device:
1928
* XRTAccelerator

include/cynq/status.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct Status {
2626
by a function */
2727
INCOMPATIBLE_PARAMETER,
2828
CONFIGURATION_ERROR, /** Configuration error*/
29+
REGISTER_IO_ERROR, /** Register MMIO error */
2930
NOT_IMPLEMENTED, /** Not implemented error */
3031
};
3132

include/cynq/xrt/accelerator.hpp

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
*
88
*/
99
#pragma once
10+
11+
#include <memory>
12+
1013
#include <cynq/accelerator.hpp>
1114
#include <cynq/enums.hpp>
1215
#include <cynq/status.hpp>
@@ -19,13 +22,25 @@ namespace cynq {
1922
*/
2023
class XRTAccelerator : public IAccelerator {
2124
public:
22-
XRTAccelerator() {}
25+
/**
26+
* @brief Delete the default constructor since address is needed
27+
*/
28+
XRTAccelerator() = delete;
29+
/**
30+
* @brief Construct a new XRTAccelerator object
31+
*
32+
* It constructs an accessor to the accelerator in the PL design according
33+
* to the AXI-lite memory mapping. This is widely compatible with AXI4-lite
34+
* controlled HLS designs.
35+
*
36+
* @param addr 64-bit address in the physical memory space
37+
*/
38+
explicit XRTAccelerator(const uint64_t addr);
2339
/**
2440
* @brief ~XRTAccelerator destructor method
2541
* Destroy the XRTAccelerator object
26-
*
2742
*/
28-
virtual ~XRTAccelerator() = default;
43+
virtual ~XRTAccelerator();
2944
/**
3045
* @brief Start method
3146
* This method starts the accelerator in either once or continuous mode (with
@@ -87,5 +102,13 @@ class XRTAccelerator : public IAccelerator {
87102
*/
88103
Status ReadRegister(const uint64_t address, uint8_t *data,
89104
const size_t size) override;
105+
106+
private:
107+
/** Accelerator address */
108+
uint64_t addr_;
109+
/** Address space size */
110+
uint64_t addr_space_size_;
111+
/** Accelerator-specific configurations */
112+
std::unique_ptr<AcceleratorParameters> accel_params_;
90113
};
91114
} // namespace cynq

src/cynq/accelerator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
namespace cynq {
1616
std::shared_ptr<IAccelerator> IAccelerator::Create(IAccelerator::Type impl,
17-
const uint64_t /*addr*/) {
17+
const uint64_t addr) {
1818
switch (impl) {
1919
case IAccelerator::Type::XRT:
20-
return std::make_shared<XRTAccelerator>();
20+
return std::make_shared<XRTAccelerator>(addr);
2121
default:
2222
return nullptr;
2323
}

src/cynq/xrt/accelerator.cpp

Lines changed: 111 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,131 @@
66
* Diego Arturo Avila Torres <diego.avila@uned.cr>
77
*
88
*/
9+
#include <memory>
10+
#include <stdexcept>
11+
#include <string>
912

1013
#include <cynq/xrt/accelerator.hpp>
1114

1215
#include <cynq/accelerator.hpp>
1316
#include <cynq/enums.hpp>
1417
#include <cynq/status.hpp>
1518

19+
extern "C" {
20+
#include <pynq_api.h> /* FIXME: to be removed in future releases */
21+
}
22+
23+
/*
24+
* FIXME: This implementation is fully based on the PYNQ C API from the
25+
* community. This must be updated once the PYNQ C port as been done
26+
* in a decent manner.
27+
*/
28+
29+
static constexpr uint64_t kAddrSpace = 65536;
30+
1631
namespace cynq {
17-
Status XRTAccelerator::Start(const StartMode /*mode*/) { return Status{}; }
32+
/**
33+
* @brief Specialisation of the parameters given by the UltraScale. This is
34+
* only available by the source file to encapsulate the dependencies involved.
35+
*/
36+
struct XrtAcceleratorParameters : public AcceleratorParameters {
37+
/** Accelerator address */
38+
uint64_t addr_;
39+
/** Address space size */
40+
uint64_t addr_space_size_;
41+
/** HLS Design */
42+
PYNQ_HLS hls_;
43+
/** Virtual destructor required for the inheritance */
44+
virtual ~XrtAcceleratorParameters() = default;
45+
};
46+
47+
XRTAccelerator::XRTAccelerator(const uint64_t addr)
48+
: addr_{addr},
49+
addr_space_size_{kAddrSpace},
50+
accel_params_{std::make_unique<XrtAcceleratorParameters>()} {
51+
/* The assumption is that at this point, it is ok */
52+
auto params = dynamic_cast<XrtAcceleratorParameters *>(accel_params_.get());
53+
54+
params->addr_ = this->addr_;
55+
params->addr_space_size_ = this->addr_space_size_;
56+
57+
if (PYNQ_SUCCESS !=
58+
PYNQ_openHLS(&params->hls_, this->addr_, this->addr_space_size_)) {
59+
std::string msg = "Cannot open the design in addr: ";
60+
msg += std::to_string(this->addr_);
61+
throw std::runtime_error(msg);
62+
}
63+
}
64+
65+
Status XRTAccelerator::Start(const StartMode mode) {
66+
constexpr uint64_t ctrl_reg_addr = 0x00;
67+
const uint8_t ctrl_reg_val = StartMode::Once == mode ? 0x01 : 0x81;
68+
return this->WriteRegister(ctrl_reg_addr, &ctrl_reg_val, sizeof(uint8_t));
69+
}
70+
71+
Status XRTAccelerator::Stop() {
72+
constexpr uint64_t ctrl_reg_addr = 0x00;
73+
const uint8_t ctrl_reg_val = 0x0;
74+
return this->WriteRegister(ctrl_reg_addr, &ctrl_reg_val, sizeof(uint8_t));
75+
}
1876

19-
Status XRTAccelerator::Stop() { return Status{}; }
77+
DeviceStatus XRTAccelerator::GetStatus() {
78+
constexpr uint64_t ctrl_reg_addr = 0x00;
79+
uint8_t ctrl_reg_val = 0x0;
2080

21-
DeviceStatus XRTAccelerator::GetStatus() { return DeviceStatus::Idle; }
81+
Status st = this->ReadRegister(ctrl_reg_addr, &ctrl_reg_val, sizeof(uint8_t));
82+
if (Status::OK != st.code) {
83+
return DeviceStatus::Error;
84+
}
2285

23-
Status XRTAccelerator::WriteRegister(const uint64_t /*address*/,
24-
const uint8_t* /*data*/,
25-
const size_t /*size*/) {
86+
switch (ctrl_reg_val) {
87+
case 0x01:
88+
case 0x03:
89+
case 0x81:
90+
case 0x83:
91+
return DeviceStatus::Running;
92+
case 0x04:
93+
return DeviceStatus::Idle;
94+
case 0x06:
95+
return DeviceStatus::Done;
96+
default:
97+
return DeviceStatus::Unknown;
98+
}
99+
}
100+
101+
Status XRTAccelerator::WriteRegister(const uint64_t address,
102+
const uint8_t *data, const size_t size) {
103+
auto params = dynamic_cast<XrtAcceleratorParameters *>(accel_params_.get());
104+
auto ret = PYNQ_writeToHLS(&params->hls_, const_cast<uint8_t *>(data),
105+
address, size);
106+
if (PYNQ_SUCCESS != ret) {
107+
std::string msg = "Cannot write on HLS register: ";
108+
msg += std::to_string(address);
109+
msg += " the payload with size: ";
110+
msg += std::to_string(size);
111+
return Status{Status::REGISTER_IO_ERROR, msg};
112+
}
26113
return Status{};
27114
}
28115

29-
Status XRTAccelerator::ReadRegister(const uint64_t /*address*/,
30-
uint8_t* /*data*/, const size_t /*size*/) {
116+
Status XRTAccelerator::ReadRegister(const uint64_t address, uint8_t *data,
117+
const size_t size) {
118+
auto params = dynamic_cast<XrtAcceleratorParameters *>(accel_params_.get());
119+
auto ret = PYNQ_readFromHLS(&params->hls_, data, address, size);
120+
if (PYNQ_SUCCESS != ret) {
121+
std::string msg = "Cannot read on HLS register: ";
122+
msg += std::to_string(address);
123+
msg += " the payload with size: ";
124+
msg += std::to_string(size);
125+
return Status{Status::REGISTER_IO_ERROR, msg};
126+
}
31127
return Status{};
32128
}
129+
130+
XRTAccelerator::~XRTAccelerator() {
131+
/* The assumption is that at this point, it is ok */
132+
auto params = dynamic_cast<XrtAcceleratorParameters *>(accel_params_.get());
133+
PYNQ_closeHLS(&params->hls_);
134+
}
135+
33136
} // namespace cynq

third-party/resources/meson.build

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ default_xclbin_location = fmt.format(meson.global_source_root(), files('default.
1212

1313
cpp_args += [
1414
'-DEXAMPLE_BITSTREAM_LOCATION=' + matrix_bitstream_location,
15-
'-DEXAMPLE_DEFAULT_XCLBIN_LOCATION=' + default_xclbin_location
15+
'-DEXAMPLE_DEFAULT_XCLBIN_LOCATION=' + default_xclbin_location,
16+
'-DEXAMPLE_ACCEL_ADDR=0xa0000000',
17+
'-DEXAMPLE_DMA_ADDR=0xa0010000'
1618
]

0 commit comments

Comments
 (0)