Bitstream generation

Generate Bitstream <– Meta Data

User guide

We have provided two methods for the user to generate bitstreams. The first method is done using the CLI provided and the second method which the user calls the script manually. The first method is recommended, as it provides all the necessary information to generate the bitstream. The second method is provided for cases where the user has decided not to work with the FABulous project structure.

Generate bitstream using CLI

To generate a bitstream using the CLI, the user must first generate the bitstream specification using the CLI. To generate the bitstream specification, we can call the gen_bitstream_spec command from the CLI. It is expected that the user had also run synthesis and place and route for the design, which generates the .fasm file of the design.

To generate the bitstream, the user can call the gen_bitstream_binary <design.fasm> command from the CLI, where the design.fasm is the .fasm file generated by synthesis and place and route.

The resulting bitstream is placed in the same directory as where the fasm file is located and named as design.bin.

Manually generate bitstream

To generate the necessary materials to generate a bitstream, run $FAB_ROOT/fabric_generator/fabric_gen.py with the -GenBitstreamSpec flag.

With the FASM file generated by Nextpnr or VPR, you can run this command for bitstream generation.

python3 $FAB_ROOT/fabric_cad/bit_gen.py -genBitstream <fasm_file> bitStreamSpec.bin <bitstream file>

<fasm_file>

the FASM file generated by Nextpnr or VPR in previous compilation

<bitstream_file>

User can define the output binary file name with .bin format

Example

The following command lowers the FASM representation of the placed and routed sequential_16bit_en design into a bitstream file.

python3 $FAB_ROOT/fabric_cad/bit_gen.py -genBitstream 16bit_sequential_en.fasm bitStreamSpec.bin 16bit_sequential_en_output.bin

Changes in the primitives or adding new primitives

For a change in the primitives or adding new primitives, you can simply add them within the primitive file. As an example, in the LUT4c_frame_config primitive description below there are 16 configuration bits for INIT values, 1 configuration bit FF for the flip-flop bypass switch, 1 configuration bit IOmux for the carry input switch and 1 configuration bit SET_NORESET for the SET or RESET switch, which means there are 19 configuration bits for each LUT4 parameters setting. The number of entries in the mapping needs to match the NoConfigBits otherwise, the tool will give an error.

(*FABulous, BelMap,
INIT=0,
INIT[1]=1,
INIT[2]=2,
INIT[3]=3,
INIT[4]=4,
INIT[5]=5,
INIT[6]=6,
INIT[7]=7,
INIT[8]=8,
INIT[9]=9,
INIT[10]=10,
INIT[11]=11,
INIT[12]=12,
INIT[13]=13,
INIT[14]=14,
INIT[15]=15,
FF=16,
IOmux=17,
SET_NORESET=18
*)
module LUT4c_frame_config (I0, I1, I2, I3, O, Ci, Co, SR, EN, UserCLK, ConfigBits);
parameter NoConfigBits = 19 ;
...
endmodule

(to do)