3
0
Fork 0
mirror of https://github.com/YosysHQ/sby.git synced 2025-04-05 14:04:07 +00:00

Add "cover" mode

This commit is contained in:
Clifford Wolf 2017-02-05 15:44:01 +01:00
parent b8fefaa25b
commit ad4c0f2198
7 changed files with 80 additions and 3 deletions

View file

@ -1,3 +1,4 @@
demo demo
memory memory
prove prove
cover

View file

@ -0,0 +1,12 @@
[options]
mode cover
[engines]
smtbmc
[script]
read_verilog -formal cover.v
prep -top top
[files]
cover.v

View file

@ -0,0 +1,13 @@
module top (
input clk,
input [7:0] din
);
reg [31:0] state = 0;
always @(posedge clk) begin
state <= ((state << 5) + state) ^ din;
end
cover property (state == 'd 12345678);
cover property (state == 'h 12345678);
endmodule

View file

@ -8,7 +8,7 @@ formal tasks:
* Bounded verification of safety properties (assertions) * Bounded verification of safety properties (assertions)
* Unbounded verification of safety properties * Unbounded verification of safety properties
* Generation of test benches from cover statements [TBD] * Generation of test benches from cover statements
* Verification of liveness properties [TBD] * Verification of liveness properties [TBD]
* Formal equivalence checking [TBD] * Formal equivalence checking [TBD]

View file

@ -340,6 +340,10 @@ class SbyJob:
import sby_mode_prove import sby_mode_prove
sby_mode_prove.run(self) sby_mode_prove.run(self)
elif self.options["mode"] == "cover":
import sby_mode_cover
sby_mode_cover.run(self)
else: else:
assert False assert False

View file

@ -60,6 +60,10 @@ def run(mode, job, engine_idx, engine):
logfile_prefix += "_induction" logfile_prefix += "_induction"
smtbmc_opts.append("-i") smtbmc_opts.append("-i")
if mode == "cover":
smtbmc_opts.append("-c")
trace_prefix += "%"
task = SbyTask(job, taskname, job.model(model_name), task = SbyTask(job, taskname, job.model(model_name),
("cd %s; yosys-smtbmc --noprogress %s -t %d --dump-vcd %s.vcd --dump-vlogtb %s_tb.v --dump-smtc %s.smtc model/design_smt2.smt2") % ("cd %s; yosys-smtbmc --noprogress %s -t %d --dump-vcd %s.vcd --dump-vlogtb %s_tb.v --dump-smtc %s.smtc model/design_smt2.smt2") %
(job.workdir, " ".join(smtbmc_opts), job.opt_depth, trace_prefix, trace_prefix, trace_prefix), (job.workdir, " ".join(smtbmc_opts), job.opt_depth, trace_prefix, trace_prefix, trace_prefix),
@ -85,12 +89,12 @@ def run(mode, job, engine_idx, engine):
def exit_callback(retcode): def exit_callback(retcode):
assert task_status is not None assert task_status is not None
if mode == "bmc": if mode == "bmc" or mode == "cover":
job.status = task_status job.status = task_status
job.log("engine_%d: Status returned by engine: %s" % (engine_idx, task_status)) job.log("engine_%d: Status returned by engine: %s" % (engine_idx, task_status))
job.summary.append("engine_%d (%s) returned %s" % (engine_idx, " ".join(engine), job.status)) job.summary.append("engine_%d (%s) returned %s" % (engine_idx, " ".join(engine), job.status))
if job.status == "FAIL": if job.status == "FAIL" and mode != "cover":
job.summary.append("counterexample trace: %s/engine_%d/trace.vcd" % (job.workdir, engine_idx)) job.summary.append("counterexample trace: %s/engine_%d/trace.vcd" % (job.workdir, engine_idx))
job.terminate() job.terminate()

43
sbysrc/sby_mode_cover.py Normal file
View file

@ -0,0 +1,43 @@
#
# SymbiYosys (sby) -- Front-end for Yosys-based formal verification flows
#
# Copyright (C) 2016 Clifford Wolf <clifford@clifford.at>
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
import re, os, getopt
from sby_core import SbyTask
def run(job):
job.opt_depth = 20
if "depth" in job.options:
job.opt_depth = int(job.options["depth"])
for engine_idx in range(len(job.engines)):
engine = job.engines[engine_idx]
assert len(engine) > 0
job.log("engine_%d: %s" % (engine_idx, " ".join(engine)))
os.makedirs("%s/engine_%d" % (job.workdir, engine_idx))
if engine[0] == "smtbmc":
import sby_engine_smtbmc
sby_engine_smtbmc.run("cover", job, engine_idx, engine)
else:
assert False
job.taskloop()