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:
parent
b8fefaa25b
commit
ad4c0f2198
1
docs/examples/quickstart/.gitignore
vendored
1
docs/examples/quickstart/.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
demo
|
demo
|
||||||
memory
|
memory
|
||||||
prove
|
prove
|
||||||
|
cover
|
||||||
|
|
12
docs/examples/quickstart/cover.sby
Normal file
12
docs/examples/quickstart/cover.sby
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
[options]
|
||||||
|
mode cover
|
||||||
|
|
||||||
|
[engines]
|
||||||
|
smtbmc
|
||||||
|
|
||||||
|
[script]
|
||||||
|
read_verilog -formal cover.v
|
||||||
|
prep -top top
|
||||||
|
|
||||||
|
[files]
|
||||||
|
cover.v
|
13
docs/examples/quickstart/cover.v
Normal file
13
docs/examples/quickstart/cover.v
Normal 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
|
|
@ -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]
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
43
sbysrc/sby_mode_cover.py
Normal 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()
|
||||||
|
|
Loading…
Reference in a new issue