Providing User Guidance to Mapper - 2022.1 English

Versal ACAP AI Engine Programming Environment User Guide (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 English

In some cases, the mapper error might be due to limitations of the tool. In such cases. it might be useful to provide guidance to the tool.

  1. Turn off automatic AI Engine compiler floorplanning using the command line switch.
    -–Xmapper=disableFloorplanning
  2. Create your own floorplanning by using either bounding box constraints in the graph or areaGroup constraints in the constraints file. This is particularly useful if there are multiple disjoint graphs in the design. Each of these separate graphs can be constrained to a particular region of the array. This technique not only helps design convergence but can also help improve performance by minimizing interference between different graph buffers. The following diagram shows an example using a 16 antenna transmit chain design. The highlighted kernels in blue belong to antenna 4.
    Figure 1. Kernels in Antenna 4

    The constraints file syntax to achieve this is as follows.

    {
      "GlobalConstraints": {
        "areaGroup": {
          "name": "ant4_cores",
          "nodeGroup": ["tx_chain4.*"],
          "tileGroup": ["(16,0):(19,3)"]
        }
      }
    }

    The bounding box syntax to achieve this is as follows.

    location<graph>(tx_chain4) = bounding_box(16,0,19,3);
  3. Add co-location or absolute location constraints if necessary. If this guidance does not get the design to converge, you can try adding co-location or absolute location constraints. Co-location constraints can be added between kernels and buffers or system memory that you expect to be mapped to the same tile, as shown in the following example.
    location<buffer>(kernel_1.out[0]) = location<kernel>(kernel_1);
    location<stack>(kernel_1) = location<kernel>(kernel_1);
    Absolute location constraints can also be added to certain key kernels or buffers to act as anchors and guide the mapper's placement of other components, as shown in the following example.
    location<kernel>(kernel_1) = tile(20, 0);
    location<buffer>(kernel_1.in[0]) =
    
            { address(19, 0, 0x0),
              address(19, 0, 0x2000) }; // double buffer needs two locations