mirror of https://github.com/openXC7/prjxray.git
Merge pull request #196 from mcmasterg/bram_config2
bram: DO_REG, SRVAL, INIT
This commit is contained in:
commit
5e1760e8ec
|
|
@ -6,6 +6,7 @@ from prjxray.segmaker import Segmaker
|
||||||
from prjxray import verilog
|
from prjxray import verilog
|
||||||
|
|
||||||
segmk = Segmaker("design.bits", verbose=True)
|
segmk = Segmaker("design.bits", verbose=True)
|
||||||
|
#segmk.set_def_bt('BLOCK_RAM')
|
||||||
|
|
||||||
print("Loading tags")
|
print("Loading tags")
|
||||||
f = open('params.jl', 'r')
|
f = open('params.jl', 'r')
|
||||||
|
|
@ -30,6 +31,19 @@ for l in f:
|
||||||
]
|
]
|
||||||
for param, tagname in ks:
|
for param, tagname in ks:
|
||||||
segmk.add_site_tag(site, tagname, 1 ^ verilog.parsei(ps[param]))
|
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.compile()
|
||||||
segmk.write()
|
segmk.write()
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,13 @@ def vrandbit():
|
||||||
return "1'b0"
|
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):
|
for loci, (site_type, site) in enumerate(brams):
|
||||||
|
|
||||||
def place_bram18():
|
def place_bram18():
|
||||||
|
|
@ -86,6 +93,12 @@ for loci, (site_type, site) in enumerate(brams):
|
||||||
'RAM_MODE': '"TDP"',
|
'RAM_MODE': '"TDP"',
|
||||||
'WRITE_MODE_A': '"WRITE_FIRST"',
|
'WRITE_MODE_A': '"WRITE_FIRST"',
|
||||||
'WRITE_MODE_B': '"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)
|
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_A = "WRITE_FIRST";
|
||||||
parameter WRITE_MODE_B = "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('''\
|
print('''\
|
||||||
(* LOC=LOC *)
|
(* LOC=LOC *)
|
||||||
|
|
@ -213,7 +233,14 @@ print(
|
||||||
.IS_RSTREGB_INVERTED(IS_RSTREGB_INVERTED),
|
.IS_RSTREGB_INVERTED(IS_RSTREGB_INVERTED),
|
||||||
.RAM_MODE(RAM_MODE),
|
.RAM_MODE(RAM_MODE),
|
||||||
.WRITE_MODE_A(WRITE_MODE_A),
|
.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 (
|
) ram (
|
||||||
.CLKARDCLK(din[0]),
|
.CLKARDCLK(din[0]),
|
||||||
.CLKBWRCLK(din[1]),
|
.CLKBWRCLK(din[1]),
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1 @@
|
||||||
/specimen_[0-9][0-9][0-9]/
|
build
|
||||||
/seg_clbl[lm].segbits
|
|
||||||
|
|
|
||||||
|
|
@ -1,20 +1,23 @@
|
||||||
N := 8
|
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))
|
SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS))
|
||||||
|
|
||||||
database: $(SPECIMENS_OK)
|
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:
|
pushdb:
|
||||||
${XRAY_MERGEDB} bram_l.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 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,,$@)
|
bash generate.sh $(subst /OK,,$@)
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
clean:
|
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
|
.PHONY: database pushdb clean
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,15 +2,16 @@
|
||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
|
FUZDIR=$PWD
|
||||||
source ${XRAY_GENHEADER}
|
source ${XRAY_GENHEADER}
|
||||||
|
|
||||||
python3 ../top.py >top.v
|
python3 $FUZDIR/top.py >top.v
|
||||||
vivado -mode batch -source ../generate.tcl
|
vivado -mode batch -source $FUZDIR/generate.tcl
|
||||||
test -z "$(fgrep CRITICAL vivado.log)"
|
test -z "$(fgrep CRITICAL vivado.log)"
|
||||||
|
|
||||||
for x in design*.bit; do
|
for x in design*.bit; do
|
||||||
${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o ${x}s -z -y $x
|
${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o ${x}s -z -y $x
|
||||||
done
|
done
|
||||||
|
|
||||||
python3 ../generate.py
|
python3 $FUZDIR/generate.py
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,8 @@ class Segmaker:
|
||||||
'''
|
'''
|
||||||
if '"' in site:
|
if '"' in site:
|
||||||
raise ValueError("Invalid site: %s" % 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
|
self.site_tags.setdefault(site, dict())[name] = value
|
||||||
|
|
||||||
def add_tile_tag(self, tile, name, value):
|
def add_tile_tag(self, tile, name, value):
|
||||||
|
|
|
||||||
|
|
@ -67,3 +67,12 @@ def parsei(s):
|
||||||
return 1
|
return 1
|
||||||
else:
|
else:
|
||||||
assert 0, 'FIXME'
|
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]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue