Address Map Elaboration

Address maps can be attached to any module that performs some form of aggregation or distribution of the address space between multiple peripherals. Two different tags, !Initiator and !Target, are used to describe the points of ingress and egress from the distributor or aggregator.

An address map can only describe the relationships between boundary ports of the block, it cannot describe the relationship between a boundary port and a port on a child block. This is because address distribution requires an implementation, and BLADE only supports implementation on leaf nodes.

The elaboration function has to be provided with a fully elaborated DFBlock instance, so that it can resolve references to boundary IO. It also needs to be given the list of !Initiator and !Target tags.

The stages the elaborator goes through are:

  1. Each port referenced by an !Initiator or !Target are resolved, with the signal index checked for validity. A check is also made that any ports referenced within the constraints section can be identified.

  2. Every target and initiator is converted to a DFAddressMapTarget or DFAddressMapInitiator and attached to an instance of DFAddressMap.

  3. Constraints specified in the original description are translated and resolved into the DFAddressMap - linking DFAddressMapInitiators and DFAddressMapTargets.

API

blade.elaborate.address_map.elaborate_map(map, block, scope)

Elaborate the address map from !Initiator and !Target tags, it also requires a fully elaborated block to work from as it needs to associate with boundary ports on the block.

Parameters
  • map – The collection of !Initiator and !Target tags

  • block – A DFBlock instance to associate with

  • scope – The YAML document scope used for resolving constants