mirror of https://github.com/openXC7/prjxray.git
240 lines
8.1 KiB
Python
240 lines
8.1 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright (C) 2017-2020 The Project X-Ray Authors.
|
|
#
|
|
# Use of this source code is governed by a ISC-style
|
|
# license that can be found in the LICENSE file or at
|
|
# https://opensource.org/licenses/ISC
|
|
#
|
|
# SPDX-License-Identifier: ISC
|
|
import os
|
|
import random
|
|
import json
|
|
random.seed(int(os.getenv("SEED"), 16))
|
|
from prjxray.db import Database
|
|
from prjxray import util
|
|
from prjxray import verilog
|
|
|
|
|
|
def gen_bram36(grid):
|
|
for tile_name in grid.tiles():
|
|
loc = grid.loc_of_tilename(tile_name)
|
|
|
|
gridinfo = grid.gridinfo_at_loc(loc)
|
|
|
|
found = False
|
|
for site_name, site_type in gridinfo.sites.items():
|
|
if site_type == 'RAMBFIFO36E1':
|
|
found = True
|
|
break
|
|
|
|
if found:
|
|
bram36_site_name = site_name
|
|
for site_name, site_type in gridinfo.sites.items():
|
|
if site_type == 'RAMB18E1':
|
|
bram18_site_name = site_name
|
|
|
|
if site_type == 'FIFO18E1':
|
|
fifo18_site_name = site_name
|
|
|
|
yield tile_name, bram36_site_name, bram18_site_name, fifo18_site_name
|
|
|
|
|
|
RAM_EXTENSION_OPTS = [
|
|
"NONE",
|
|
"LOWER",
|
|
"UPPER",
|
|
]
|
|
|
|
BRAM36_WIDTHS = [1, 2]
|
|
BRAM36_TO_18_WIDTHS = {1: 1, 2: 1}
|
|
|
|
|
|
def main():
|
|
db = Database(util.get_db_root(), util.get_part())
|
|
grid = db.grid()
|
|
|
|
print('''
|
|
module top();
|
|
''')
|
|
|
|
params = []
|
|
for tile_name, bram36_site_name, bram18_site_name, fifo18_site_name in gen_bram36(
|
|
grid):
|
|
bram36_ra_width = random.choice(BRAM36_WIDTHS)
|
|
bram36_wa_width = random.choice(BRAM36_WIDTHS)
|
|
bram36_rb_width = random.choice(BRAM36_WIDTHS)
|
|
bram36_wb_width = random.choice(BRAM36_WIDTHS)
|
|
|
|
bram18_ra_width = BRAM36_TO_18_WIDTHS[bram36_ra_width]
|
|
bram18_wa_width = BRAM36_TO_18_WIDTHS[bram36_wa_width]
|
|
bram18_rb_width = BRAM36_TO_18_WIDTHS[bram36_rb_width]
|
|
bram18_wb_width = BRAM36_TO_18_WIDTHS[bram36_wb_width]
|
|
|
|
if random.random() < .8:
|
|
if bram36_ra_width == 1 and bram36_wa_width == 1:
|
|
ram_extension_a = random.choice(RAM_EXTENSION_OPTS)
|
|
else:
|
|
ram_extension_a = 'NONE'
|
|
|
|
if bram36_rb_width == 1 and bram36_wb_width == 1:
|
|
ram_extension_b = random.choice(RAM_EXTENSION_OPTS)
|
|
else:
|
|
ram_extension_b = 'NONE'
|
|
|
|
en_ecc_read = random.randint(0, 1)
|
|
en_ecc_write = random.randint(0, 1)
|
|
|
|
print(
|
|
'''
|
|
(* KEEP, DONT_TOUCH, LOC = "{site}" *)
|
|
RAMB36E1 #(
|
|
.READ_WIDTH_A({bram36_ra_width}),
|
|
.WRITE_WIDTH_A({bram36_wa_width}),
|
|
.READ_WIDTH_B({bram36_rb_width}),
|
|
.WRITE_WIDTH_B({bram36_wb_width}),
|
|
.RAM_EXTENSION_A({ram_extension_a}),
|
|
.RAM_EXTENSION_B({ram_extension_b}),
|
|
.EN_ECC_READ({en_ecc_read}),
|
|
.EN_ECC_WRITE({en_ecc_write})
|
|
) bram_{site} (
|
|
.CLKARDCLK(),
|
|
.CLKBWRCLK(),
|
|
.ENARDEN(),
|
|
.ENBWREN(),
|
|
.REGCEAREGCE(),
|
|
.REGCEB(),
|
|
.RSTRAMARSTRAM(),
|
|
.RSTRAMB(),
|
|
.RSTREGARSTREG(),
|
|
.RSTREGB(),
|
|
.ADDRARDADDR(),
|
|
.ADDRBWRADDR(),
|
|
.DIADI(),
|
|
.DIBDI(),
|
|
.DIPADIP(),
|
|
.DIPBDIP(),
|
|
.WEA(),
|
|
.WEBWE(),
|
|
.DOADO(),
|
|
.DOBDO(),
|
|
.DOPADOP(),
|
|
.DOPBDOP());
|
|
'''.format(
|
|
site=bram36_site_name,
|
|
ram_extension_a=verilog.quote(ram_extension_a),
|
|
ram_extension_b=verilog.quote(ram_extension_b),
|
|
en_ecc_read=en_ecc_read,
|
|
en_ecc_write=en_ecc_write,
|
|
bram36_ra_width=bram36_ra_width,
|
|
bram36_wa_width=bram36_wa_width,
|
|
bram36_rb_width=bram36_rb_width,
|
|
bram36_wb_width=bram36_wb_width,
|
|
))
|
|
|
|
params.append(
|
|
{
|
|
'tile': tile_name,
|
|
'BRAM36_IN_USE': True,
|
|
'site': bram36_site_name,
|
|
'RAM_EXTENSION_A': ram_extension_a,
|
|
'RAM_EXTENSION_B': ram_extension_b,
|
|
'EN_ECC_READ': en_ecc_read,
|
|
'EN_ECC_WRITE': en_ecc_write,
|
|
'bram36_ra_width': bram36_ra_width,
|
|
'bram36_wa_width': bram36_wa_width,
|
|
'bram36_rb_width': bram36_rb_width,
|
|
'bram36_wb_width': bram36_wb_width,
|
|
})
|
|
else:
|
|
print(
|
|
'''
|
|
(* KEEP, DONT_TOUCH, LOC = "{bram18}" *)
|
|
RAMB18E1 #(
|
|
.READ_WIDTH_A({bram18_ra_width}),
|
|
.WRITE_WIDTH_A({bram18_wa_width}),
|
|
.READ_WIDTH_B({bram18_rb_width}),
|
|
.WRITE_WIDTH_B({bram18_wb_width})
|
|
) bram_{bram18} (
|
|
.CLKARDCLK(),
|
|
.CLKBWRCLK(),
|
|
.ENARDEN(),
|
|
.ENBWREN(),
|
|
.REGCEAREGCE(),
|
|
.REGCEB(),
|
|
.RSTRAMARSTRAM(),
|
|
.RSTRAMB(),
|
|
.RSTREGARSTREG(),
|
|
.RSTREGB(),
|
|
.ADDRARDADDR(),
|
|
.ADDRBWRADDR(),
|
|
.DIADI(),
|
|
.DIBDI(),
|
|
.DIPADIP(),
|
|
.DIPBDIP(),
|
|
.WEA(),
|
|
.WEBWE(),
|
|
.DOADO(),
|
|
.DOBDO(),
|
|
.DOPADOP(),
|
|
.DOPBDOP());
|
|
|
|
(* KEEP, DONT_TOUCH, LOC = "{fifo18}" *)
|
|
RAMB18E1 #(
|
|
.READ_WIDTH_A({bram18_ra_width}),
|
|
.WRITE_WIDTH_A({bram18_wa_width}),
|
|
.READ_WIDTH_B({bram18_rb_width}),
|
|
.WRITE_WIDTH_B({bram18_wb_width})
|
|
) bram_{fifo18} (
|
|
.CLKARDCLK(),
|
|
.CLKBWRCLK(),
|
|
.ENARDEN(),
|
|
.ENBWREN(),
|
|
.REGCEAREGCE(),
|
|
.REGCEB(),
|
|
.RSTRAMARSTRAM(),
|
|
.RSTRAMB(),
|
|
.RSTREGARSTREG(),
|
|
.RSTREGB(),
|
|
.ADDRARDADDR(),
|
|
.ADDRBWRADDR(),
|
|
.DIADI(),
|
|
.DIBDI(),
|
|
.DIPADIP(),
|
|
.DIPBDIP(),
|
|
.WEA(),
|
|
.WEBWE(),
|
|
.DOADO(),
|
|
.DOBDO(),
|
|
.DOPADOP(),
|
|
.DOPBDOP());
|
|
'''.format(
|
|
bram18=bram18_site_name,
|
|
fifo18=fifo18_site_name,
|
|
bram18_ra_width=bram18_ra_width,
|
|
bram18_wa_width=bram18_wa_width,
|
|
bram18_rb_width=bram18_rb_width,
|
|
bram18_wb_width=bram18_wb_width,
|
|
))
|
|
|
|
params.append(
|
|
{
|
|
'tile': tile_name,
|
|
'BRAM36_IN_USE': False,
|
|
'site': bram36_site_name,
|
|
'bram36_ra_width': bram36_ra_width,
|
|
'bram36_wa_width': bram36_wa_width,
|
|
'bram36_rb_width': bram36_rb_width,
|
|
'bram36_wb_width': bram36_wb_width,
|
|
})
|
|
|
|
print("endmodule")
|
|
|
|
with open('params.json', 'w') as f:
|
|
json.dump(params, f, indent=2)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|