mirror of https://github.com/openXC7/prjxray.git
Fix new BRAM36 features.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
parent
91d91357b5
commit
88fc1f1b40
|
|
@ -7,14 +7,14 @@
|
||||||
# SPDX-License-Identifier: ISC
|
# SPDX-License-Identifier: ISC
|
||||||
# read/write width is relatively slow to resolve
|
# read/write width is relatively slow to resolve
|
||||||
# Even slower with multi bit masks...
|
# Even slower with multi bit masks...
|
||||||
N ?= 10
|
N ?= 20
|
||||||
|
|
||||||
include ../fuzzer.mk
|
include ../fuzzer.mk
|
||||||
|
|
||||||
database: build/segbits_bramx.db
|
database: build/segbits_bramx.db
|
||||||
|
|
||||||
build/segbits_bramx.rdb: $(SPECIMENS_OK)
|
build/segbits_bramx.rdb: $(SPECIMENS_OK)
|
||||||
${XRAY_SEGMATCH} -o build/segbits_bramx.rdb $(addsuffix /segdata_bram_[lr].txt,$(SPECIMENS))
|
${XRAY_SEGMATCH} -c 1 -o build/segbits_bramx.rdb $(addsuffix /segdata_bram_[lr].txt,$(SPECIMENS))
|
||||||
|
|
||||||
build/segbits_bramx.db: build/segbits_bramx.rdb
|
build/segbits_bramx.db: build/segbits_bramx.rdb
|
||||||
${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --seg-fn-in $^ --seg-fn-out $@
|
${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --seg-fn-in $^ --seg-fn-out $@
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
RAMB36 features
|
||||||
|
===============
|
||||||
|
|
||||||
|
This fuzzer emits features that only are used in the RAMB36E1 cell. There are
|
||||||
|
3 categories:
|
||||||
|
|
||||||
|
- ECC
|
||||||
|
- RAM extension
|
||||||
|
- Odd address modes
|
||||||
|
|
||||||
|
Odd address modes
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Most RAMB36E1 address widths are expressed by configuring the underlying
|
||||||
|
RAMB18E1 to handle half of the data. So `RAMB36.READ_WIDTH = 4` is
|
||||||
|
expressed as `RAM18_Y0.READ_WIDTH = 2` and `RAM18_Y1.READ_WIDTH = 2`. However
|
||||||
|
two address widths (1 and 9) are odd (e.g. not divisible by 2). In these
|
||||||
|
cases, a RAMB36E1 specific feature is used. So `RAMB36.READ_WIDTH = 9` is
|
||||||
|
expressed as:
|
||||||
|
|
||||||
|
- `RAMB18_Y0.READ_WIDTH_4`
|
||||||
|
- `RAMB18_Y1.READ_WIDTH_4`
|
||||||
|
- `RAMB36.BRAM36_READ_WIDTH_1`
|
||||||
|
|
||||||
|
and `RAMB36.READ_WIDTH = 1` is expressed as:
|
||||||
|
|
||||||
|
- `RAMB18_Y0.READ_WIDTH_1`
|
||||||
|
- `RAMB18_Y1.READ_WIDTH_1`
|
||||||
|
- `RAMB36.BRAM36_READ_WIDTH_1`
|
||||||
|
|
@ -36,13 +36,23 @@ def main():
|
||||||
if tile_param['BRAM36_IN_USE']:
|
if tile_param['BRAM36_IN_USE']:
|
||||||
write_ram_ext_tags(segmk, tile_param)
|
write_ram_ext_tags(segmk, tile_param)
|
||||||
|
|
||||||
segmk.add_site_tag(tile_param['site'], 'BRAM36_IN_USE', 1)
|
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
tile_param['site'], 'EN_ECC_READ', tile_param['EN_ECC_READ'])
|
tile_param['site'], 'EN_ECC_READ', tile_param['EN_ECC_READ'])
|
||||||
segmk.add_site_tag(
|
segmk.add_site_tag(
|
||||||
tile_param['site'], 'EN_ECC_WRITE', tile_param['EN_ECC_WRITE'])
|
tile_param['site'], 'EN_ECC_WRITE', tile_param['EN_ECC_WRITE'])
|
||||||
else:
|
|
||||||
segmk.add_site_tag(tile_param['site'], 'BRAM36_IN_USE', 0)
|
for ab in 'ab':
|
||||||
|
for rw in 'rw':
|
||||||
|
if rw == 'r':
|
||||||
|
dir = 'READ'
|
||||||
|
else:
|
||||||
|
dir = 'WRITE'
|
||||||
|
|
||||||
|
width = tile_param['bram36_{}{}_width'.format(rw, ab)]
|
||||||
|
tag = 'BRAM36_{}_WIDTH_{}_1'.format(dir, ab.upper())
|
||||||
|
if width == 1:
|
||||||
|
segmk.add_site_tag(
|
||||||
|
tile_param['site'], tag, tile_param['BRAM36_IN_USE'])
|
||||||
|
|
||||||
segmk.compile()
|
segmk.compile()
|
||||||
segmk.write()
|
segmk.write()
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,9 @@ RAM_EXTENSION_OPTS = [
|
||||||
"UPPER",
|
"UPPER",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
BRAM36_WIDTHS = [1, 2]
|
||||||
|
BRAM36_TO_18_WIDTHS = {1: 1, 2: 1}
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
db = Database(util.get_db_root(), util.get_part())
|
db = Database(util.get_db_root(), util.get_part())
|
||||||
|
|
@ -59,9 +62,27 @@ module top();
|
||||||
params = []
|
params = []
|
||||||
for tile_name, bram36_site_name, bram18_site_name, fifo18_site_name in gen_bram36(
|
for tile_name, bram36_site_name, bram18_site_name, fifo18_site_name in gen_bram36(
|
||||||
grid):
|
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 random.random() < .8:
|
||||||
ram_extension_a = random.choice(RAM_EXTENSION_OPTS)
|
if bram36_ra_width == 1 and bram36_wa_width == 1:
|
||||||
ram_extension_b = random.choice(RAM_EXTENSION_OPTS)
|
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_read = random.randint(0, 1)
|
||||||
en_ecc_write = random.randint(0, 1)
|
en_ecc_write = random.randint(0, 1)
|
||||||
|
|
||||||
|
|
@ -69,10 +90,10 @@ module top();
|
||||||
'''
|
'''
|
||||||
(* KEEP, DONT_TOUCH, LOC = "{site}" *)
|
(* KEEP, DONT_TOUCH, LOC = "{site}" *)
|
||||||
RAMB36E1 #(
|
RAMB36E1 #(
|
||||||
.READ_WIDTH_A(1),
|
.READ_WIDTH_A({bram36_ra_width}),
|
||||||
.WRITE_WIDTH_A(1),
|
.WRITE_WIDTH_A({bram36_wa_width}),
|
||||||
.READ_WIDTH_B(1),
|
.READ_WIDTH_B({bram36_rb_width}),
|
||||||
.WRITE_WIDTH_B(1),
|
.WRITE_WIDTH_B({bram36_wb_width}),
|
||||||
.RAM_EXTENSION_A({ram_extension_a}),
|
.RAM_EXTENSION_A({ram_extension_a}),
|
||||||
.RAM_EXTENSION_B({ram_extension_b}),
|
.RAM_EXTENSION_B({ram_extension_b}),
|
||||||
.EN_ECC_READ({en_ecc_read}),
|
.EN_ECC_READ({en_ecc_read}),
|
||||||
|
|
@ -106,6 +127,10 @@ module top();
|
||||||
ram_extension_b=verilog.quote(ram_extension_b),
|
ram_extension_b=verilog.quote(ram_extension_b),
|
||||||
en_ecc_read=en_ecc_read,
|
en_ecc_read=en_ecc_read,
|
||||||
en_ecc_write=en_ecc_write,
|
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(
|
params.append(
|
||||||
|
|
@ -117,16 +142,20 @@ module top();
|
||||||
'RAM_EXTENSION_B': ram_extension_b,
|
'RAM_EXTENSION_B': ram_extension_b,
|
||||||
'EN_ECC_READ': en_ecc_read,
|
'EN_ECC_READ': en_ecc_read,
|
||||||
'EN_ECC_WRITE': en_ecc_write,
|
'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:
|
else:
|
||||||
print(
|
print(
|
||||||
'''
|
'''
|
||||||
(* KEEP, DONT_TOUCH, LOC = "{bram18}" *)
|
(* KEEP, DONT_TOUCH, LOC = "{bram18}" *)
|
||||||
RAMB18E1 #(
|
RAMB18E1 #(
|
||||||
.READ_WIDTH_A(1),
|
.READ_WIDTH_A({bram18_ra_width}),
|
||||||
.WRITE_WIDTH_A(1),
|
.WRITE_WIDTH_A({bram18_wa_width}),
|
||||||
.READ_WIDTH_B(1),
|
.READ_WIDTH_B({bram18_rb_width}),
|
||||||
.WRITE_WIDTH_B(1)
|
.WRITE_WIDTH_B({bram18_wb_width})
|
||||||
) bram_{bram18} (
|
) bram_{bram18} (
|
||||||
.CLKARDCLK(),
|
.CLKARDCLK(),
|
||||||
.CLKBWRCLK(),
|
.CLKBWRCLK(),
|
||||||
|
|
@ -153,10 +182,10 @@ module top();
|
||||||
|
|
||||||
(* KEEP, DONT_TOUCH, LOC = "{fifo18}" *)
|
(* KEEP, DONT_TOUCH, LOC = "{fifo18}" *)
|
||||||
RAMB18E1 #(
|
RAMB18E1 #(
|
||||||
.READ_WIDTH_A(1),
|
.READ_WIDTH_A({bram18_ra_width}),
|
||||||
.WRITE_WIDTH_A(1),
|
.WRITE_WIDTH_A({bram18_wa_width}),
|
||||||
.READ_WIDTH_B(1),
|
.READ_WIDTH_B({bram18_rb_width}),
|
||||||
.WRITE_WIDTH_B(1)
|
.WRITE_WIDTH_B({bram18_wb_width})
|
||||||
) bram_{fifo18} (
|
) bram_{fifo18} (
|
||||||
.CLKARDCLK(),
|
.CLKARDCLK(),
|
||||||
.CLKBWRCLK(),
|
.CLKBWRCLK(),
|
||||||
|
|
@ -183,6 +212,10 @@ module top();
|
||||||
'''.format(
|
'''.format(
|
||||||
bram18=bram18_site_name,
|
bram18=bram18_site_name,
|
||||||
fifo18=fifo18_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(
|
params.append(
|
||||||
|
|
@ -190,6 +223,10 @@ module top();
|
||||||
'tile': tile_name,
|
'tile': tile_name,
|
||||||
'BRAM36_IN_USE': False,
|
'BRAM36_IN_USE': False,
|
||||||
'site': bram36_site_name,
|
'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")
|
print("endmodule")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue