You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
T. Meissner 3ae59c3b5c Use neorv-repo top level instead of local one 2 years ago
blink blink & uart_reg designs are working now 2 years ago
cryptocores@302ad79ced Add cryptocores as git submodule 2 years ago
lib Add CC_BRAM_20K and CC_BRAM_40K to rtl components package 2 years ago
neorv32@3bd0835ac5 Update neorv32 submodule 2 years ago
neorv32_aes Use neorv-repo top level instead of local one 2 years ago
uart_aes Add uart_aes design, simulation & fpga-flow 2 years ago
uart_loop Use random stimuli in uart_loop testbench 2 years ago
uart_reg Use random stimuli in uart_loop testbench 2 years ago
uart_trng Use random stimuli in uart_loop testbench 2 years ago
.gitmodules Add cryptocores as git submodule 2 years ago
LICENSE.md Add license 2 years ago
README.md Add info about neorv32_aes and uart_aes to README 2 years ago

README.md

gatemate_experiments

Ongoing experiments with the Cologne Chip's GateMate FPGA architecture. All experiments are done with teh GateMate FPGA Starter (Eval) Kit.

HINT:

This project uses external projects (a neorv32 fork & cryptocores), which are redistributed as submodules. To get & nitialize the submodule, please use the --recursive option when cloning this repository. Use git submodule update --recursive to update the submodule if you already chaked out the main repository.

Designs

Simple design which should display a blinking LED waving from LED1-LED8 of the GateMate FPGA Starter Kit. It uses CC_PLL & CC_CFG_END primitives of the GateMate FPGA.

neorv32_aes

Try to implement a neorv32 processor with a AES-CTR custom function on the GateMate FPGA. However, it only works in simulation at the moment.

uart_aes

AES-CTR unit which can be accessed through UART. It uses CC_PLL & CC_CFG_END primitives of the GateMate FPGA. It contains 5 registers storing values of one byte each. The first received byte on the UART contains command & address:

  • 7 reserved
  • 6:4 register address
  • 3:0 command (0x0 read, 0x1 write)

In case of a write command, the payload has to follow with the next byte. In case of a read command, the value of the addressed register is returned on the axis out port.

Register map:

  1. ctrl 1 byte (bit meaning: 0 reset, 1 CTR start, 2 AES start 3 AES finished)
  2. key 16 byte
  3. nonce 12 byte
  4. din 16 byte
  5. dout 16 byte

Content of registers bigger than one byte can be accessed by sending read/write commands for each of the bytes.

Here is a simple example:

First fill the key register with ascending bytes.

11 01 11 23 11 45 11 67 11 89 11 AB 11 CD 11 EF 11 01 11 23 11 45 11 67 11 89 11 AB 11 CD 11 EF

Next fill the nonce register with ascending bytes.

21 01 21 23 21 45 21 67 21 89 21 AB 21 CD 21 EF 21 01 21 23 21 45 21 67

Now fill the din register with ascending bytes.

31 01 31 23 31 45 31 67 31 89 31 AB 31 CD 31 EF 31 01 31 23 31 45 31 67 31 89 31 AB 31 CD 31 EF

Finally, set bit 1 & 2 in control register to start a new AES-CTR operation.

01 06

Check bit 3 of control register to know when AES-CTR calculation is finished. All other bits of control register are reset when AES-CTR calculation is finished.

00 returns 80

Now you can read the encrypted data from the dout register.

40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40

returns (hopefully)

A0 55 A0 62 BC DD C3 4C 33 FE 9F A6 0C FB 6F 2D

You can start another AES-CTR round without restarting the counter (nonce register isn't used) ommiting bit 1 of the control register.

01 04

Control registers bit 0 is used to reset registers 0 - 3.

01 01

uart_loop

Simple UART loop with UART RX & TX units and FIFO buffer between. It uses CC_PLL & CC_CFG_END primitives of the GateMate FPGA. With fifo depth >= 18 Yosys is infering CC_BRAM_20K instead of registers.

Beware: The simulation model of CC_BRAM_20K seems to be incorrect, so better set fifo depth < 18 or use yosys option -nobram when synthesizing the model for post-synthesis & post-implementation simulation.

uart_reg

Register file which can be accessed through UART. It uses CC_PLL & CC_CFG_END primitives of the GateMate FPGA. It contains 8 registers storing values of one byte each. The first received byte on the axis in port contains command & address:

  • 7 reserved
  • 6:4 register address
  • 3:0 command (0x0 read, 0x1 write)

In case of a write command, the payload has to follow with the next byte. In case of a read command, the value of the addressed register is returned on the axis out port. Register at address 0 is special. It contains the version and is read-only. Writes to that register are ignored.

uart_trng

An implementation of a TRNG which allows to read random data from the FPGA via UART. Inclusive a software tool for easy access. Random generation is based on a fibonacci ring oscillator (FiRo) with toggle flip-flop and von Neumann post-processing.

Further Ressources