Merge pull request #196 from mcmasterg/bram_config2

bram: DO_REG, SRVAL, INIT
This commit is contained in:
John McMaster 2018-10-25 10:29:12 -07:00 committed by GitHub
commit 5e1760e8ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 67 additions and 12 deletions

View File

@ -6,6 +6,7 @@ from prjxray.segmaker import Segmaker
from prjxray import verilog
segmk = Segmaker("design.bits", verbose=True)
#segmk.set_def_bt('BLOCK_RAM')
print("Loading tags")
f = open('params.jl', 'r')
@ -30,6 +31,19 @@ for l in f:
]
for param, tagname in ks:
segmk.add_site_tag(site, tagname, 1 ^ verilog.parsei(ps[param]))
'''
parameter DOA_REG = 1'b0;
parameter DOB_REG = 1'b0;
parameter SRVAL_A = 18'b0;
parameter SRVAL_B = 18'b0;
parameter INIT_A = 18'b0;
parameter INIT_B = 18'b0;
'''
for param, tagname in [('SRVAL_A', 'ZSRVAL_A'), ('SRVAL_B', 'ZSRVAL_B'),
('INIT_A', 'ZINIT_A'), ('INIT_B', 'ZINIT_B')]:
bitstr = verilog.parse_bitstr(ps[param])
for i in range(18):
segmk.add_site_tag(site, '%s[%u]' % (param, i), 1 ^ bitstr[i])
segmk.compile()
segmk.write()

View File

@ -65,6 +65,13 @@ def vrandbit():
return "1'b0"
def vrandbits(n):
ret = "%u'b" % n
for _i in range(n):
ret += str(random.randint(0, 1))
return ret
for loci, (site_type, site) in enumerate(brams):
def place_bram18():
@ -86,6 +93,12 @@ for loci, (site_type, site) in enumerate(brams):
'RAM_MODE': '"TDP"',
'WRITE_MODE_A': '"WRITE_FIRST"',
'WRITE_MODE_B': '"WRITE_FIRST"',
"DOA_REG": vrandbit(),
"DOB_REG": vrandbit(),
"SRVAL_A": vrandbits(18),
"SRVAL_B": vrandbits(18),
"INIT_A": vrandbits(18),
"INIT_B": vrandbits(18),
}
return ('my_RAMB18E1', ports, params)
@ -191,6 +204,13 @@ module my_RAMB18E1 (input clk, input [7:0] din, output [7:0] dout);
parameter WRITE_MODE_A = "WRITE_FIRST";
parameter WRITE_MODE_B = "WRITE_FIRST";
parameter DOA_REG = 1'b0;
parameter DOB_REG = 1'b0;
parameter SRVAL_A = 18'b0;
parameter SRVAL_B = 18'b0;
parameter INIT_A = 18'b0;
parameter INIT_B = 18'b0;
''')
print('''\
(* LOC=LOC *)
@ -213,7 +233,14 @@ print(
.IS_RSTREGB_INVERTED(IS_RSTREGB_INVERTED),
.RAM_MODE(RAM_MODE),
.WRITE_MODE_A(WRITE_MODE_A),
.WRITE_MODE_B(WRITE_MODE_B)
.WRITE_MODE_B(WRITE_MODE_B),
.DOA_REG(DOA_REG),
.DOB_REG(DOB_REG),
.SRVAL_A(SRVAL_A),
.SRVAL_B(SRVAL_B),
.INIT_A(INIT_A),
.INIT_B(INIT_B)
) ram (
.CLKARDCLK(din[0]),
.CLKBWRCLK(din[1]),

View File

@ -1,2 +1 @@
/specimen_[0-9][0-9][0-9]/
/seg_clbl[lm].segbits
build

View File

@ -1,20 +1,23 @@
N := 8
SPECIMENS := $(addprefix specimen_,$(shell seq -f '%03.0f' $(N)))
SPECIMENS := $(addprefix build/specimen_,$(shell seq -f '%03.0f' $(N)))
SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS))
database: $(SPECIMENS_OK)
${XRAY_SEGMATCH} -o seg_bramx.block_ram.segbits $(addsuffix /segdata_bram_[lr].txt,$(SPECIMENS))
${XRAY_SEGMATCH} -o build/seg_bramx.block_ram.segbits $(addsuffix /segdata_bram_[lr].txt,$(SPECIMENS))
pushdb:
${XRAY_MERGEDB} bram_l.block_ram seg_bramx.block_ram.segbits
${XRAY_MERGEDB} bram_r.block_ram seg_bramx.block_ram.segbits
${XRAY_MERGEDB} bram_l.block_ram build/seg_bramx.block_ram.segbits
${XRAY_MERGEDB} bram_r.block_ram build/seg_bramx.block_ram.segbits
$(SPECIMENS_OK):
build:
mkdir build
$(SPECIMENS_OK): build
bash generate.sh $(subst /OK,,$@)
touch $@
clean:
rm -rf specimen_[0-9][0-9][0-9]/ seg_*.segbits vivado*.log vivado_*.str vivado*.jou design *.bits *.dcp *.bit top.v
rm -rf build
.PHONY: database pushdb clean

View File

@ -2,15 +2,16 @@
set -ex
FUZDIR=$PWD
source ${XRAY_GENHEADER}
python3 ../top.py >top.v
vivado -mode batch -source ../generate.tcl
python3 $FUZDIR/top.py >top.v
vivado -mode batch -source $FUZDIR/generate.tcl
test -z "$(fgrep CRITICAL vivado.log)"
for x in design*.bit; do
${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o ${x}s -z -y $x
done
python3 ../generate.py
python3 $FUZDIR/generate.py

View File

@ -124,6 +124,8 @@ class Segmaker:
'''
if '"' in site:
raise ValueError("Invalid site: %s" % site)
self.verbose and print(
'segmaker: site %s tag %s = %s' % (site, name, value))
self.site_tags.setdefault(site, dict())[name] = value
def add_tile_tag(self, tile, name, value):

View File

@ -67,3 +67,12 @@ def parsei(s):
return 1
else:
assert 0, 'FIXME'
def parse_bitstr(s):
n, postfix = s.split("'")
n = int(n)
assert postfix[0] == 'b'
bitstr = postfix[1:]
assert len(bitstr) == n
return [int(x) for x in bitstr]