Generate the bitstream

FPGA demo with Fpga (default bootloader)

cd $TOP/fpga/board/nexys4_ddr
make cleanall
make bitstream

The generated bitstream is located at lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.bit. This will take some time (20-60 minutes depending on your computer).

Program the bootloader on FPGA

Next, turn on the FPGA board and connect the USB cable. Now you download the bitstream to the quad-SPI on the FPGA board:

make cfgmem
make program-cfgmem

At this point, you should check that the FPGA board switches are initially all off (except SW2), and the MODE jumper is in QSPI mode and then press the PROG button.

Sample output (assuming Ethernet cable connectivity is sane)

The default bootloader assumes an Ethernet DHCP server is present, if so you should see a result similar to this:

Calling main with MAC = eee1:4
Selftest iteration 1, next buffer = 13, rx_start = 6800
Selftest matches=2/2, delay = 11
Selftest iteration 2, next buffer = 14, rx_start = 7000
Selftest matches=4/4, delay = 11
Selftest iteration 3, next buffer = 15, rx_start = 7800
Selftest matches=8/8, delay = 12
Selftest iteration 4, next buffer = 0, rx_start = 4000
Selftest matches=16/16, delay = 22
Selftest iteration 5, next buffer = 1, rx_start = 4800
Selftest matches=32/32, delay = 41
Selftest iteration 6, next buffer = 2, rx_start = 5000
Selftest matches=64/64, delay = 80
Selftest iteration 7, next buffer = 3, rx_start = 5800
Selftest matches=128/128, delay = 159
Selftest iteration 8, next buffer = 4, rx_start = 6000
Selftest matches=187/187, delay = 231

This first bit establishes that digital loopback of the Ethernet is working. If this does not appear, search your build log for timing errors.

0: 0
1: 1
2: 1
3: 1
800: 1e
801: 0
802: 0
803: 0

This bit is just probing the platform level interrupt controller with some default values.

lowRISC etherboot program
=====================================
MAC = eee1:4
MAC address = ee:e1:e2:e3:e4:e4.
eth0 MAC : EE:E1:E2:E3:E4:E4

This section is concerned with setting the MAC address, and reading it back. The least significant value read will depend on SW[15:12]

Sending DHCP_DISCOVERY
Waiting for DHCP_OFFER
Sending DHCP_REQUEST
DHCP ACK
DHCP Client IP Address:  128.232.60.123
Server IP Address:  128.232.60.8
Router address:  128.232.60.1
Net mask address:  255.255.252.0
Lease time = 43200
domain = "cl.cam.ac.uk"
server = "lowrisc4-sm"

FPGA demo with Fpga (alternative boot programs)

If you already have a compiler installed, using either the quickstart process, or using this page:

You can proceed to compile the alternative boot programs/bare-metal programs

Otherwise is suggested you proceed to the link below (or for development purposes, checkout the alternative targets)

To compile, alternative programs:

cd $TOP/fpga/board/nexys4_ddr
make target (where target is mmc, dram, hello etc.)

The generated bitstream is located at lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.new.bit. First time through, this will take some time (20-60 minutes depending on your computer).

Program the alternative boot programs on FPGA

There is a choice of programming volatile or non-volatile. Volatile programs are relatively fast to download, but naturally are lost when powered down (or overwritten, due to a bug).

Next, turn on the FPGA board and connect the USB cable. Now you download the bitstream to the quad-SPI on the FPGA board:

proceed with this command, for a volatile download:

make program-updated

or these commands for a permanent download:

make cfgmem-updated
make program-cfgmem-updated

Other useful Makefile targets

make project

Generate a Vivado project.

make verilog

Run Chisel compiler and generate the Verilog files for Rocket chip.

make vivado

Open the Vivado GUI using the current project.

make bitstream

Generate the default bitstream according to the CONFIG in Makefile and the program loaded in src/boot.mem. The default bitstream is generated at lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.bit

make <hello|dram|eth|mmc>

Generate bitstreams for bare-metal tests:

  • hello A hello world program.
  • dram A DDR RAM test.
  • mmc A 1st bootloader that loads boot.bin from SD to DDR RAM and executes boot.bin afterwards.

For each bare-metal test <test>, the executable is generated to examples/<test>.riscv. It is also converted into a hex file and copied to src/boot.mem, which then changes the default program for make bitstream and make simulation. The updated bitstream is generated at lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.new.bit

make <program|program-updated>

Download a bitstream to FPGA. Use program for lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.bit and program-updated for lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.new.bit

make <cfgmem|cfgmem-updated>

Convert a bitstream to the format suitable for quad-SPI flash on the FPGA board. Use cfgmem for lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.bit and cfgmem-updated for lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.new.bit

make <program-cfgmem|program-cfgmem-updated>

Download a bitstream to quad-SPI flash on the FPGA board. Use program-cfgmem for lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.bit and program-cfgmem-updated for lowrisc-chip-imp/lowrisc-chip-imp.runs/impl_1/chip_top.new.bit

make <clean|cleanall>

make clean will remove all generated code without removing the Vivado project files. To remove all files including the Vivado project, use make cleanall.