| # 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 clk, clkb, rst, ena, enb, cea, ceb, input [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);" |
| ) |
| N = 300 |
| print(" wire [71:0] int_d[0:%d-1];" % N) |
| print(" assign rdata = int_d[sel[10:2]][18 * sel[1:0] +: 18];") |
| for i in range(N): |
| write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72]) |
| read_width_a = np.random.choice( |
| [0, 1, 2, 4, 9, 18, 36, 72], |
| p=[0.05, 0.1, 0.1, 0.1, 0.05, 0.05, 0.45, 0.1]) |
| write_width_a = 0 if (write_width_b == 72 |
| or read_width_a == 72) else np.random.choice( |
| [0, 1, 2, 4, 9, 18, 36]) |
| read_width_b = 0 if ( |
| write_width_b == 72 or read_width_a == 72) else np.random.choice( |
| [0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45]) |
| cd = np.random.choice(["INDEPENDENT", "COMMON"]) |
| |
| print(" RAMB36E2 #(") |
| print(" .CLOCK_DOMAINS(\"%s\")," % cd) |
| print(" .READ_WIDTH_A(%d)," % read_width_a) |
| print(" .READ_WIDTH_B(%d)," % read_width_b) |
| print(" .WRITE_WIDTH_A(%d)," % write_width_a) |
| print(" .WRITE_WIDTH_B(%d)," % write_width_b) |
| print(" .WRITE_MODE_A(\"%s\")," % np.random.choice( |
| ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"])) |
| print(" .WRITE_MODE_B(\"%s\")," % np.random.choice( |
| ["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"])) |
| print(" .CASCADE_ORDER_A(\"%s\")," % np.random.choice( |
| ["NONE", "FIRST", "MIDDLE", "LAST"])) |
| print(" .CASCADE_ORDER_B(\"%s\")," % np.random.choice( |
| ["NONE", "FIRST", "MIDDLE", "LAST"])) |
| print( |
| " .DOA_REG(%d)," % (0 if |
| (write_width_b == 72 or read_width_a == 72) |
| else np.random.randint(2))) |
| print( |
| " .DOB_REG(%d)," % (0 if |
| (write_width_b == 72 or read_width_a == 72) |
| else np.random.randint(2))) |
| print(" .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"])) |
| print(" .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"])) |
| print(" .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"], |
| p=[0.9, 0.1])) |
| print(" .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"], |
| p=[0.9, 0.1])) |
| print(" .EN_ECC_WRITE(\"%s\")," % np.random.choice( |
| ["FALSE", "TRUE"], p=[0.9, 0.1])) |
| print(" .RDADDRCHANGEA(\"%s\")," % np.random.choice( |
| ["FALSE", "TRUE"])) |
| print(" .RDADDRCHANGEB(\"%s\")," % np.random.choice( |
| ["FALSE", "TRUE"])) |
| print( |
| " .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"])) |
| print(" .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice( |
| ["RSTREG", "REGCE"])) |
| print(" .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice( |
| ["RSTREG", "REGCE"])) |
| for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", |
| "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"): |
| print(" .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2))) |
| print(" .INIT_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), |
| np.random.randint(2**18))) |
| print(" .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18), |
| np.random.randint(2**18))) |
| print(" .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18), |
| np.random.randint(2**18))) |
| print(" .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18), |
| np.random.randint(2**18))) |
| print(" ) ram%d (" % i) |
| print(" .DINADIN({wdata[15:0], wdata[15:0]}),") |
| print(" .DINPADINP({wdata[17:16], wdata[17:16]}),") |
| print(" .DOUTADOUT({int_d[%d][31:0]})," % i) |
| print(" .DOUTPADOUTP({int_d[%d][35:32]})," % i) |
| print(" .ADDRARDADDR(ra),") |
| print(" .CLKARDCLK(clk),") |
| print(" .ADDRENA(ena),") |
| print(" .ENARDEN(ena),") |
| print(" .REGCEAREGCE(cea),") |
| print(" .RSTRAMARSTRAM(rst),") |
| print(" .RSTREGARSTREG(rst),") |
| print(" .WEA(%s)," % ("4'b00" if write_width_a == 0 else "we[3:0]")) |
| print(" .DINBDIN({wdata[15:0], wdata[15:0]}),") |
| print(" .DINPBDINP({wdata[17:16], wdata[17:16]}),") |
| print(" .DOUTBDOUT(int_d[%d][67:36])," % i) |
| print(" .DOUTPBDOUTP(int_d[%d][71:68])," % i) |
| print(" .ADDRBWRADDR(wa),") |
| print( |
| " .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk")) |
| print(" .ENBWREN(enb),") |
| print(" .ADDRENB(enb),") |
| print(" .REGCEB(ceb),") |
| print(" .RSTRAMB(rst),") |
| print(" .RSTREGB(rst),") |
| print(" .WEBWE(%s)" % |
| ("4'b00" if write_width_b == 0 else |
| ("we[7:0]" if write_width_b == 72 else "we[7:4]"))) |
| print(" );") |
| print() |
| print("endmodule") |