a. Refer to the `Xilinx 7 Series Library guide <https://www.xilinx.com/support/documentation/sw_manuals/xilinx2012_2/ug953-vivado-7series-libraries.pdf>`_ and/or Vivado layout to understand the primitive you need to instantiate
b. Find a single bit parameter that can be easily toggled, such as a clock inverter or a bulk configuration bit
c. Find the correct site type in gen_sites()
d. Instantiate the correct verilog library macro in top
e. LOC it, if necessary. It's necessary to LOC it if there is more than one
#. Run make, and look at Vivado's output. Especially if you took shortcuts instantiating your macro (ex: not connecting critical ports) you may need to add DRC waivers to generate.tcl
#. Inspect the ``build/segbits_tilegrid.tdb`` to observe bit addresses, for example ``DSP_L_X22Y0.DWORD:0.DFRAME:1b 0040171B_000_01``
#. The ``DFRAME`` etc entries are deltas to convert this feature offset to the base address for the tile
#. We will fix them in the subsequent step
#. Correct Makefile's ``GENERATE_ARGS`` to make it the section base address instead of a specific bit in that memory region
#. Align address to 0x80: 0x0040171B => --dframe 1B to yield a base address of 0x00401700
#. Correct word offset. This is harder since it requires some knowledge of how and where the IP block memory is as a whole
i. If there is only one tile of this type in the DSP column:
start by assuming it occupies the entire address range.
In this step add a delta to make the word offset 0 (--dword 0) and later indicate that it occupies 101 words (all of them)
ii. If there are multiple: compare the delta between adjacent tiles to get the pitch.
This should give an upper bound on the address size.
Make a guess with that in mind and you may have to correct it later when you have better information.
#. Align bits to 0: 1 => --dbit 1
#. Run ``make clean && make``
#. Verify ``build/segbits_tilegrid.tdb`` now looks resolved
#. This is declared to be 28 frames wide and occupy 10 words per tile in the DSP column
#. Run ``make`` in the tilegrid directory
#. Look at ``build/tilegrid.json``
#. Observe your base address(es) have been inserted (look for bits ``CLB_IO_CLK`` entry in the ``DSP_L_*`` tiles)
Feature Fuzzing
---------------
The general idea behind fuzzers is to pick some element in the device (say a block RAM or IOB) to target and write a design that is implemented in a specific element.
Next, we need to create variations of the design (called specimens) that vary the design parameters, for example, changing the configuration of a single pin and process them in Vivado in order to obtain the respective bitstreams.
Finally, by looking at all the resulting specimens, the information which bits in which frame correspond to a particular choice in the design can be correlated.