Running the RNG to evaluate the output
In the Gomti collection, there are a few Verilog implementations for multiple targets. Currently, those implementations are under evaluation.
The RNG is "bare" version, with no conditioning component. That is, in the actual use case, it is assumed that adding conditioning component after the bare RNG.
In this article, I explain how to use an entry in Gomti, with a concrete example with TEC0117. (Other options are Tang Nano 9K and iCE40 boards.)
Tools to build
- gowin_pack / Apycula
You need to install yosys. On Debian system, you can do that by apt install yosys.
You need to build and install nextpnr-gowin yourself, as it's new. It's available from https://github.com/YosysHQ/nextpnr.git See the explanation how to build nextpnr-gowin.
To build nextpnr-gowin, you need to install Project Apicula from https://github.com/YosysHQ/apicula. To build Apicula, it assumes having a proprietary tool from vendor. Using pip, you can install Apycula . If you don't have the vendor tool on your system, simply do pip install Apycula. Apycula includes the tool gowin_pack.
Tools to flash
openFPGAloader is needed to flash bitstream to FPGA. On Debian system, you can do that by apt install openfpgaloader.
Tools to test
Please install https://github.com/usnistgov/SP800-90B_EntropyAssessment
Also, ent and dieharder are useful.
TEC0117 is a FPGA Module with GW1NR-9, which has FTDI 2232 chip.
Please purchase multiple boards of this.
Connect TEC0117 to host PC
Using USB cable, please connect TEC0117 to your host PC. You can see it's connected by lsusb.
In the output of the command, you can see something like:
Bus 001 Device 010: ID 0403:6010 Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC
Clone Gomti Repo.
Please clone the code:
$ git clone https://git.sr.ht/~gniibe/gomti $ cd gomti
The one for TEC0117 is here:
$ cd a192-192-425
Flash the bitstream
You can flash the bitstream like:
$ openFPGALoader -b tec0117 2023-03-09-gniibe-03/gomti-a192-192-425-uart-tec0117.fs
The TEC0117 board has FT2232 chip. It can be seen as /dev/ttyUSB* on your host PC. When it's /dev/ttyUSB1, please configure the TTY by:
$ stty -F /dev/ttyUSB1 raw parenb -parodd -cstopb ignpar inpck -echo -echonl 2000000
Observe the RNG output
You can observe the output:
$ hd /dev/ttyUSB1
Simple evaluation by ent can be:
$ dd if=/dev/ttyUSB1 bs=65536 iflag=fullblock count=64 | ent
You can even run dieharder (which takes a month or more):
$ dd if=/dev/ttyUSB1 iflag=fullblock bs=65534 | dieharder -g 200 -a | tee 2023-03-09-gniibe-03/3-dieharder.txt | grep --color=auto -E -e 'FAIL.*$|$'