blob: fba4275a8ed164cd18161e90aca30dff6721a8c1 [file] [log] [blame]
#!/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()