|  | #!/usr/bin/env python3 | 
|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  | r"""This script generates random seeds and state permutations for LFSRs | 
|  | and outputs them them as a packed SV logic vectors suitable for use with | 
|  | prim_lfsr.sv. | 
|  | """ | 
|  | import argparse | 
|  | import logging as log | 
|  | import random | 
|  |  | 
|  | from lib import common as common | 
|  |  | 
|  | SV_INSTRUCTIONS = """ | 
|  | ------------------------------------------------ | 
|  | | COPY PASTE THE CODE TEMPLATE BELOW INTO YOUR | | 
|  | | RTL CODE, INLUDING THE COMMENT IN ORDER TO   | | 
|  | | EASE AUDITABILITY AND REPRODUCIBILITY.       | | 
|  | ------------------------------------------------ | 
|  | """ | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | log.basicConfig(level=log.INFO, | 
|  | format="%(levelname)s: %(message)s") | 
|  |  | 
|  | parser = argparse.ArgumentParser( | 
|  | prog="gen-lfsre-perm", | 
|  | description=common.wrapped_docstring(), | 
|  | formatter_class=argparse.RawDescriptionHelpFormatter) | 
|  | parser.add_argument('-w', | 
|  | '--width', | 
|  | type=int, | 
|  | default=32, | 
|  | metavar='<#bitwidth>', | 
|  | help='LFSR width.') | 
|  | parser.add_argument('-s', | 
|  | '--seed', | 
|  | type=int, | 
|  | metavar='<seed>', | 
|  | help='Custom seed for RNG.') | 
|  | parser.add_argument('-p', | 
|  | '--prefix', | 
|  | type=str, | 
|  | metavar='name', | 
|  | default="", | 
|  | help='Optional prefix to add to ' | 
|  | 'types and parameters. ' | 
|  | 'Make sure this is PascalCase.') | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | if args.width <= 0: | 
|  | log.error("LFSR width must be nonzero") | 
|  | exit(1) | 
|  |  | 
|  | if args.seed is None: | 
|  | random.seed() | 
|  | args.seed = random.getrandbits(32) | 
|  |  | 
|  | random.seed(args.seed) | 
|  |  | 
|  | print(SV_INSTRUCTIONS) | 
|  |  | 
|  | type_prefix = common.as_snake_case_prefix(args.prefix) | 
|  |  | 
|  | outstr = ''' | 
|  | // These LFSR parameters have been generated with | 
|  | // $ ./util/design/gen-lfsr-seed.py --width {} --seed {} --prefix "{}" | 
|  | parameter int {}LfsrWidth = {}; | 
|  | typedef logic [{}LfsrWidth-1:0] {}lfsr_seed_t; | 
|  | typedef logic [{}LfsrWidth-1:0][$clog2({}LfsrWidth)-1:0] {}lfsr_perm_t; | 
|  | parameter {}lfsr_seed_t RndCnst{}LfsrSeedDefault = {}; | 
|  | parameter {}lfsr_perm_t RndCnst{}LfsrPermDefault = {{ | 
|  | {} | 
|  | }}; | 
|  | '''.format(args.width, args.seed, args.prefix, args.prefix, args.width, | 
|  | args.prefix, type_prefix, args.prefix, args.prefix, type_prefix, | 
|  | type_prefix, args.prefix, | 
|  | common.get_random_data_hex_literal(args.width), type_prefix, | 
|  | args.prefix, common.get_random_perm_hex_literal(args.width)) | 
|  |  | 
|  | print(outstr) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |