#include <uhd/rfnoc/mock_block.hpp>
Public Member Functions | |
mock_reg_iface_t ()=default | |
~mock_reg_iface_t () override=default | |
void | poke32 (uint32_t addr, uint32_t data, uhd::time_spec_t time, bool ack) override |
void | multi_poke32 (const std::vector< uint32_t > addrs, const std::vector< uint32_t > data, uhd::time_spec_t time, bool ack) override |
void | block_poke32 (uint32_t first_addr, const std::vector< uint32_t > data, uhd::time_spec_t timestamp, bool ack) override |
uint32_t | peek32 (uint32_t addr, uhd::time_spec_t time) override |
std::vector< uint32_t > | block_peek32 (uint32_t first_addr, size_t length, uhd::time_spec_t time) override |
void | poll32 (uint32_t addr, uint32_t data, uint32_t mask, uhd::time_spec_t, uhd::time_spec_t time=uhd::time_spec_t::ASAP, bool=false) override |
void | sleep (uhd::time_spec_t, bool) override |
void | register_async_msg_validator (async_msg_validator_t) override |
void | register_async_msg_handler (async_msg_callback_t) override |
void | set_policy (const std::string &name, const uhd::device_addr_t &args) override |
uint16_t | get_src_epid () const override |
uint16_t | get_port_num () const override |
void | define_custom_register_space (const uint32_t, const uint32_t, std::function< void(uint32_t, uint32_t)>, std::function< uint32_t(uint32_t)>) override |
![]() | |
virtual | ~register_iface ()=default |
void | poke64 (uint32_t addr, uint64_t data, time_spec_t time=uhd::time_spec_t::ASAP, bool ack=false) |
uint64_t | peek64 (uint32_t addr, time_spec_t time=uhd::time_spec_t::ASAP) |
Public Attributes | |
bool | force_timeout = false |
std::unordered_map< uint32_t, uint32_t > | read_memory |
All pokes end up writing to this map. More... | |
std::unordered_map< uint32_t, uint32_t > | write_memory |
All peeks read from this map. A peek will fail if the address has not. More... | |
Protected Member Functions | |
virtual void | _poke_cb (uint32_t, uint32_t, uhd::time_spec_t, bool) |
virtual void | _peek_cb (uint32_t, uhd::time_spec_t) |
Additional Inherited Members | |
![]() | |
using | sptr = std::shared_ptr< register_iface > |
using | async_msg_validator_t = std::function< bool(uint32_t addr, const std::vector< uint32_t > &data)> |
using | async_msg_callback_t = std::function< void(uint32_t addr, const std::vector< uint32_t > &data, boost::optional< uint64_t >)> |
Mock version of a register interface
This can be used for mock blocks, usually for the sake of unit testing.
|
default |
|
overridedefault |
|
inlineprotectedvirtual |
|
inlineprotectedvirtual |
|
inlineoverridevirtual |
Read multiple 32-bit consecutive registers implemented in the NoC block.
first_addr | The byte address of the first register to read from (truncated to 20 bits). |
length | The number of 32-bit values to read |
time | The time at which the transaction should be executed. |
Example: If first_addr
is set to 0, and length is 8, then this function will return a vector of length 8, with the content of registers at addresses 0, 4, 8, 12, 16, 20, 24, and 28 respectively.
Note: There is no guarantee that under the hood, the implementation won't separate the reads.
op_failed | if the transaction fails |
op_timeout | if no response is received |
op_seqerr | if a sequence error occurs |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Write multiple consecutive 32-bit registers implemented in the NoC block.
This function will only allow writes to adjacent registers, in increasing order. If addr is set to 0, and the length of data is 8, then this method triggers eight writes, in order, to addresses 0, 4, 8, 12, 16, 20, 24, 28. For arbitrary addresses, cf. multi_poke32().
Note: There is no guarantee that under the hood, the implementation won't separate the writes.
first_addr | The byte addresses of the first register to write |
data | New values of these registers |
time | The time at which the first transaction should be executed. |
ack | Should transaction completion be acknowledged? |
op_failed | if an ACK is requested and the transaction fails |
op_timeout | if an ACK is requested and no response is received |
op_seqerr | if an ACK is requested and a sequence error occurs |
op_timeerr | if an ACK is requested and a time error occurs (late command) |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Define a custom register space that overrides peek and poke operations, directing peek and poke operations that fall within the custom space to the provided custom peek and poke functions instead.
Callers should be aware of the NoC block's register space, so that peeks and pokes do not unintentionally override existing functionality.
start_addr | The start address of the custom register space |
length | The length of the custom address space |
poke_fn | The function to call when the custom register space is poked |
peek_fn | The function to call when the custom register space is peeked |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Get the port number of the software counterpart of this register interface. This information is useful to send async messages to the host.
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Get the endpoint ID of the software counterpart of this register interface. This information is useful to send async messages to the host.
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Write multiple 32-bit registers implemented in the NoC block.
This method should be called when multiple writes need to happen that are at non-consecutive addresses. For consecutive writes, cf. block_poke32().
addrs | The byte addresses of the registers to write to (each truncated to 20 bits). |
data | New values of these registers. The lengths of data and addr must match. |
time | The time at which the first transaction should be executed. |
ack | Should transaction completion be acknowledged? |
uhd::value_error | if lengths of data and addr don't match |
op_failed | if an ACK is requested and the transaction fails |
op_timeout | if an ACK is requested and no response is received |
op_seqerr | if an ACK is requested and a sequence error occurs |
op_timeerr | if an ACK is requested and a time error occurs (late command) |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Read a 32-bit register implemented in the NoC block.
addr | The byte address of the register to read from (truncated to 20 bits). |
time | The time at which the transaction should be executed. |
op_failed | if the transaction fails |
op_timeout | if no response is received |
op_seqerr | if a sequence error occurs |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Write a 32-bit register implemented in the NoC block.
addr | The byte address of the register to write to (truncated to 20 bits). |
data | New value of this register. |
time | The time at which the transaction should be executed. |
ack | Should transaction completion be acknowledged? |
op_failed | if an ACK is requested and the transaction fails |
op_timeout | if an ACK is requested and no response is received |
op_seqerr | if an ACK is requested and a sequence error occurs |
op_timeerr | if an ACK is requested and a time error occurs (late command) |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Poll a 32-bit register until its value for all bits in mask match data&mask
This will insert a command into the command queue to wait until a register is of a certain value. This can be used, e.g., to poll for a lock pin before executing the next command. It is related to sleep(), except it has a condition to wait on, rather than an unconditional stall duration. The timeout is hardware-timed. If the register does not attain the requested value within the requested duration, ${something bad happens}.
Example: Assume readback register 16 is a status register, and bit 0 indicates a lock is in place (i.e., we want it to be 1) and bit 1 is an error flag (i.e., we want it to be 0). The previous command can modify the state of the block, so we give it 1ms to settle. In that case, the call would be thus:
addr | The byte address of the register to read from (truncated to 20 bits). |
data | The values that the register must have |
mask | The bitmask that is applied before checking the readback value |
timeout | The max duration that the register is allowed to take before reaching its new state. |
time | When the poll should be executed |
ack | Should transaction completion be acknowledged? This is typically only necessary if the software needs a condition to be fulfilled before continueing, or during debugging. |
op_failed | if an ACK is requested and the transaction fails |
op_timeout | if an ACK is requested and no response is received |
op_seqerr | if an ACK is requested and a sequence error occurs |
op_timeerr | if an ACK is requested and a time error occurs (late command) |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Register a callback function for when an async message is received
Only one callback function can be registered. When calling this multiple times, only the last callback will be accepted.
callback_f | The function to call when an asynchronous message is received. |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Register a callback function to validate a received async message
The purpose of this callback is to provide a method to the framework to make sure a received async message is valid. If this callback is provided, the framework will first pass the message to the validator for validation. If the validator returns true, the async message is ACK'd with a ctrl_status_t::CMD_OKAY response, and then the async message is executed. If the validator returns false, then the async message is ACK'd with a ctrl_status_t::CMD_CMDERR, and the async message handler is not excecuted.
This callback may not communicate with the device, it can only look at the data and make a valid/not valid decision.
Only one callback function can be registered. When calling this multiple times, only the last callback will be accepted.
callback_f | The function to call when an asynchronous message is received. |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Set a policy that governs the operational parameters of this register bus. Policies can be used to make tradeoffs between performance, resilience, latency, etc.
name | The name of the policy to apply |
args | Additional arguments to pass to the policy governor |
Implements uhd::rfnoc::register_iface.
|
inlineoverridevirtual |
Send a command to halt (block) the control bus for a specified time. This is a hardware-timed sleep.
duration | The amount of time to sleep. |
ack | Should transaction completion be acknowledged? |
op_failed | if an ACK is requested and the transaction fails |
op_timeout | if an ACK is requested and no response is received |
op_seqerr | if an ACK is requested and a sequence error occurs |
Implements uhd::rfnoc::register_iface.
bool uhd::rfnoc::mock_reg_iface_t::force_timeout = false |
std::unordered_map<uint32_t, uint32_t> uhd::rfnoc::mock_reg_iface_t::read_memory |
All pokes end up writing to this map.
std::unordered_map<uint32_t, uint32_t> uhd::rfnoc::mock_reg_iface_t::write_memory |
All peeks read from this map. A peek will fail if the address has not.