|
|
- # About the source of this VexRiscv-Simulation
- This is a stipped down version of the pqriscv resporitory:
- https://github.com/mupq/pqriscv
- The original README of this repository starts below and might not fit for all functionality anymore.
- You might want to read the README in the root folder of this repo instead.
- Modifications: Thorsten Knoll, Oct 2020
-
- # PQVexRiscV
- [VexRiscv](https://github.com/SpinalHDL/VexRiscv) based Target platforms
- for the [pqriscv](https://github.com/mupq/pqriscv) project
-
- ## Introduction
- The goal of this project is to implement a simple test-platform for the
- VexRiscv CPU, to be used as a reference platform for benchmarking and
- experimenting with PQC scheme implementations.
-
- ## Setup
- You'll need the following
-
- * Java JDK **==** 1.8
- * [SBT](https://www.scala-sbt.org) >= 1.2.8, the Scala Build Tool
- * (For iCE40 based FPGAs) [Icestorm FPGA Toolchain](http://www.clifford.at/icestorm/), including [NextPNR](https://github.com/YosysHQ/nextpnr)
- * (For Xilinx based FPGAs) Vivado ~= 2018.3 (probably also works with older and newer versions)
- * (For the Simulator) [Verilator](https://www.veripool.org/wiki/verilator)
- * (Optionally for Debugging) [OpenOCD for VexRiscv](https://github.com/SpinalHDL/openocd_riscv)
-
- ## Synthesis
- This project (and VexRiscv) uses the SpinalHDL language, which is
- essentially a DSL for hardware design on top of the Scala language.
- The Scala sources will then generate equivalent Verilog (or VHDL) of
- circuits described in SpinalHDL.
- So to create a bitstream for a FPGA, you'll have to generate the verilog
- file first and then run synthesis.
-
- Just run `sbt` in the project root and run any of the main classes to
- generate the verilog source for one of the targets.
- The `rtl` folder contains a Makefile to generate the bitstream for the
- FPGAs (the Makefile will also run `sbt` to generate the Verilog).
- For example:
-
- ```sh
- make -C rtl TARGETS=PQVexRiscvUP5K
- ```
-
- ## Simulation
- Simulating a VexRiscv core is also possible.
-
- ```sh
- sbt "runMain mupq.PQVexRiscvSim --init initfile.bin --ram 256,128 --uart uartoutput.txt"
- ```
-
- Adapt the options to your liking. The `--init` option points to a binary
- file which is loaded into the simulated RAM as initialization. Remove
- the option to leave the RAM blank, you can also load your binary via
- OpenOCD+GDB.
-
- The `--ram` option determines the memory architecture. The
- simulator will add a X KiB sized block of RAM to the memory architecture
- for each integer. Default is two blocks of ram, one for meant for code,
- one for data. The RAM blocks start at address `0x80000000` of the
- VexRiscv core and are placed back-to-back.
-
- The `--uart` block may point to a file to which the simulated UART
- output of the core is appended. When this option is skipped, UART is
- redirected to stdout.
-
- ## OpenOCD for VexRiscv
- All boards (including the simulator) support debugging via a JTAG port.
- For that you'll need a suitable debugging adapter (anything FT2232
- should do) and [OpenOCD port for VexRiscv](https://github.com/SpinalHDL/openocd_riscv).
- You can use the following to compile a stripped down version of the
- tool, which also adds the suffix `-vexriscv` to the program name, as
- well as placing all the data into a different dir, so the installation
- won't clash with any other OpenOCD version on your system. Adapt the
- prefix/datarootdir to your taste.
-
- ```sh
- ./bootstrap
- ./configure --prefix=/usr/local --program-suffix=-vexriscv \
- --datarootdir=/usr/local/share/vexriscv --enable-maintainer-mode \
- --disable-werror --enable-ft232r --enable-ftdi --enable-jtag_vpi \
- --disable-aice --disable-amtjtagaccel --disable-armjtagew \
- --disable-assert --disable-at91rm9200 --disable-bcm2835gpio \
- --disable-buspira --disable-cmsis-dap --disable-doxygen-html \
- --disable-doxygen-pdf --disable-dummy --disable-ep93xx \
- --disable-gw16012 --disable-imx_gpio --disable-jlink \
- --disable-kitprog --disable-minidriver-dummy --disable-oocd_trace \
- --disable-opendous --disable-openjtag --disable-osbdm \
- --disable-parport --disable-parport-giveio --disable-parport-ppdev \
- --disable-presto --disable-remote-bitbang --disable-rlink \
- --disable-stlink --disable-sysfsgpio --disable-ti-icdi \
- --disable-ulink --disable-usb-blaster --disable-usb-blaster-2 \
- --disable-usbprog --disable-verbose-jtag-io \
- --disable-verbose-usb-comms --disable-verbose-usb-io \
- --disable-vsllink --disable-xds110 --disable-zy1000 \
- --disable-zy1000-master
- make
- # sudo make install
- ```
-
- Some templates for connecting OpenOCD and a Debug adapter to the boards
- are at the ready in the project root. For example:
-
- ```sh
- openocd-vexriscv -f pqvexriscvsim.cfg
- ```
-
- Since OpenOCD opens up a gdbserver, you can debug on your target with
- GDB. For example:
-
- ```sh
- riscv64-unknown-elf-gdb -ex 'set remotetimeout 10' -ex 'target remote :3333' -ex load -ex 'break main' my_awesome_program.elf
- ```
-
- ## FPGA Platforms
- This project will support multiple FPGA targets in future:
-
- * [iCE40 UltraPlus 5K](https://www.latticesemi.com/en/Products/FPGAandCPLD/iCE40UltraPlus) as, for example, present in the [iCE40 UltraPlus Breakout Board](https://www.latticesemi.com/en/Products/DevelopmentBoardsAndKits/iCE40UltraPlusBreakoutBoard)
- * WIP: [Icoboard](http://icoboard.org/), which in turn uses the [iCE40 HX 8K](https://www.latticesemi.com/Products/FPGAandCPLD/iCE40)
- * WIP: [Xilinx 7 Series](https://www.xilinx.com/products/silicon-devices/fpga.html), with an example file for the [Digilent Arty A7 board](https://store.digilentinc.com/arty-a7-artix-7-fpga-development-board-for-makers-and-hobbyists/)
-
- ### iCE40 UltraPlus 5k
- A basic design with the default VexRiscv plugins should fit on the iCE40
- UP5K.
- As the UP5K features 8 DSP blocks, a non-blocking multiplier will fit
- comfortably.
- Furthermore, four 32kb sized SRAM blocks are present on the FPGA, which
- are used to implement two separate 64kb large blocks on the memory bus.
- You should link your code to the lower half (starting `0x80000000`), and
- stack / data to the upper half (starting `0x80010000`).
-
- The `rtl` folder contains a constraint file to place the design on the
- UltraPlus Breakout Board (though other boards should work fine, as long
- as the use the UP5K, just adapt the PCF as necessary).
- It exposes the JTAG and UART pins to IO ports located on header B as
- follows:
-
- | Function | Pin |
- |------------|---------|
- | JTAG `TDO` | iob_23b |
- | JTAG `TCK` | iob_25b |
- | JTAG `TDI` | iob_24a |
- | JTAG `TMS` | iob_29b |
- | UART `TXD` | iob_8a |
- | UART `RXD` | iob_9b |
-
- You can use any FTDI FT2232H or FT232H based debugger probe together
- with `openocd-vexriscv`, just adapt the connection script
- `PQVexRiscvUP5K.cfg` accordingly.
- Tip: You could use the
- [FT_PROG](https://www.ftdichip.com/Support/Utilities.htm#FT_PROG) to
- change the serial number of a generic FT232H breakout board [(e,g, the
- Adafruit FT232H Breakout board)](https://www.adafruit.com/product/2264).
- Add a line `ftdi_serial "XXX"` to the connection script, and `openocd`
- will automatically pick the right FTDI.
- Another well known FTDI based probe is the [Olimex
- ARM-USB-TINY-H](https://www.olimex.com/Products/ARM/JTAG/ARM-USB-TINY-H/)
- (see the example `openocd-vexriscv` connection script for the Icoboard
- `pqvexriscvicoboard.cfg`).
-
- ### Icoboarda (WIP)
- This FPGA target is still a heavy work in progress.
- The FPGA itself has more LUTs than the UP5K, however, doesn't feature
- any DSPs.
- Thus, the design will likely use a smaller multi-cycle multiplier to
- implement the multiplication instruction.
- The large SRAM blocks of the UP5K are also missing, however, the
- Icoboard offers a 8MBit large SRAM chip, which will be used for
- code **and** data.
-
- ### Xilinx 7 Series
- The Digilent Arty A7 board uses the Xilinx Artix-7 XC7A35T (or XC7A100T
- depending on the model), which will comfortably fit even larger variants
- of the VexRiscv core).
- The Arty board also exists in other variants using the Spartan-7 series
- chip, which should also be large enough for the VexRiscv.
- Similarly to the UP5K, the default design will use two separate 64kb
- blocks for code and data each.
-
- On the Arty Boards, the UART is exposed on the shared FPGA configuration
- and UART USB port of the board.
- The JTAG (for the VexRiscv core, **not** the JTAG for the FPGA chip) is
- exposed on the PMOD JD connector.
-
- | Function | Pin (PMOD JD) |
- |----------|---------------|
- | `TDO` | 1 |
- | `TCK` | 3 |
- | `TDI` | 7 |
- | `TMS` | 8 |
-
- If you use the Olimex ARM-USB-TINY-H, you'll also need to connect the
- VREF.
- Note, that the pinout is exactly the same as the [SiFive Freedom E310
- Arty FPGA Dev Kit](https://github.com/sifive/freedom), except that
- the `nRST`, `nTRST` remain unused.
-
- ## Internals
-
- *TODO*: Write up some infos on the platforms, what features of VexRiscv
- are enabled, how the memory architecture works, ...
|