Add random number generator and implement the darn instruction
authorPaul Mackerras <paulus@ozlabs.org>
Wed, 5 Aug 2020 05:28:45 +0000 (15:28 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Thu, 6 Aug 2020 01:31:13 +0000 (11:31 +1000)
commit1a7aebeef80be3ae31e844aa83c9d7521cce8bed
tree4885df56bc4ff8a08bbae9fa53fa531693c1c87e
parent290b05f97da6255734b4ff3c7c7a913cf99301f9
Add random number generator and implement the darn instruction

This adds a true random number generator for the Xilinx FPGAs which
uses a set of chaotic ring oscillators to generate random bits and
then passes them through a Linear Hybrid Cellular Automaton (LHCA) to
remove bias, as described in "High Speed True Random Number Generators
in Xilinx FPGAs" by Catalin Baetoniu of Xilinx Inc., in:

https://pdfs.semanticscholar.org/83ac/9e9c1bb3dad5180654984604c8d5d8137412.pdf

This requires adding a .xdc file to tell vivado that the combinatorial
loops that form the ring oscillators are intentional.  The same
code should work on other FPGAs as well if their tools can be told to
accept the combinatorial loops.

For simulation, the random.vhdl module gets compiled in, which uses
the pseudorand() function to generate random numbers.

Synthesis using yosys uses nonrandom.vhdl, which always signals an
error, causing darn to return 0xffff_ffff_ffff_ffff.

This adds an implementation of the darn instruction.  Darn can return
either raw or conditioned random numbers.  On Xilinx FPGAs, reading a
raw random number gives the output of the ring oscillators, and
reading a conditioned random number gives the output of the LHCA.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Makefile
decode1.vhdl
execute1.vhdl
fpga/fpga-random.vhdl [new file with mode: 0644]
fpga/fpga-random.xdc [new file with mode: 0644]
microwatt.core
nonrandom.vhdl [new file with mode: 0644]
random.vhdl [new file with mode: 0644]