aboutsummaryrefslogtreecommitdiffstats
path: root/icefuzz/make_pll.py
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-07-18 13:10:40 +0200
committerClifford Wolf <clifford@clifford.at>2015-07-18 13:10:40 +0200
commit48154cb6f452d3bdb4da36cc267b4b6c45588dc9 (patch)
tree3ec3be9ef7e8db1fb7c764ed8202e0215a8eb7c7 /icefuzz/make_pll.py
parent13e63e6b65e044e348356731b55610d02cb308b9 (diff)
downloadicestorm-48154cb6f452d3bdb4da36cc267b4b6c45588dc9.tar.gz
icestorm-48154cb6f452d3bdb4da36cc267b4b6c45588dc9.tar.bz2
icestorm-48154cb6f452d3bdb4da36cc267b4b6c45588dc9.zip
Imported full dev sources
Diffstat (limited to 'icefuzz/make_pll.py')
-rw-r--r--icefuzz/make_pll.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/icefuzz/make_pll.py b/icefuzz/make_pll.py
new file mode 100644
index 0000000..93a168a
--- /dev/null
+++ b/icefuzz/make_pll.py
@@ -0,0 +1,139 @@
+#!/usr/bin/python
+
+from __future__ import division
+from __future__ import print_function
+import numpy as np
+import os
+
+from numpy.random import randint, choice, permutation
+
+def randbin(n):
+ return "".join([choice(["0", "1"]) for i in range(n)])
+
+num = 20
+
+pins = [int(i) for i in """
+ 1 2 3 4 7 8 9 10 11 12 19 20 21 22 23 24 25 26 28 29 31 32 33 34
+ 37 38 39 41 42 43 44 45 47 48 49 50 52 56 58 60 61 62 63 64 67 68 70 71
+ 73 74 75 76 78 79 80 81 87 88 90 91 93 94 95 96 97 98 99 101 102 104 105 106 107
+ 112 113 114 115 116 117 118 119 120 121 122 128 129 134 135 136 137 138 139 141 142 143 144
+""".split()]
+
+pins.remove(49)
+pins.remove(50)
+
+os.system("rm -rf work_pll")
+os.mkdir("work_pll")
+
+for idx in range(num):
+ pin_names = list()
+ vlog_body = list()
+ pll_inst = list()
+
+ pll_type = choice(["SB_PLL40_CORE", "SB_PLL40_2F_CORE", "SB_PLL40_PAD", "SB_PLL40_2_PAD", "SB_PLL40_2F_PAD"])
+
+ pll_inst.append("%s uut (" % pll_type)
+
+ if pll_type.endswith("_PAD"):
+ pin_names.append("packagepin")
+ vlog_body.append("input packagepin;")
+ pll_inst.append(" .PACKAGEPIN(packagepin),")
+ else:
+ pin_names.append("referenceclk")
+ vlog_body.append("input referenceclk;")
+ pll_inst.append(" .REFERENCECLK(referenceclk),")
+
+ for pin in ["a", "b"]:
+ pin_names.append(pin)
+ vlog_body.append("input %s;" % pin)
+
+ for pin in ["w", "x", "y", "z"]:
+ pin_names.append(pin)
+ vlog_body.append("output %s%s;" % ("reg " if pin in ["y", "z"] else "", pin))
+
+ for pin in ["EXTFEEDBACK", "BYPASS", "RESETB", "LOCK", "LATCHINPUTVALUE", "SDI", "SDO", "SCLK"]:
+ pin_names.append(pin.lower())
+ vlog_body.append("%sput %s;" % ("out" if pin in ["LOCK", "SDO"] else "in", pin.lower()))
+ pll_inst.append(" .%s(%s)," % (pin, pin.lower()))
+
+ if pll_type.find("_2_") < 0 and pll_type.find("_2F_") < 0:
+ for pin in ["PLLOUTCORE", "PLLOUTGLOBAL"]:
+ vlog_body.append("wire %s;" % pin.lower())
+ pll_inst.append(" .%s(%s)," % (pin, pin.lower()))
+ vlog_body.append("assign w = plloutcore ^ a;")
+ vlog_body.append("assign x = plloutcore ^ b;")
+ vlog_body.append("always @(posedge plloutglobal) y <= a;")
+ vlog_body.append("always @(posedge plloutglobal) z <= b;")
+ else:
+ for pin in ["PLLOUTCOREA", "PLLOUTCOREB", "PLLOUTGLOBALA", "PLLOUTGLOBALB"]:
+ vlog_body.append("wire %s;" % pin.lower())
+ pll_inst.append(" .%s(%s)," % (pin, pin.lower()))
+ vlog_body.append("assign w = plloutcorea ^ a;")
+ vlog_body.append("assign x = plloutcoreb ^ b;")
+ vlog_body.append("always @(posedge plloutglobala) y <= a;")
+ vlog_body.append("always @(posedge plloutglobalb) z <= b;")
+
+ for i in range(8):
+ pin_names.append("dynamicdelay_%d" % i)
+ vlog_body.append("input dynamicdelay_%d;" % i)
+ pll_inst.append(" .DYNAMICDELAY({%s})" % ", ".join(["dynamicdelay_%d" % i for i in range(7, -1, -1)]))
+ pll_inst.append(");")
+
+ divq = randbin(3)
+ if divq == "000": divq = "001"
+ if divq == "111": divq = "110"
+ pll_inst.append("defparam uut.DIVR = 4'b%s;" % randbin(4))
+ pll_inst.append("defparam uut.DIVF = 7'b%s;" % randbin(7))
+ pll_inst.append("defparam uut.DIVQ = 3'b%s;" % divq)
+ pll_inst.append("defparam uut.FILTER_RANGE = 3'b%s;" % randbin(3))
+ pll_inst.append("defparam uut.FEEDBACK_PATH = \"%s\";" % choice(["DELAY", "SIMPLE", "PHASE_AND_DELAY", "EXTERNAL"]))
+
+ if choice([True, False]):
+ pll_inst.append("defparam uut.DELAY_ADJUSTMENT_MODE_FEEDBACK = \"FIXED\";")
+ pll_inst.append("defparam uut.FDA_FEEDBACK = 4'b%s;" % randbin(4))
+ else:
+ pll_inst.append("defparam uut.DELAY_ADJUSTMENT_MODE_FEEDBACK = \"DYNAMIC\";")
+ pll_inst.append("defparam uut.FDA_FEEDBACK = 4'b1111;")
+
+ if choice([True, False]):
+ pll_inst.append("defparam uut.DELAY_ADJUSTMENT_MODE_RELATIVE = \"FIXED\";")
+ pll_inst.append("defparam uut.FDA_RELATIVE = 4'b%s;" % randbin(4))
+ else:
+ pll_inst.append("defparam uut.DELAY_ADJUSTMENT_MODE_RELATIVE = \"DYNAMIC\";")
+ pll_inst.append("defparam uut.FDA_RELATIVE = 4'b1111;")
+
+ pll_inst.append("defparam uut.SHIFTREG_DIV_MODE = 1'b%s;" % randbin(1))
+
+ if pll_type.find("_2_") < 0 and pll_type.find("_2F_") < 0:
+ pll_inst.append("defparam uut.PLLOUT_SELECT = \"%s\";" % choice(["GENCLK", "GENCLK_HALF", "SHIFTREG_90deg", "SHIFTREG_0deg"]))
+ elif pll_type.find("_2F_") < 0:
+ pll_inst.append("defparam uut.PLLOUT_SELECT_PORTB = \"%s\";" % choice(["GENCLK", "GENCLK_HALF", "SHIFTREG_90deg", "SHIFTREG_0deg"]))
+ else:
+ pll_inst.append("defparam uut.PLLOUT_SELECT_PORTA = \"%s\";" % choice(["GENCLK", "GENCLK_HALF", "SHIFTREG_90deg", "SHIFTREG_0deg"]))
+ pll_inst.append("defparam uut.PLLOUT_SELECT_PORTB = \"%s\";" % choice(["GENCLK", "GENCLK_HALF", "SHIFTREG_90deg", "SHIFTREG_0deg"]))
+
+ if pll_type.find("_2_") < 0 and pll_type.find("_2F_") < 0:
+ pll_inst.append("defparam uut.ENABLE_ICEGATE = 1'b0;")
+ else:
+ pll_inst.append("defparam uut.ENABLE_ICEGATE_PORTA = 1'b0;")
+ pll_inst.append("defparam uut.ENABLE_ICEGATE_PORTB = 1'b0;")
+
+ pll_inst.append("defparam uut.TEST_MODE = 1'b0;")
+
+ with open("work_pll/pll_%02d.v" % idx, "w") as f:
+ print("module top(%s);" % ", ".join(pin_names), file=f)
+ print("\n".join(vlog_body), file=f)
+ print("\n".join(pll_inst), file=f)
+ print("endmodule", file=f)
+
+ with open("work_pll/pll_%02d.pcf" % idx, "w") as f:
+ for pll_pin, package_pin in zip(pin_names, list(permutation(pins))[0:len(pin_names)]):
+ if pll_pin == "packagepin": package_pin = 49
+ print("set_io %s %d" % (pll_pin, package_pin), file=f)
+
+with open("work_pll/Makefile", "w") as f:
+ print("all: %s" % " ".join(["pll_%02d.bin" % i for i in range(num)]), file=f)
+ for i in range(num):
+ print("pll_%02d.bin:" % i, file=f)
+ print("\t-bash ../icecube.sh pll_%02d > pll_%02d.log 2>&1 && rm -rf pll_%02d.tmp || tail pll_%02d.log" % (i, i, i, i), file=f)
+