blob: 50455a87a264abec9a42b36e4da833955d4a3ee5 [file] [log] [blame] [view]
# Project Trellis
## For FPGA Toolchain Users
Project Trellis enables a fully open-source flow for ECP5 FPGAs using [Yosys](https://github.com/YosysHQ/yosys)
for Verilog synthesis and [nextpnr](https://github.com/YosysHQ/nextpnr) for place and route.
Project Trellis itself provides the device database and tools for bitstream creation.
### Getting Started
Install the dependencies for Project Trellis:
- Python 3.5 or later, including development libraries (`python3-dev` on Ubuntu)
- A modern C++14 compiler (Clang is recommended)
- CMake 3.5 or later
- Boost including boost-python
- Git
- Recent OpenOCD for device programming (`--enable-ftdi` required if building from source)
Clone the Project Trellis repository and download the latest database:
git clone --recursive https://github.com/SymbiFlow/prjtrellis
Install _libtrellis_ and associated tools. You _must_ run `cmake` from the libtrellis directory.
Out-of-tree builds are currently unsupported when coupled with `nextpnr`:
cd libtrellis
cmake -DCMAKE_INSTALL_PREFIX=/usr .
make
sudo make install
Clone and install **latest git master** versions (Yosys 0.8 is not sufficient for ECP5 development) of [Yosys](https://github.com/YosysHQ/yosys)
and [nextpnr](https://github.com/YosysHQ/nextpnr) according to their own instructions. Ensure
to include the ECP5 architecture when building nextpnr; and point it towards your prjtrellis
folder.
You should now be able to build the [examples](examples).
### Current Status
The following features are currently working in the Yosys/nextpnr/Trellis flow.
- Logic slice functionality, including carries
- Distributed RAM inside logic slices
- All internal interconnect
- Basic IO, including tristate, using `TRELLIS_IO` primitives; LPF files and DDR inputs/outputs
- Block RAM, using either inference in Yosys or manual instantiation of the DP16KD primitive
- Multipliers using manual instantiation of the MULT18X18D primitive. Inference and more advanced DSP features
are not yet supported.
- Global networks (automatically promoted and routed in nextpnr)
- PLLs
- Transcievers (DCUs)
### Development Boards
Project Trellis supports all ECP5 devices and should work with any development board. The following
boards have been tested and confirmed working:
- [Lattice ECP5-5G Versa Development Kit](http://www.latticesemi.com/Products/DevelopmentBoardsAndKits/ECP55GVersaDevKit.aspx)
- [Lattice ECP5 Evaluation Board](http://www.latticesemi.com/ecp5-evaluation)
- [Radiona ULX3S](https://github.com/emard/ulx3s) (open hardware)
- [TinyFPGA](https://tinyfpga.com/) Ex (coming soon)
## For Developers
Project Trellis documents the Lattice ECP5 bit-stream format and internal architecture. Current documentation is
located in machine-readable format in [prjtrellis-db](https://github.com/SymbiFlow/prjtrellis-db)
and is also [published online as HTML](https://symbiflow.github.io/prjtrellis-db/).
This repository contains both tools and scripts which allow you to document the
bit-stream format of Lattice ECP5 series FPGAs.
More documentation can be found published on
[prjtrellis ReadTheDocs site](http://prjtrellis.readthedocs.io/en/latest/) -
this includes;
* [Highlevel Bitstream Architecture](http://prjtrellis.readthedocs.io/en/latest/architecture/overview.html)
* [Overview of DB Development Process](http://prjtrellis.readthedocs.io/en/latest/db_dev_process/overview.html)
* [libtrellis Documentation](http://prjtrellis.readthedocs.io/en/latest/libtrellis/overview.html)
This follows the lead of
[Project X-Ray](https://github.com/SymbiFlow/prjxray) - which is documenting
the bitstream format for the Xilinx Series 7 devices.
### Quickstart Guide
Currently Project Trellis is tested on Arch Linux, Ubuntu 17.10 and
Ubuntu 16.04.
Install the dependencies:
- Lattice Diamond 3.10 **(only required if you want to run fuzzers, not required as an end user or to explore the database)**
- Python 3.5 or later, including development libraries (`python3-dev` on Ubuntu)
- A modern C++14 compiler (Clang is recommended)
- CMake 3.5 or later
- Boost including boost-python
For a generic environment:
source environment.sh
Optionally, modify `user_environment.sh` and rerun the above command if needed.
Build libtrellis:
cd libtrellis
cmake .
make
(Re-)creating parts of the database, for example LUT interconnect:
cd fuzzers/ECP5/001-plc2_routing
TRELLIS_JOBS=`nproc` python3 fuzzer.py
## Process
The documentation is done through a "black box" process were Diamond is asked to
generate a large number of designs which then used to create bitstreams. The
resulting bit streams are then cross correlated to discover what different bits
do.
This follows the same process as
[Project X-Ray](https://github.com/SymbiFlow/prjxray) -
[more documentation can be found here](https://prjxray.readthedocs.org).
### Parts
#### [Minitests](minitests)
There are also "minitests" which are small tests of features used to build fuzers.
#### [Fuzzers](fuzzers)
Fuzzers are the scripts which generate the large number of bitstream.
They are called "fuzzers" because they follow an approach similar to the
[idea of software testing through fuzzing](https://en.wikipedia.org/wiki/Fuzzing).
#### [Tools](tools)
Miscellaneous tools for exploring the database and experimenting with bitstreams.
#### [Util](util)
Python libraries used for fuzzers and other purposes
#### [libtrellis](libtrellis)
libtrellis is a library for manipulating ECP5 bitstreams, tiles and the Project
Trellis databases. It is written with C++, with Python bindings exposed using
Boost::Python so that fuzzers and utilities can be written in Python.
### Database
Instead of downloading the
[compiled part database](https://github.com/SymbiFlow/prjtrellis-db),
it can also be created from scratch. However, this procedure
takes several hours, even on a decent workstation.
First, the empty reference bitstreams and the tile layout must be created
based on the initial knowledge provided in the [metadata](metadata)
directory.
Then, running all fuzzers in order will produce a database which
documents the bitstream format in the database directory.
UMG and UM5G devices may be stripped from [devices.json](devices.json)
to ceate the database only for non-SERDES chip variants.
Obviously, SERDES related fuzzers are not able to run in this case.
source environment.sh
./create-empty-db.sh
cd fuzzers/ECP5/001-plc2_routing
TRELLIS_JOBS=`nproc` python3 fuzzer.py
... (run more fuzzers)
## Credits
Thanks to @tinyfpga for the original inspiration, and @mithro for the name and initial support.
Thanks to @q3k, @emard and @tinyfpga for their donations of ECP5 hardware that have made real-world
testing and demos possible.
## Contributing
There are a couple of guidelines when contributing to Project Trellis which are
listed here.
### Sending
All contributions should be sent as
[GitHub Pull requests](https://help.github.com/articles/creating-a-pull-request-from-a-fork/).
### License
All code in the Project Trellis repository is licensed under the very permissive
[ISC Licence](COPYING). A copy can be found in the [`COPYING`](COPYING) file.
All new contributions must also be released under this license.
### Code of Conduct
By contributing you agree to the [code of conduct](CODE_OF_CONDUCT.md). We
follow the open source best practice of using the [Contributor
Covenant](https://www.contributor-covenant.org/) for our Code of Conduct.