| #!/usr/bin/env python3 |
| |
| from fuzzconfig import * |
| import numpy as np |
| import os |
| |
| device_class = os.getenv("ICEDEVICE") |
| |
| working_dir = "work_%s_ram40" % (device_class, ) |
| |
| os.system("rm -rf " + working_dir) |
| os.mkdir(working_dir) |
| |
| for idx in range(num): |
| with open(working_dir + "/ram40_%02d.v" % idx, "w") as f: |
| glbs = ["glb[%d]" % i for i in range(np.random.randint(8)+1)] |
| # Connecting GLB to CE pins seemingly disallowed |
| if device_class == "5k": |
| glbs_choice = ["wa", "ra", "msk", "wd", "we", "wc", "re", "rc"] |
| else: |
| glbs_choice = ["wa", "ra", "msk", "wd", "we", "wce", "wc", "re", "rce", "rc"] |
| print(""" |
| module top ( |
| input [%d:0] glb_pins, |
| input [%d:0] in_pins, |
| output [15:0] out_pins |
| ); |
| wire [%d:0] glb, glb_pins; |
| SB_GB gbufs [%d:0] ( |
| .USER_SIGNAL_TO_GLOBAL_BUFFER(glb_pins), |
| .GLOBAL_BUFFER_OUTPUT(glb) |
| ); |
| """ % (len(glbs)-1, len(pins) - len(glbs) - 16 - 1, len(glbs)-1, len(glbs)-1), file=f) |
| bits = ["in_pins[%d]" % i for i in range(60)] |
| bits = list(np.random.permutation(bits)) |
| for i in range(num_ramb40): |
| tmp = list(np.random.permutation(bits)) |
| rmode = np.random.randint(4) |
| if rmode == 3: |
| wmode = np.random.randint(1, 4) |
| else: |
| wmode = np.random.randint(4) |
| raddr_bits = (8, 9, 10, 11)[rmode] |
| waddr_bits = (8, 9, 10, 11)[wmode] |
| rdata_bits = (16, 8, 4, 2)[rmode] |
| wdata_bits = (16, 8, 4, 2)[wmode] |
| bits_waddr = [tmp.pop() for k in range(waddr_bits)] |
| bits_raddr = [tmp.pop() for k in range(raddr_bits)] |
| bits_mask = [tmp.pop() for k in range(16)] |
| bits_wdata = [tmp.pop() for k in range(wdata_bits)] |
| bit_we = tmp.pop() |
| bit_wclke = tmp.pop() |
| bit_wclk = tmp.pop() |
| bit_re = tmp.pop() |
| bit_rclke = tmp.pop() |
| bit_rclk = tmp.pop() |
| if len(glbs) != 0: |
| s = np.random.choice(glbs_choice) |
| glbs_choice.remove(s) |
| if s == "wa": bits_waddr[np.random.randint(len(bits_waddr))] = glbs.pop() |
| if s == "ra": bits_raddr[np.random.randint(len(bits_raddr))] = glbs.pop() |
| if s == "msk": bits_mask [np.random.randint(len(bits_mask ))] = glbs.pop() |
| if s == "wd": bits_wdata[np.random.randint(len(bits_wdata))] = glbs.pop() |
| if s == "we": bit_we = glbs.pop() |
| if s == "wce": bit_wclke = glbs.pop() |
| if s == "wc": bit_wclk = glbs.pop() |
| if s == "re": bit_re = glbs.pop() |
| if s == "rce": bit_rclke = glbs.pop() |
| if s == "rc": bit_rclk = glbs.pop() |
| bits_waddr = "{%s}" % ", ".join(bits_waddr) |
| bits_raddr = "{%s}" % ", ".join(bits_raddr) |
| bits_mask = "{%s}" % ", ".join(bits_mask) |
| bits_wdata = "{%s}" % ", ".join(bits_wdata) |
| if wmode != 0: bits_mask = "" |
| memtype = np.random.choice(["", "NR", "NW", "NRNW"]) |
| wclksuffix = "N" if memtype in ["NW", "NRNW"] else "" |
| rclksuffix = "N" if memtype in ["NR", "NRNW"] else "" |
| print(""" |
| wire [%d:0] rdata_%d; |
| SB_RAM40_4K%s #( |
| .READ_MODE(%d), |
| .WRITE_MODE(%d) |
| ) ram_%d ( |
| .WADDR(%s), |
| .RADDR(%s), |
| .MASK(%s), |
| .WDATA(%s), |
| .RDATA(rdata_%d), |
| .WE(%s), |
| .WCLKE(%s), |
| .WCLK%s(%s), |
| .RE(%s), |
| .RCLKE(%s), |
| .RCLK%s(%s) |
| ); |
| """ % ( |
| rdata_bits-1, i, memtype, rmode, wmode, i, |
| bits_waddr, bits_raddr, bits_mask, bits_wdata, i, |
| bit_we, bit_wclke, wclksuffix, bit_wclk, |
| bit_re, bit_rclke, rclksuffix, bit_rclk |
| ), file=f) |
| bits = list(np.random.permutation(bits)) |
| for k in range(rdata_bits): |
| bits[k] = "rdata_%d[%d] ^ %s" % (i, k, bits[k]) |
| print("assign out_pins = rdata_%d;" % i, file=f) |
| print("endmodule", file=f) |
| with open(working_dir + "/ram40_%02d.pcf" % idx, "w") as f: |
| p = list(np.random.permutation(pins)) |
| for i in range(len(pins) - len(glbs) - 16): |
| print("set_io in_pins[%d] %s" % (i, p.pop()), file=f) |
| for i in range(16): |
| print("set_io out_pins[%d] %s" % (i, p.pop()), file=f) |
| |
| |
| output_makefile(working_dir, "ram40") |