| # Design-related Tooling Scripts |
| |
| ## Life Cycle and OTP Tools |
| |
| ### OTP Memory Map Translation Script |
| |
| The `gen-otp-mmap.py` script is used to translate the OTP memory map definition Hjson file into documentation and SV package collateral. |
| The memory map definition file for top_earlgrey is currently located at `hw/ip/otp_ctrl/data/otp_ctrl_mmap.hjson`. |
| |
| The script can either be invoked via the makefile |
| ```console |
| $ cd ${PROJ_ROOT} |
| $ make -C hw otp-mmap |
| |
| ``` |
| |
| or directly using the command |
| |
| ```console |
| $ cd ${PROJ_ROOT} |
| $ ./util/design/gen-otp-mmap.py |
| ``` |
| |
| The seed value used for generating OTP-related random netlist constants can optionally be overridden with the `--seed` switch when calling the script directly. |
| Otherwise that seed value is taken from the Hjson file, or generated on-the-fly if the Hjson file does not contain a seed. |
| |
| ### Life Cycle State Encoding Generator |
| |
| The `gen-lc-state-enc.py` script is used to generate the redundant life cycle state encoding and print the constants and type definitions into the life cycle state package. |
| The life cycle definition file for top_earlgrey is currently located at `hw/ip/lc_ctrl/data/lc_ctrl_state.hjson`. |
| |
| The script can either be invoked via the makefile |
| ```console |
| $ cd ${PROJ_ROOT} |
| $ make -C hw lc-state-enc |
| |
| ``` |
| |
| or directly using the command |
| |
| ```console |
| $ cd ${PROJ_ROOT} |
| $ ./util/design/gen-lc-state-enc.py |
| ``` |
| |
| The seed value used for generating life-cycle-state-related random netlist constants can optionally be overridden with the `--seed` switch when calling the script directly. |
| Otherwise that seed value is taken from the Hjson file, or generated on-the-fly if the Hjson file does not contain a seed. |
| |
| ### OTP Preload Image Generator |
| |
| The OTP preload image generation tool builds on top of the memory map and life cycle state generation Python classes in order to transform a memory image configuration into a memory hexfile that can be used for OTP preloading in simulation and FPGA emulation runs. |
| The generated hexfile is compatible with the Verilog `$readmemh` command. |
| |
| The OTP memory image configuration file is basically an Hjson file that lists the names and corresponding values of items defined in the OTP memory map definition. |
| Further, since the life cycle state is stored in OTP, the image generator script also supports generating the correct life cycle state encodings. |
| To that end, the desired life cycle state name can be declared in the image configuration file, and the generator script looks up and assigns the correct netlist constants. |
| |
| The following snippet shows a memory image configuration that puts the device into the `DEV` life cycle state, and that defines the SECRET2 partition items and locks down the partition: |
| ``` |
| { |
| // Seed to be used for generation of partition randomized values. |
| // Can be overridden on the command line. |
| seed: 01931961561863975174 |
| |
| // The partition and item names must correspond with the OTP memory map. |
| partitions: [ |
| { |
| name: "SECRET2", |
| // If True, a digest will be calculated for this partition. |
| // Note that this only applies to partitions with a hardware digest. |
| lock: "True", |
| items: [ |
| { |
| name: "RMA_TOKEN", |
| // This item is assigned is a fixed Hex value |
| value: "0x9cfbd7383959a62a4438bc468d76eed6 ", |
| } |
| { |
| name: "CREATOR_ROOT_KEY_SHARE0", |
| // This item will be assigned a random value, based on the seed above. |
| value: "<random>", |
| } |
| { |
| name: "CREATOR_ROOT_KEY_SHARE1", |
| // This item will be assigned a random value, based on the seed above. |
| value: "<random>", |
| } |
| ], |
| } |
| { |
| name: "LIFE_CYCLE", |
| // Can be one of the following strings: |
| // RAW, TEST_UNLOCKED0-3, TEST_LOCKED0-2, DEV, PROD, PROD_END, RMA, SCRAP |
| state: "DEV", |
| // Can be either "RAW", or any number from 1 to 16. |
| count: "5" |
| } |
| ] |
| } |
| ``` |
| |
| Common example configuration files that can be used for simulation and emulation are checked in under `hw/ip/otp_ctrl/data`, e.g. `hw/ip/otp_ctrl/data/otp_ctrl_img_dev.hjson` which provisions all buffered partitions and puts the device into the `DEV` life cycle. |
| |
| Note that the preload image generator script automatically scrambles secret partitions, computes digests of locked partitions using the PRESENT cipher, and computes the OTP ECC bits. |
| |
| The OTP preload image generator expects at least one main image configuration file to be specified with the `--img-cfg` switch, for example: |
| ```console |
| $ cd ${PROJ_ROOT} |
| $ ./util/design/gen-otp-img.py --img-cfg hw/ip/otp_ctrl/data/otp_ctrl_img_dev.hjson \ |
| --out otp-img.mem |
| ``` |
| |
| Additional configuration files can be added using the `--add-cfg` switch. |
| The switch can be specified multiple times, and the configuration files are processed in the order they are specified. |
| This allows to incrementally "patch in" additional data, if needed. |
| |
| For example, this can be used to patch in additional software configuration data, specified in an additional file `otp_ctrl_img_sw_cfg.hjson` that looks as follows (it is also possible to split the individual items into their own files): |
| ``` |
| { |
| // The partition and item names must correspond with the OTP memory map. |
| partitions: [ |
| { |
| name: "CREATOR_SW_CFG", |
| items: [ |
| { |
| name: "CREATOR_SW_CFG_CONTENT", |
| value: "0x0", // data to be put into this partition |
| } |
| { |
| name: "CREATOR_SW_CFG_DIGEST", |
| value: "0x0", // 64bit digest to be written to this partition |
| } |
| ], |
| }, |
| { |
| name: "OWNER_SW_CFG", |
| items: [ |
| { |
| name: "OWNER_SW_CFG_CONTENT", |
| value: "0x0", // data to be put into this partition |
| } |
| { |
| name: "OWNER_SW_CFG_DIGEST", |
| value: "0x0", // 64bit digest to be written to this partition |
| } |
| ], |
| } |
| ] |
| } |
| ``` |
| |
| The generator script call would then look as follows: |
| ```console |
| $ cd ${PROJ_ROOT} |
| $ ./util/design/gen-otp-img.py --img-cfg hw/ip/otp_ctrl/data/otp_ctrl_img_dev.hjson \ |
| --add-cfg otp_ctrl_img_sw_cfg.hjson \ |
| --out otp-img.mem |
| ``` |
| |
| ## ECC Generator Tool |
| |
| TODO |
| |
| ## LFSR Coefficient Generator Tool |
| |
| TODO |
| |
| ## LFSR Seed Generator Tool |
| |
| TODO |
| |
| ## Sparse FSM State Encoding Tool |
| |
| TODO |
| |
| ## KECCAK Coefficient Generation Tool |
| |
| TODO |
| |