.. _genfasm: FPGA Assembly (FASM) Output Support =================================== After VPR has generated a placed and routed design, the ``genfasm`` utility can emit a FASM_ file to represent the design at a level detailed enough to allow generation of a bitstream to program a device. This FASM output file is enabled by FASM metadata encoded in the VPR architecture definition and routing graph. The output FASM file can be converted into a bitstream format suitable to program the target architecture via architecture specific tooling. Current devices that can be programmed using the vpr + fasm flow include Lattice iCE40 and Xilinx Artix-7 devices, with work on more devices underway. More information on supported devices is available from the Symbiflow_ website and an overview of the flow for Artix-7 devices is described in IEEE Micro :cite:`murray_micro_symbiflow`. .. _FASM: https://github.com/SymbiFlow/fasm .. _Symbiflow: https://symbiflow.github.io FASM metadata ------------- The ``genfasm`` utility uses ``metadata`` blocks (see :ref:`arch_metadata`) attached to the architecture definition and routing graph to emit FASM features. By adding FASM specific metadata to both the architecture definition and the routing graph, a FASM file that represents the place and routed design can be generated. All metadata tags are ignored when packing, placing and routing. After VPR has been completed placement, ``genfasm`` utility loads the VPR output files (.net, .place, .route) and then uses the FASM metadata to emit a FASM file. The following metadata "keys" are recognized by ``genfasm``: * "fasm_prefix" * "fasm_features" * "fasm_type" and "fasm_lut" * "fasm_mux" * "fasm_params" Invoking genfasm ---------------- ``genfasm`` expects that place and route on the design is completed (e.g. .net, .place, .route files are present), so ensure that routing is complete before executing ``genfasm``. ``genfasm`` should be invoked in the same subdirectory as the routing output. The output FASM file will be written to ``.fasm``. FASM prefixing -------------- FASM feature names has structure through their prefixes. In general the first part of the FASM feature is the location of the feature, such as the name of the tile the feature is located in, e.g. INT_L_X5Y6 or CLBLL_L_X10Y12. The next part is typically an identifier within the tile. For example a CLBLL tile has two slices, so the next part of the FASM feature name is the slice identifier, e.g. SLICE_X0 or SLICE_X1. Now consider the CLBLL_L pb_type. This pb_type is repeated in the grid for each tile of that type. To allow one pb_type definition to be defined, the "fasm_prefix" metadata tag is allowed to be attached at the layout level on the tag. This enables the same pb_type to be used for all CLBLL_L tiles, and the "fasm_prefix" is prepended to all FASM metadata within that pb_type. For example: .. code-block:: xml CLBLL_L_X12Y100 CLBLL_L_X12Y101 "fasm_prefix" tags can also be used within a pb_type to handle repeated features. For example in the CLB, there are 4 LUTs that can be described by a common pb_type, except that the prefix changes for each. For example, consider the FF's within a CLB. There are 8 FF's that share a common structure, except for a prefix change. "fasm_prefix" can be a space separated list to assign prefixes to the index of the pb_type, rather than needing to emit N copies of the pb_type with varying prefixes. .. code-block:: xml AFF BFF CFF DFF A5FF B5FF C5FF D5FF Construction of the prefix ~~~~~~~~~~~~~~~~~~~~~~~~~~ "fasm_prefix" is accumulated throughout the structure of the architecture definition. Each "fasm_prefix" is joined together with a period ('.'), and then a period is added after the prefix before the FASM feature name. Simple FASM feature emissions ----------------------------- In cases where a FASM feature needs to be emitted simply via use of a pb_type, the "fasm_features" tag can be used. If the pb_type (or mode) is selected, then all "fasm_features" in the metadata will be emitted. Multiple features can be listed, whitespace separated. Example: .. code-block:: xml ZRST The other place that "fasm_features" is used heavily is on tags in the routing graph. If an edge is used in the final routed design, "genfasm" will emit features attached to the edge. Example: .. code-block:: xml HCLK_R_X58Y130.HCLK_LEAF_CLK_B_TOP4.HCLK_CK_BUFHCLK7 HCLK_R_X58Y130.ENABLE_BUFFER.HCLK_CK_BUFHCLK7 In this example, when the routing graph connects node 418849 to 431195, two FASM features will be emitted: * ``HCLK_R_X58Y130.HCLK_LEAF_CLK_B_TOP4.HCLK_CK_BUFHCLK7`` * ``HCLK_R_X58Y130.ENABLE_BUFFER.HCLK_CK_BUFHCLK7`` Emitting LUTs ------------- LUTs are a structure that is explicitly understood by VPR. In order to emit LUTs, two metadata keys must be used, "fasm_type" and "fasm_lut". "fasm_type" must be either "LUT" or "SPLIT_LUT". The "fasm_type" modifies how the "fasm_lut" key is interpreted. If the pb_type that the metadata is attached to has no "num_pb" or "num_pb" equals 1, then "fasm_type" can be "LUT". "fasm_lut" is then the feature that represents the LUT table storage features, example: .. code-block:: xml LUT ALUT.INIT[63:0] FASM LUT metadata must be attached to the ```` at or within the ```` tag directly above the ```` with ``blif_model=".names"``. Do note that there is an implicit ```` tag within intermediate ```` when no explicit ```` tag is present. The FASM LUT metadata tags will not be recognized attached inside of ````'s higher above the leaf type. When specifying a FASM features with more than one bit, explicitly specify the bit range being set. This is required because "genfasm" does not have access to the actual bit database, and would otherwise not have the width of the feature. When "fasm_type" is "SPLIT_LUT", "fasm_lut" must specify both the feature that represents the LUT table storage features and the pb_type path to the LUT being specified. Example: .. code-block:: xml SPLIT_LUT ALUT.INIT[31:0] = BEL_LT-A5LUT[0] ALUT.INIT[63:32] = BEL_LT-A5LUT[1] In this case, the LUT in pb_type BEL_LT-A5LUT[0] will use INIT[31:0], and the LUT in pb_type BEL_LT-A5LUT[1] will use INIT[63:32]. Within tile interconnect features --------------------------------- When a tile has interconnect feature, e.g. output muxes, the "fasm_mux" tag should be attached to the interconnect tag, likely the ```` or ```` tags. From the perspective of genfasm, the ```` and ```` tags are equivalent. The syntax for the "fasm_mux" newline separated relationship between mux input wire names and FASM features. Example: .. code-block:: xml BLK_IG-COMMON_SLICE.DO5 : D5FFMUX.IN_A BLK_IG-COMMON_SLICE.DX : D5FFMUX.IN_B The above mux connects input BLK_IG-COMMON_SLICE.DX or BLK_IG-COMMON_SLICE.DO5 to BLK_BB-SLICE_FF.D5[3]. When VPR selects BLK_IG-COMMON_SLICE.DO5 for the mux, "genfasm" will emit D5FFMUX.IN_A, etc. There is not a requirement that all inputs result in a feature being set. In cases where some mux selections result in no feature being set, use "NULL" as the feature name. Example: .. code-block:: xml BLK_IG-COMMON_SLICE.DO5 : CARRY4.DCY0 BLK_IG-COMMON_SLICE.DX : NULL The above examples all used the ```` tag. The "fasm_mux" metadata key can also be used with the ```` tag in the same way, example: .. code-block:: xml BLK_IG-SLICEM.CX = WA7USED If multiple FASM features are required for a mux, they can be specified using comma's as a separator. Example: .. code-block:: xml BLK_IG-COMMON_SLICE.DO5 : D5FFMUX.IN_A BLK_IG-COMMON_SLICE.DX : D5FFMUX.IN_B, D5FF.OTHER_FEATURE Passing parameters through to the FASM Output --------------------------------------------- In many cases there are parameters that need to be passed directly from the input :ref:`vpr_eblif_file` to the FASM file. These can be passed into a FASM feature via the "fasm_params" key. Note that care must be taken to have the "fasm_params" metadata be attached to pb_type that the packer uses, the pb_type with the blif_model= ".subckt". The "fasm_params" value is a newline separated list of FASM features to eblif parameters. Example: .. code-block:: xml INIT[31:0] = INIT_00 INIT[63:32] = INIT_01 The FASM feature is on the left hand side of the equals. When setting a parameter with multiple bits, the bit range must be specified. If the parameter is a single bit, the bit range is not required, but can be supplied for clarity. The right hand side is the parameter name from eblif. If the parameter name is not found in the eblif, that FASM feature will not be emitted. No errors or warnings will be generated for unused parameters from eblif or unused mappings between eblif parameters and FASM parameters to allow for flexibility in the synthesis output. This does mean it is important to check spelling of the metadata, and create tests that the mapping is working as expected. Also note that "genfasm" will not accept "x" (unknown/don't care) or "z" (high impedance) values in parameters. Prior to emitting the eblif for place and route, ensure that all parameters that will be mapped to FASM have a valid "1" or "0".