mirror of https://github.com/YosysHQ/yosys.git
Bram testbench (incomplete)
This commit is contained in:
parent
f29f4e7c83
commit
340e769667
|
@ -0,0 +1 @@
|
|||
temp
|
|
@ -0,0 +1,119 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
from __future__ import division
|
||||
from __future__ import print_function
|
||||
|
||||
import sys
|
||||
import random
|
||||
|
||||
def create_bram(dsc_f, sim_f, k1, k2):
|
||||
while True:
|
||||
init = random.randrange(2)
|
||||
abits = random.randrange(1, 16)
|
||||
dbits = random.randrange(1, 16)
|
||||
groups = random.randrange(5)
|
||||
|
||||
if random.randrange(2):
|
||||
abits = 2 ** random.randrange(1, 4)
|
||||
if random.randrange(2):
|
||||
dbits = 2 ** random.randrange(1, 4)
|
||||
|
||||
ports = [ random.randrange(3) for i in range(groups) ]
|
||||
wrmode = [ random.randrange(2) for i in range(groups) ]
|
||||
enable = [ random.randrange(4) for i in range(groups) ]
|
||||
transp = [ random.randrange(4) for i in range(groups) ]
|
||||
clocks = [ random.randrange(4) for i in range(groups) ]
|
||||
clkpol = [ random.randrange(4) for i in range(groups) ]
|
||||
|
||||
for p1 in range(groups):
|
||||
if wrmode[p1] == 0:
|
||||
enable[p1] = 0
|
||||
else:
|
||||
enable[p1] = 2**enable[p1]
|
||||
while dbits < enable[p1] or dbits % enable[p1] != 0:
|
||||
enable[p1] //= 2
|
||||
|
||||
config_ok = True
|
||||
if wrmode.count(1) <= ports.count(0): config_ok = False
|
||||
if wrmode.count(0) <= ports.count(0): config_ok = False
|
||||
if config_ok: break
|
||||
|
||||
print('bram bram_%03d_%03d' % (k1, k2), file=dsc_f)
|
||||
print(' init %d' % init, file=dsc_f)
|
||||
print(' abits %d' % abits, file=dsc_f)
|
||||
print(' dbits %d' % dbits, file=dsc_f)
|
||||
print(' groups %d' % groups, file=dsc_f)
|
||||
print(' ports %s' % " ".join(["%d" % i for i in ports]), file=dsc_f)
|
||||
print(' wrmode %s' % " ".join(["%d" % i for i in wrmode]), file=dsc_f)
|
||||
print(' enable %s' % " ".join(["%d" % i for i in enable]), file=dsc_f)
|
||||
print(' transp %s' % " ".join(["%d" % i for i in transp]), file=dsc_f)
|
||||
print(' clocks %s' % " ".join(["%d" % i for i in clocks]), file=dsc_f)
|
||||
print(' clkpol %s' % " ".join(["%d" % i for i in clkpol]), file=dsc_f)
|
||||
print('endbram', file=dsc_f)
|
||||
print('match bram_%03d_%03d' % (k1, k2), file=dsc_f)
|
||||
print('endmatch', file=dsc_f)
|
||||
|
||||
states = set()
|
||||
v_ports = set()
|
||||
v_stmts = list()
|
||||
|
||||
v_stmts.append("reg [%d:0] memory [0:%d];" % (dbits-1, 2**abits-1))
|
||||
|
||||
for p1 in range(groups):
|
||||
for p2 in range(ports[p1]):
|
||||
pf = "%c%d" % (chr(ord('A') + p1), p2 + 1)
|
||||
|
||||
if clocks[p1] and not ("CLK%d" % clocks[p1]) in v_ports:
|
||||
v_ports.add("CLK%d" % clocks[p1])
|
||||
v_stmts.append("input CLK%d;" % clocks[p1])
|
||||
|
||||
v_ports.add("%sADDR" % pf)
|
||||
v_stmts.append("input [%d:0] %sADDR;" % (abits-1, pf))
|
||||
|
||||
v_ports.add("%sDATA" % pf)
|
||||
v_stmts.append("%s [%d:0] %sDATA;" % ("input" if wrmode[p1] else "output reg", dbits-1, pf))
|
||||
|
||||
if wrmode[p1] and enable[p1]:
|
||||
v_ports.add("%sEN" % pf)
|
||||
v_stmts.append("input [%d:0] %sEN;" % (enable[p1]-1, pf))
|
||||
|
||||
assign_op = "<="
|
||||
if clocks[p1] == 0:
|
||||
v_stmts.append("always @* begin")
|
||||
assign_op = "="
|
||||
elif clkpol[p1] == 0:
|
||||
v_stmts.append("always @(negedge CLK%d) begin" % clocks[p1])
|
||||
elif clkpol[p1] == 1:
|
||||
v_stmts.append("always @(posedge CLK%d) begin" % clocks[p1])
|
||||
else:
|
||||
if not ('CP', clkpol[p1]) in states:
|
||||
v_stmts.append("parameter CLKPOL%d = 0;" % clkpol[p1])
|
||||
states.add(('CP', clkpol[p1]))
|
||||
if not ('CPW', clocks[p1], clkpol[p1]) in states:
|
||||
v_stmts.append("wire CLK%d_CLKPOL%d = CLK%d == CLKPOL%d;" % (clocks[p1], clkpol[p1], clocks[p1], clkpol[p1]))
|
||||
states.add(('CPW', clocks[p1], clkpol[p1]))
|
||||
v_stmts.append("always @(posedge CLK%d_CLKPOL%d) begin" % (clocks[p1], clkpol[p1]))
|
||||
|
||||
if wrmode[p1]:
|
||||
for i in range(enable[p1]):
|
||||
enrange = "[%d:%d]" % ((i+1)*dbits/enable[p1]-1, i*dbits/enable[p1])
|
||||
v_stmts.append(" if (%sEN[%d]) memory[%sADDR]%s %s %sDATA%s;" % (pf, i, pf, enrange, assign_op, pf, enrange))
|
||||
else:
|
||||
v_stmts.append(" %sDATA %s memory[%sADDR];" % (pf, assign_op, pf))
|
||||
v_stmts.append("end")
|
||||
|
||||
print('module bram_%03d_%03d(%s);' % (k1, k2, ", ".join(v_ports)), file=sim_f)
|
||||
for stmt in v_stmts:
|
||||
print(' %s' % stmt, file=sim_f)
|
||||
print('endmodule', file=sim_f)
|
||||
|
||||
for k1 in range(10):
|
||||
dsc_f = file('temp/brams_%03d.txt' % k1, 'w');
|
||||
sim_f = file('temp/brams_%03d.v' % k1, 'w');
|
||||
|
||||
for k2 in range(10):
|
||||
create_bram(dsc_f, sim_f, k1, k2)
|
||||
|
||||
dsc_f.close()
|
||||
sim_f.close()
|
||||
|
Loading…
Reference in New Issue