Add yosys-smtbmc VCD writer support for memories with async writes

This commit is contained in:
Clifford Wolf 2017-12-14 03:05:20 +01:00
parent 6132e6e72a
commit 9419de3e37
3 changed files with 11 additions and 7 deletions

View File

@ -554,8 +554,6 @@ struct Smt2Worker
int rd_ports = cell->getParam("\\RD_PORTS").as_int(); int rd_ports = cell->getParam("\\RD_PORTS").as_int();
int wr_ports = cell->getParam("\\WR_PORTS").as_int(); int wr_ports = cell->getParam("\\WR_PORTS").as_int();
decls.push_back(stringf("; yosys-smt2-memory %s %d %d %d %d\n", get_id(cell), abits, width, rd_ports, wr_ports));
bool async_read = false; bool async_read = false;
if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_ones()) { if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_ones()) {
if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_zero()) if (!cell->getParam("\\WR_CLK_ENABLE").is_fully_zero())
@ -563,6 +561,8 @@ struct Smt2Worker
async_read = true; async_read = true;
} }
decls.push_back(stringf("; yosys-smt2-memory %s %d %d %d %d %s\n", get_id(cell), abits, width, rd_ports, wr_ports, async_read ? "async" : "sync"));
string memstate; string memstate;
if (async_read) { if (async_read) {
memstate = stringf("%s#%d#final", get_id(module), arrayid); memstate = stringf("%s#%d#final", get_id(module), arrayid);

View File

@ -594,7 +594,7 @@ def write_vcd_trace(steps_start, steps_stop, index):
mem_trace_data = dict() mem_trace_data = dict()
for mempath in sorted(smt.hiermems(topmod)): for mempath in sorted(smt.hiermems(topmod)):
abits, width, rports, wports = smt.mem_info(topmod, mempath) abits, width, rports, wports, asyncwr = smt.mem_info(topmod, mempath)
expr_id = list() expr_id = list()
expr_list = list() expr_list = list()
@ -666,6 +666,7 @@ def write_vcd_trace(steps_start, steps_stop, index):
else: else:
buf[k] = tdata[i][k] buf[k] = tdata[i][k]
if not asyncwr:
tdata.append(data[:]) tdata.append(data[:])
for j_data in wdata[i]: for j_data in wdata[i]:
@ -679,6 +680,9 @@ def write_vcd_trace(steps_start, steps_stop, index):
if M[k] == "1": if M[k] == "1":
data[k] = D[k] data[k] = D[k]
if asyncwr:
tdata.append(data[:])
assert len(tdata) == len(rdata) assert len(tdata) == len(rdata)
netpath = mempath[:] netpath = mempath[:]
@ -785,7 +789,7 @@ def write_vlogtb_trace(steps_start, steps_stop, index):
mems = sorted(smt.hiermems(vlogtb_topmod)) mems = sorted(smt.hiermems(vlogtb_topmod))
for mempath in mems: for mempath in mems:
abits, width, rports, wports = smt.mem_info(vlogtb_topmod, mempath) abits, width, rports, wports, asyncwr = smt.mem_info(vlogtb_topmod, mempath)
addr_expr_list = list() addr_expr_list = list()
data_expr_list = list() data_expr_list = list()
@ -888,7 +892,7 @@ def write_constr_trace(steps_start, steps_stop, index):
mems = sorted(smt.hiermems(constr_topmod)) mems = sorted(smt.hiermems(constr_topmod))
for mempath in mems: for mempath in mems:
abits, width, rports, wports = smt.mem_info(constr_topmod, mempath) abits, width, rports, wports, asyncwr = smt.mem_info(constr_topmod, mempath)
addr_expr_list = list() addr_expr_list = list()
data_expr_list = list() data_expr_list = list()

View File

@ -387,7 +387,7 @@ class SmtIo:
self.modinfo[self.curmod].wsize[fields[2]] = int(fields[3]) self.modinfo[self.curmod].wsize[fields[2]] = int(fields[3])
if fields[1] == "yosys-smt2-memory": if fields[1] == "yosys-smt2-memory":
self.modinfo[self.curmod].memories[fields[2]] = (int(fields[3]), int(fields[4]), int(fields[5]), int(fields[6])) self.modinfo[self.curmod].memories[fields[2]] = (int(fields[3]), int(fields[4]), int(fields[5]), int(fields[6]), fields[7] == "async")
if fields[1] == "yosys-smt2-wire": if fields[1] == "yosys-smt2-wire":
self.modinfo[self.curmod].wires.add(fields[2]) self.modinfo[self.curmod].wires.add(fields[2])