| # Copyright 2020 Project U-Ray Authors | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| import numpy as np | |
| import sys | |
| import math | |
| print("module top(input [15:0] clk, cen, input [8:0] wa, input [7:0] ra, input [7:0] d, input [11:0] sel, output [3:0] q);") | |
| N = 4096 | |
| print(" wire [3:0] int_d[0:%d-1];" % N) | |
| print(" assign q = int_d[sel];") | |
| def connect(sig, dst, len): | |
| if sig is None: | |
| return [] | |
| bit = 0 | |
| conns = [] | |
| for x in sig: | |
| if type(x) is tuple: | |
| name, width = x | |
| conns.append(".%s(%s[%d +: %d])" % (name, dst, bit, width)) | |
| bit += width | |
| else: | |
| conns.append(".%s(%s[%d])" % (x, dst, bit)) | |
| bit += 1 | |
| return conns | |
| for i in range(N): | |
| ctype = np.random.choice(["SRL16E", "SRLC32E", "RAM32X1D", "RAM32X1S", "RAM64X1D", "RAM64X1S", "RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S", "RAM512X1S"]) | |
| clockport = None | |
| ceport = None | |
| wraddr = None | |
| rdaddr = None | |
| wdata = None | |
| rdata = None | |
| init_len = None | |
| if ctype in ("SRL16E", "SRLC32E"): | |
| clockport = "CLK" | |
| ceport = "CE" | |
| wdata = ["D"] | |
| rdata = ["Q"] | |
| if ctype == "SRLC32E": | |
| rdata.append("Q31") | |
| rdaddr = [("A", 5)] | |
| init_len = 32 | |
| else: | |
| rdaddr = ["A0", "A1", "A2", "A3"] | |
| init_len = 16 | |
| elif ctype in ("RAM32X1D", "RAM32X1S"): | |
| clockport = "WCLK" | |
| ceport = "WE" | |
| wdata = ["D"] | |
| wraddr = ["A0", "A1", "A2", "A3", "A4"] | |
| init_len = 32 | |
| if ctype == "RAM32X1D": | |
| rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4"] | |
| rdata = ["SPO", "DPO"] | |
| else: | |
| rdata = ["O"] | |
| elif ctype in ("RAM64X1D", "RAM64X1S"): | |
| clockport = "WCLK" | |
| ceport = "WE" | |
| wdata = ["D"] | |
| wraddr = ["A0", "A1", "A2", "A3", "A4", "A5"] | |
| init_len = 64 | |
| if ctype == "RAM64X1D": | |
| rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4", "DPRA5"] | |
| rdata = ["SPO", "DPO"] | |
| else: | |
| rdata = ["O"] | |
| elif ctype in ("RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S", "RAM512X1S"): | |
| init_len = int(ctype[3:6]) | |
| abits = math.log2(init_len) | |
| clockport = "WCLK" | |
| ceport = "WE" | |
| wdata = ["D"] | |
| if ctype == "RAM128X1S": | |
| wraddr = ["A0", "A1", "A2", "A3", "A4", "A5", "A6"] | |
| else: | |
| wraddr = [("A", abits)] | |
| if ctype[-1] == "D": | |
| rdaddr = [("DPRA", abits)] | |
| rdata = ["SPO", "DPO"] | |
| else: | |
| rdata = ["O"] | |
| else: | |
| assert False, ctype | |
| conns = [] | |
| if clockport is not None: | |
| conns.append(".%s(clk[%d])" % (clockport, np.random.randint(0, 16))) | |
| if ceport is not None: | |
| conns.append(".%s(cen[%d])" % (ceport, np.random.randint(0, 16))) | |
| conns += connect(wraddr, "wa", 9) | |
| conns += connect(rdaddr, "ra", 8) | |
| conns += connect(wdata, "d", 8) | |
| conns += connect(rdata, "int_d[%d]" % i, 4) | |
| print(" %s #(" % ctype) | |
| if init_len is not None: | |
| initdata = np.random.randint(2, size=init_len) | |
| print(" .INIT(%d'b%s)" % (init_len, "".join([str(_) for _ in initdata]))) | |
| print(" ) %s_%d (" % (ctype, i)) | |
| print(" %s" % ",\n ".join(conns)) | |
| print(" );") | |
| print("endmodule") |