From 149087b880d97c229132e76647e63bfcdffee9a0 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Wed, 3 Feb 2021 14:36:32 -0800 Subject: Add README about initial state of FPGA interchange implementation. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- fpga_interchange/README.md | 170 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 fpga_interchange/README.md (limited to 'fpga_interchange/README.md') diff --git a/fpga_interchange/README.md b/fpga_interchange/README.md new file mode 100644 index 00000000..3739b238 --- /dev/null +++ b/fpga_interchange/README.md @@ -0,0 +1,170 @@ +## FPGA interchange nextpnr architecture + +This nextpnr architecture is a meta architecture that in theory will implement +any architecture that emits a complete FPGA interchange device database. + +### FPGA interchange + +The FPGA interchange is a set of file formats intended to describe any modern +island based FPGA. It consists of three primary file formats: + + - Device database + - This is a description of a particular FPGA fabric. This description + includes placement locations, placement constraints and a complete + description of the routing fabric. + - This file will also include timing information once added. + + - Logical netlist + - This is the output of a synthesis tool. This is equivalent to the + Yosys JSON format, EDIF, or eblif. + - As part of future nextpnr development, a frontend will be added that + takes this format as input. + + - Physical netlist + - This is the output of a place and route tool. It can describe a clustered + design, a partially or fully placed design, and a partially or fully + routed design. + +### Current status + +This architecture implementation can be compiled in conjunction with a FPGA +interchange device database, and the outputs from +`fpga_interchange.nextpnr_emit`, which is part of the +(python-fpga-interchange)[https://github.com/SymbiFlow/python-fpga-interchange/] +library. + +The current implementation is missing essential features for place and route. +As these features are added, this implementation will become more useful. + + - [ ] Placement constraints are unimplemented, meaning invalid or unroutable + designs can be generated from the placer. + - [ ] Logical netlist macro expansion is not implemented, meaning that any + macro primitives are unplacable. Common macro primitives examples are + differential IO buffers (IBUFDS) and some LUT RAM (e.g. RAM64X1D). + - [ ] Cell -> BEL pin mapping is not in place, meaning any primitives that + have different BEL pins with respect to their cell pins will not be + routable. + - [ ] Nextpnr only allows for cell -> BEL pin maps that are 1 to 1. The + FPGA interchange accomidates cell -> BEL pin maps that include 1 to + many relationship for sinks. A common primitives that uses 1 to many + maps are the RAMB18E1. + - [ ] The router lookahead is missing, meaning that router runtime + performance will be terrible. + - [ ] Physical netlist backend is missing, so even if + `nextpnr-fpga_interchange` completes successfully, there is no way to + generate output that can be consumed by downstream tools. + - [ ] XDC parsing and port constraints are unimplemented, so IO pins cannot + be fixed. The chipdb BBA output is also missing package pin data, so + only site constraints are currently possible. Eventually the chipdb BBA + should also include package pin data to allow for ports to be bound to + package pins. + - [ ] The routing graph that is currently emitted does not have ground and + VCC networks, so all signals must currently be tied to an IO signal. + Site pins being tied to constants also needs handling so that site + local inverters are used rather than routing signals suboptimally. + - [ ] Pseudo pips (e.g. pips that consume BELs and or site resources) should + block their respective resources. This effects designs that have some + routing in place before placement. + - [ ] Pseudo site pips (e.g. site pips that route through BELs) should block + their respective resources. Without this, using some pseudo site pips + could result in invalid placements. + - [ ] Timing information is missing from the FPGA interchange device + database, so it is also currently missing from the FPGA interchange + architecture. Once timing information is added to the device database + schema, it needs to be added to the architecture. + +#### FPGA interchange fabrics + +Currently only Xilinx 7-series, UltraScale and UltraScale+ fabrics have a +device database generator, via (RapidWright)[https://github.com/Xilinx/RapidWright]. + +##### Artix 35T example + +Download RapidWright and generate the device database. +``` +# FIXME: Use main branch once interchange branch is merged. +git clone -b interchange https://github.com/Xilinx/RapidWright.git +cd RapidWright +make update_jars + +# FIXME: Current RapidWright jars generate database with duplicate PIPs +# https://github.com/Xilinx/RapidWright/issues/127 +# Remove this wget once latest RapidWright JAR is published. +wget https://github.com/Xilinx/RapidWright/releases/download/v2020.2.1-beta/rapidwright-api-lib-2020.2.1_update1.jar +mv rapidwright-api-lib-2020.2.1_update1.jar jars/rapidwright-api-lib-2020.2.0.jar + +./scripts/invoke_rapidwright.sh com.xilinx.rapidwright.interchange.DeviceResourcesExample xc7a35tcpg236-1 +export RAPIDWRIGHT_PATH=$(pwd) +export INTERCHANGE_DIR=$(pwd)/interchange +``` + +Install python FPGA interchange library. +``` +git clone https://github.com/SymbiFlow/python-fpga-interchange.git +cd python-fpga-interchange +pip install -r requirements.txt +``` + +Patch device database with cell constraints and LUT annotations: +``` +python3 -mfpga_interchange.patch \ + --schema_dir ${INTERCHANGE_DIR} \ + --schema device \ + --patch_path constraints \ + --patch_format yaml \ + ${RAPIDWRIGHT_PATH}/xc7a35tcpg236-1.device \ + test_data/series7_constraints.yaml \ + xc7a35tcpg236-1_constraints.device +python3 -mfpga_interchange.patch \ + --schema_dir ${INTERCHANGE_DIR} \ + --schema device \ + --patch_path lutDefinitions \ + --patch_format yaml \ + xc7a35tcpg236-1_constraints.device \ + test_data/series7_luts.yaml \ + xc7a35tcpg236-1_constraints_luts.device +python3 -mfpga_interchange.patch \ + --schema_dir ${RAPIDWRIGHT_PATH}/interchange/ \ + --schema device \ + --patch_path lutDefinitions \ + --patch_format yaml \ + xc7a35tcpg236-1_constraints.device \ + test_data/series7_luts.yaml \ + xc7a35tcpg236-1_constraints_luts.device +``` + +Generate nextpnr BBA and constids.inc from device database: +``` +python3 -mfpga_interchange.nextpnr_emit \ + --schema_dir ${INTERCHANGE_DIR} \ + --output_dir ${NEXTPNR_DIR}/fpga_interchange/ \ + --device xc7a35tcpg236-1_constraints_luts.device +``` + +Build nextpnr: + +``` +cd ${NEXTPNR_DIR} +cmake -DARCH=fpga_interchange . +make -j +``` + +Compile generated BBA: +``` +bba/bbasm -l fpga_interchange/chipdb.bba fpga_interchange/chipdb.bin +``` + +Run nextpnr archcheck: +``` +./nextpnr-fpga_interchange --chipdb fpga_interchange/chipdb.bin --test +``` + +Once nextpnr can complete the place and route task and output the physical +netlist, RapidWright can be used to generate a DCP suitable for bitstream +output and DRC checks. + +``` +${RAPIDWRIGHT_PATH}/scripts/invoke_rapidwright.sh \ + com.xilinx.rapidwright.interchange.PhysicalNetlistToDcp \ + +``` -- cgit v1.2.3 From 90ece77f8d19eb41103096d6fa7b69665d7d5336 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Wed, 3 Feb 2021 15:05:12 -0800 Subject: Fix URLs in Markdown. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- fpga_interchange/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'fpga_interchange/README.md') diff --git a/fpga_interchange/README.md b/fpga_interchange/README.md index 3739b238..6c45105c 100644 --- a/fpga_interchange/README.md +++ b/fpga_interchange/README.md @@ -30,7 +30,7 @@ island based FPGA. It consists of three primary file formats: This architecture implementation can be compiled in conjunction with a FPGA interchange device database, and the outputs from `fpga_interchange.nextpnr_emit`, which is part of the -(python-fpga-interchange)[https://github.com/SymbiFlow/python-fpga-interchange/] +[python-fpga-interchange](https://github.com/SymbiFlow/python-fpga-interchange/) library. The current implementation is missing essential features for place and route. @@ -76,7 +76,7 @@ As these features are added, this implementation will become more useful. #### FPGA interchange fabrics Currently only Xilinx 7-series, UltraScale and UltraScale+ fabrics have a -device database generator, via (RapidWright)[https://github.com/Xilinx/RapidWright]. +device database generator, via [RapidWright](https://github.com/Xilinx/RapidWright). ##### Artix 35T example -- cgit v1.2.3 From d4f66a73c11c637666a5c4d76a1aadbbf9b919e7 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Wed, 3 Feb 2021 15:09:26 -0800 Subject: Fix fpga_interchange/README.md duplicate patch statement. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- fpga_interchange/README.md | 8 -------- 1 file changed, 8 deletions(-) (limited to 'fpga_interchange/README.md') diff --git a/fpga_interchange/README.md b/fpga_interchange/README.md index 6c45105c..17f9cfdc 100644 --- a/fpga_interchange/README.md +++ b/fpga_interchange/README.md @@ -123,14 +123,6 @@ python3 -mfpga_interchange.patch \ xc7a35tcpg236-1_constraints.device \ test_data/series7_luts.yaml \ xc7a35tcpg236-1_constraints_luts.device -python3 -mfpga_interchange.patch \ - --schema_dir ${RAPIDWRIGHT_PATH}/interchange/ \ - --schema device \ - --patch_path lutDefinitions \ - --patch_format yaml \ - xc7a35tcpg236-1_constraints.device \ - test_data/series7_luts.yaml \ - xc7a35tcpg236-1_constraints_luts.device ``` Generate nextpnr BBA and constids.inc from device database: -- cgit v1.2.3 From 58c90184f6cad3a3648fab4e9944d0c94a0a2106 Mon Sep 17 00:00:00 2001 From: Keith Rothman <537074+litghost@users.noreply.github.com> Date: Thu, 4 Feb 2021 12:35:13 -0800 Subject: Correct some typos. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com> --- fpga_interchange/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'fpga_interchange/README.md') diff --git a/fpga_interchange/README.md b/fpga_interchange/README.md index 17f9cfdc..d0c4f2bf 100644 --- a/fpga_interchange/README.md +++ b/fpga_interchange/README.md @@ -39,14 +39,14 @@ As these features are added, this implementation will become more useful. - [ ] Placement constraints are unimplemented, meaning invalid or unroutable designs can be generated from the placer. - [ ] Logical netlist macro expansion is not implemented, meaning that any - macro primitives are unplacable. Common macro primitives examples are + macro primitives are unplaceable. Common macro primitives examples are differential IO buffers (IBUFDS) and some LUT RAM (e.g. RAM64X1D). - [ ] Cell -> BEL pin mapping is not in place, meaning any primitives that have different BEL pins with respect to their cell pins will not be routable. - [ ] Nextpnr only allows for cell -> BEL pin maps that are 1 to 1. The - FPGA interchange accomidates cell -> BEL pin maps that include 1 to - many relationship for sinks. A common primitives that uses 1 to many + FPGA interchange accommodates cell -> BEL pin maps that include 1 to + many relationships for sinks. A common primitives that uses 1 to many maps are the RAMB18E1. - [ ] The router lookahead is missing, meaning that router runtime performance will be terrible. @@ -89,7 +89,7 @@ make update_jars # FIXME: Current RapidWright jars generate database with duplicate PIPs # https://github.com/Xilinx/RapidWright/issues/127 -# Remove this wget once latest RapidWright JAR is published. +# Remove this wget once the latest RapidWright JAR is published. wget https://github.com/Xilinx/RapidWright/releases/download/v2020.2.1-beta/rapidwright-api-lib-2020.2.1_update1.jar mv rapidwright-api-lib-2020.2.1_update1.jar jars/rapidwright-api-lib-2020.2.0.jar -- cgit v1.2.3