mirror of https://github.com/openXC7/prjxray.git
Merge pull request #674 from litghost/wide_sdp_config
Add bits for SDP 36-bit BRAM.
This commit is contained in:
commit
de92aa9e60
|
|
@ -79,10 +79,17 @@ def rw_width_tags(segmk, ps, site):
|
||||||
9 1 1 0
|
9 1 1 0
|
||||||
18 0 0 1
|
18 0 0 1
|
||||||
'''
|
'''
|
||||||
for param in ["READ_WIDTH_A", "READ_WIDTH_B", "WRITE_WIDTH_A",
|
params = ["READ_WIDTH_A", "READ_WIDTH_B", "WRITE_WIDTH_A", "WRITE_WIDTH_B"]
|
||||||
"WRITE_WIDTH_B"]:
|
|
||||||
|
for param in params:
|
||||||
set_val = int(ps[param])
|
set_val = int(ps[param])
|
||||||
|
|
||||||
|
if set_val == 0:
|
||||||
|
set_val = 1
|
||||||
|
|
||||||
|
if set_val >= 36:
|
||||||
|
continue
|
||||||
|
|
||||||
def mk(x):
|
def mk(x):
|
||||||
return '%s_%u' % (param, x)
|
return '%s_%u' % (param, x)
|
||||||
|
|
||||||
|
|
@ -136,7 +143,14 @@ def run():
|
||||||
|
|
||||||
isinv_tags(segmk, ps, site, clk_inverts[site])
|
isinv_tags(segmk, ps, site, clk_inverts[site])
|
||||||
bus_tags(segmk, ps, site)
|
bus_tags(segmk, ps, site)
|
||||||
rw_width_tags(segmk, ps, site)
|
if ps['RAM_MODE'] == '"TDP"':
|
||||||
|
rw_width_tags(segmk, ps, site)
|
||||||
|
segmk.add_site_tag(
|
||||||
|
site, 'SDP_READ_WIDTH_36', ps['RAM_MODE'] == '"SDP"'
|
||||||
|
and int(ps['READ_WIDTH_A']) == 36)
|
||||||
|
segmk.add_site_tag(
|
||||||
|
site, 'SDP_WRITE_WIDTH_36', ps['RAM_MODE'] == '"SDP"'
|
||||||
|
and int(ps['WRITE_WIDTH_B']) == 36)
|
||||||
write_mode_tags(segmk, ps, site)
|
write_mode_tags(segmk, ps, site)
|
||||||
write_rstreg_priority(segmk, ps, site)
|
write_rstreg_priority(segmk, ps, site)
|
||||||
write_rdaddr_collision(segmk, ps, site)
|
write_rdaddr_collision(segmk, ps, site)
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,28 @@ def place_bram18(site, loci):
|
||||||
# Datasheet says 72 is legal in some cases, but think its a copy paste error from BRAM36
|
# Datasheet says 72 is legal in some cases, but think its a copy paste error from BRAM36
|
||||||
# also 0 and 36 aren't real sizes
|
# also 0 and 36 aren't real sizes
|
||||||
# Bias choice to 18 as its needed to solve certain bits quickly
|
# Bias choice to 18 as its needed to solve certain bits quickly
|
||||||
widths = [1, 2, 4, 9, 18, 18, 18, 18]
|
widths = [1, 2, 4, 9, 18, 18, 36]
|
||||||
|
mode = '"TDP"'
|
||||||
|
|
||||||
|
read_width_a = random.choice(widths)
|
||||||
|
write_width_b = random.choice(widths)
|
||||||
|
if read_width_a >= 36 or write_width_b >= 36:
|
||||||
|
read_width_b = 0
|
||||||
|
write_width_a = 0
|
||||||
|
mode = '"SDP"'
|
||||||
|
doa_reg = vrandbit()
|
||||||
|
dob_reg = doa_reg
|
||||||
|
write_modes = ["WRITE_FIRST", "READ_FIRST"]
|
||||||
|
rstreg_priority_a = verilog.quote(random.choice(priorities))
|
||||||
|
rstreg_priority_b = rstreg_priority_a
|
||||||
|
else:
|
||||||
|
read_width_b = random.choice(widths)
|
||||||
|
write_width_a = random.choice(widths)
|
||||||
|
doa_reg = vrandbit()
|
||||||
|
dob_reg = vrandbit()
|
||||||
|
rstreg_priority_a = verilog.quote(random.choice(priorities))
|
||||||
|
rstreg_priority_b = verilog.quote(random.choice(priorities))
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
'LOC': verilog.quote(site),
|
'LOC': verilog.quote(site),
|
||||||
'IS_CLKARDCLK_INVERTED': vrandbit(),
|
'IS_CLKARDCLK_INVERTED': vrandbit(),
|
||||||
|
|
@ -61,22 +82,22 @@ def place_bram18(site, loci):
|
||||||
'IS_RSTRAMB_INVERTED': vrandbit(),
|
'IS_RSTRAMB_INVERTED': vrandbit(),
|
||||||
'IS_RSTREGARSTREG_INVERTED': vrandbit(),
|
'IS_RSTREGARSTREG_INVERTED': vrandbit(),
|
||||||
'IS_RSTREGB_INVERTED': vrandbit(),
|
'IS_RSTREGB_INVERTED': vrandbit(),
|
||||||
'RAM_MODE': '"TDP"',
|
'RAM_MODE': mode,
|
||||||
'WRITE_MODE_A': verilog.quote(random.choice(write_modes)),
|
'WRITE_MODE_A': verilog.quote(random.choice(write_modes)),
|
||||||
'WRITE_MODE_B': verilog.quote(random.choice(write_modes)),
|
'WRITE_MODE_B': verilog.quote(random.choice(write_modes)),
|
||||||
"DOA_REG": vrandbit(),
|
"DOA_REG": doa_reg,
|
||||||
"DOB_REG": vrandbit(),
|
"DOB_REG": dob_reg,
|
||||||
"SRVAL_A": vrandbits(18),
|
"SRVAL_A": vrandbits(18),
|
||||||
"SRVAL_B": vrandbits(18),
|
"SRVAL_B": vrandbits(18),
|
||||||
"INIT_A": vrandbits(18),
|
"INIT_A": vrandbits(18),
|
||||||
"INIT_B": vrandbits(18),
|
"INIT_B": vrandbits(18),
|
||||||
"READ_WIDTH_A": random.choice(widths),
|
"READ_WIDTH_A": read_width_a,
|
||||||
"READ_WIDTH_B": random.choice(widths),
|
"READ_WIDTH_B": read_width_b,
|
||||||
"WRITE_WIDTH_A": random.choice(widths),
|
"WRITE_WIDTH_A": write_width_a,
|
||||||
"WRITE_WIDTH_B": random.choice(widths),
|
"WRITE_WIDTH_B": write_width_b,
|
||||||
"RDADDR_COLLISION_HWCONFIG": verilog.quote(random.choice(collisions)),
|
"RDADDR_COLLISION_HWCONFIG": verilog.quote(random.choice(collisions)),
|
||||||
"RSTREG_PRIORITY_A": verilog.quote(random.choice(priorities)),
|
"RSTREG_PRIORITY_A": rstreg_priority_a,
|
||||||
"RSTREG_PRIORITY_B": verilog.quote(random.choice(priorities)),
|
"RSTREG_PRIORITY_B": rstreg_priority_b,
|
||||||
}
|
}
|
||||||
|
|
||||||
return ('my_RAMB18E1', ports, params)
|
return ('my_RAMB18E1', ports, params)
|
||||||
|
|
@ -204,7 +225,7 @@ def main():
|
||||||
.DIBDI(din[5]),
|
.DIBDI(din[5]),
|
||||||
.DIPADIP(din[6]),
|
.DIPADIP(din[6]),
|
||||||
.DIPBDIP(din[7]),
|
.DIPBDIP(din[7]),
|
||||||
.WEA(din[0]),
|
.WEA(1'b0),
|
||||||
.WEBWE(din[1]),
|
.WEBWE(din[1]),
|
||||||
.DOADO(dout[0]),
|
.DOADO(dout[0]),
|
||||||
.DOBDO(dout[1]),
|
.DOBDO(dout[1]),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue