WIP digitalcore macro. Doesn't harden yet
3 files changed
tree: 6067c7f558ff088b581d99138cdb0938b2e68ded
  1. .github/
  2. def/
  3. docs/
  4. gds/
  5. ip/
  6. lef/
  7. mag/
  8. maglef/
  9. openlane/
  10. signoff/
  11. spi/
  12. verilog/
  13. .gitignore
  14. .gitmodules
  15. info.yaml
  16. LICENSE
  17. Makefile
  18. README.md
README.md

Randsack - True Random Number Generator(s)

License

Overview

Randsack is a test chip for trying out random number generators and PUFs.

IP Blocks

  • dtop - Digital top sea of gates containing control logic and digital peripherals.
  • dgpio - GPIO peripheral.
  • collapsering_macro - Trimmable collapsing ring oscillators for generating random numbers with a configurable output divider. See ip/randsack/sch/collapsering.sch xschem schematic for design.
  • ringosc_macro - Trimmable ring oscillator.

TODO

  • GPIO peripheral for easier IO from the CPU.
  • Serializer block to output high rate data.
  • PWM block for generating audio.
  • LFSR block to take a seed value from the TRNG and generate high rate data.
  • SHA block.

Methodology, Implementation, and SPICE simulation

The more analog-like blocks like the ring oscillators are designed using stdcells in xschem and then simulated with ngspice.

Due to limited time all blocks are synthesized using the standard openlane flow instead of hand layout. The resulting netlist is inspected to ensure minimal modifications by the tools. The resulting extracted spice file is then simulated.

Unfortunately the process to do backannotated timing sims (SDF) doesn‘t appear simple. Hope is the small macros are small and that any delays are tiny and don’t cause issues.

All simulations are performed at tt/ff/ss corners to ensure reasonable performance across PVT.

A bunch of knobs are built into the design to minimize risk. All blocks feature many trim bits and output dividers in case performance ends up being too fast for the synthesized digital control blocks.

Test Busses

The output of the oscillator blocks can be muxed to output GPIOs for debug. GPIOs are limited to ~60 MHz so the internal clock dividers should be used.

References

  • Sample project README containing instructions on how to setup the chip environment.