blob: c96d69051f5491a7ed4a9858c760a94101b5454c [file] [log] [blame] [view]
# SymbiFlow for QuickLogic FPGAs
Currently, the supported families are:
- pp3 (EOS-S3 SoC)
- qlf_k4n8
## Quickstart guide
### 1. Build F4PGA Architecture Definitions
Clone the repository:
```bash
git clone https://github.com/SymbiFlow/f4pga-arch-defs
```
Set up the environment:
```bash
make env
```
The command will automatically clone all GIT submodules, setup a Conda environment with all the necessary packages and generate the build system by invoking CMake.
### 2. Generate a bitstream for a sample design
Once the SymbiFlow environment is set up, you can perform the implementation (synthesis, placement and routing) of an example FPGA designs.
Go to the `quicklogic/<family>/tests` directory and choose a design you want to implement e.g:
```bash
cd quicklogic/pp3/tests/counter
make counter-ql-chandalar_bit
```
This will generate a binary bitstream file for the design. The resulting bitstream will be written to the `top.bit` file in the working directory of the design.
Currently supported basic designs in pp3 faimly are:
- btn_counter
- consts
- counter
- lut
- wire
For details of each of the test design please refer to its `README.md` file.
### 3. Programming the EOS S3 SoC
To simplify the programming process, some helper scripts were integrated with the flow.
The scripts can automatically configure the IOMUX of the SoC so that all top-level IO ports of the design are routed to the physical pads of the chip.
In order to generate the JLink programming script, build the following target:
```bash
make counter-ql-chandalar_jlink
```
or to generate OpenOCD script:
```bash
make counter-ql-chandalar_openocd
```
The script will contain both the bitstream and IOMUX configuration.
## Naming convention
The naming convention of all build targets is: `<design_name>-<board_name>_<stage_name>`
The `<design_name>` corresponds to the name of the design.
The `<board_name>` defines the board that the design is targetted for, possible values are `ql-chandalar` and `ql-quickfeather`
The last part `<stage_name>` defines the last stage of the flow that is to be executed.
The most important stages are:
- **eblif**
Runs Yosys synthesis and generates an EBLIF file suitable for VPR. The output EBLIF file is named `top.eblif`
- **pack**
Runs VPR packing stage. The packed design is written to the `top.net` file.
- **place**
Runs VPR placement stage. Design placement is stored in the `top.place` file. IO placement constraints for VPR are written to the `top_io.place` file.
- **route**
Runs VPR pack, place and route flow. The packed design is written to the `top.net` file. design placement and routing data is stored in the `top.place` and `top.route` files respectively. IO placement constraints for VPR are written to the `top_io.place` file.
- **analysis**
Runs VPR analysis, writes post-route netlists in BLIF and Verilog format plus an SDF file with post routing timing analysis.
- **fasm**
Generates the FPGA assembly file (a.k.a. FASM) using the routed design. The FASM file is named `top.fasm`.
- **bit**
Generates a binary bitstream file from the FASM file using the `qlfasm.py` tool. The bitstream is ready to be loaded to the FPGA.
- **jlink**
For convenience of programming the EOS S3 SoC, the `jlink` stage generates a command script which configures the IOMUX of the SoC and loads the bitstream to the FPGA. The script is ready to be executed via the *JLink commander* tool.
- **openocd**
The `openocd` stage generates an OpenOCD script with `load_bitstream` process which configures the IOMUX of the SoC and loads the bitstream to the FPGA. The script is ready to be executed via the *GDB* tool. To do so, connect to target with OpenOCD, append the generated script to command set: `-f top.openocd` and execute in GDB session `monitor load_bitstream`.
- **bit_v**
Runs the `fasm2bels` tool on the bitstream generated by the `bit` target. The ``fasm2bels`` tool converts a bitstream or a FASM file to a Verilog file containing basic elements (BELs) and connections between them. The resulting file is named `top_bit.v`
Executing a particular stage implies that all stages before it will be executed as well (if needed). They form a dependency chain.
Note: stages **jlink**, **openocd**, **bit_v** are available only for the pp3 family.
## Adding new designs to SymbiFlow
To to add a new design to the flow, and use it as a test follow the guide:
1. Create a subfolder for your design under the `quicklogic/<family>/tests` folder.
1. Add inclusion of the folder in the `quicklogic/<family>/tests/CMakeLists.txt` by adding the following line to it:
```plaintext
add_subdirectory(<your_directory_name>)
```
1. Add a `CMakeLists.txt` file to your design. Specify your design settings inside it:
```plaintext
add_fpga_target(
NAME <your_design_name>
BOARD <target_board_name>
SOURCES <verilog sources list>
INPUT_IO_FILE <PCF file with IO constraints>
SDC_FILE <SDC file with timing constraints>
)
```
The design name can be anything. For available board names please refer to the `quicklogic/<family>/boards.cmake` file. Input IO constraints have to be given in the *PCF* format. The *SDC* file argument is optional.
Please also refer to CMake files for existing designs.
All the files passed to `add_fpga_target` have to be added to the flow with `add_file_target` e.g:
```plaintext
add_file_target(FILE counter.v SCANNER_TYPE verilog)
add_file_target(FILE chandalar.pcf)
```
The verilog scanner will automatically add all the verilog dependecies explicitely included in the added file.
1. Once this is done go back to the SymbiFlow root directory and re-run the make env command to update build targets:
```bash
make env
```
1. Now enter the build directory of your project and run the appropriate target as described:
```bash
cd build/quicklogic/<family>/tests/<your_directory_name>
make <your_design_name>-<target_board_name>_bit
```