3
0
Fork 0
mirror of https://github.com/YosysHQ/sby.git synced 2025-08-11 07:40:54 +00:00

Test property statuses for cover_assert

Cover properties shouldn't be marked fail when the test failed early due to an assertion.
This should fail without other changes.
This commit is contained in:
Krystine Sherwin 2025-07-05 12:40:57 +12:00
parent 4d8462b58e
commit 911ae02ee5
No known key found for this signature in database
5 changed files with 105 additions and 0 deletions

2
tests/statusdb/Makefile Normal file
View file

@ -0,0 +1,2 @@
SUBDIR=statusdb
include ../make/subdir.mk

59
tests/statusdb/mixed.py Normal file
View file

@ -0,0 +1,59 @@
import json
import sqlite3
import sys
def get_prop_type(prop: str):
prop = json.loads(prop or "[]")
name_parts = prop[-1].split("_")
if name_parts[0] == "\check":
# read_verilog style
# \check_cover_mixed_v...
return name_parts[1]
else:
# verific style
# \assert_auto_verificsva_cc...
return name_parts[0][1:]
def main():
workdir = sys.argv[1]
with open(f"{workdir}/status.path", "r") as status_path_file:
status_path = f"{workdir}/{status_path_file.read().rstrip()}"
# read only database
con = sqlite3.connect(f"file:{status_path}?mode=ro", uri=True)
db = con.cursor()
# custom sql to get all task property statuses for the current workdir
rows = db.execute(
"""
SELECT task.id, task_property.name, task_property.src, task_property_status.status
FROM task
LEFT JOIN task_property ON task_property.task=task.id
LEFT JOIN task_property_status ON task_property_status.task_property=task_property.id
WHERE task.workdir=:workdir;
""",
{"workdir": workdir}
).fetchall()
# only check the most recent iteration of the test
last_id = 0
for row_id, _, _, _ in rows:
if row_id > last_id:
last_id = row_id
for row_id, prop, src, status in rows:
if row_id != last_id:
continue
prop_type = get_prop_type(prop)
valid_status: list[None|str] = []
if workdir in ["mixed_bmc", "mixed_assert"] and prop_type == "assert":
valid_status = ["FAIL"]
elif workdir == "mixed_bmc" and prop_type == "cover":
valid_status = [None, "UNKNOWN"]
elif workdir == "mixed_assert" and prop_type == "cover":
valid_status = ["PASS", None, "UNKNOWN"]
elif workdir == "mixed_no_assert" and prop_type == "assert":
valid_status = [None, "UNKNOWN"]
elif workdir == "mixed_no_assert" and prop_type == "cover":
valid_status = ["PASS"]
assert status in valid_status, f"Unexpected {prop_type} status {status} for {prop} ({src})"
if __name__ == "__main__":
main()

24
tests/statusdb/mixed.sby Normal file
View file

@ -0,0 +1,24 @@
[tasks]
no_assert cover
assert cover
bmc
[options]
cover: mode cover
bmc: mode bmc
bmc: depth 1
assert: cover_assert on
no_assert: expect pass
~no_assert: expect fail
[engines]
cover: smtbmc boolector
bmc: smtbmc boolector
[script]
read -formal mixed.v
prep -top test
[files]
mixed.v

4
tests/statusdb/mixed.sh Normal file
View file

@ -0,0 +1,4 @@
#!/bin/bash
set -e
python3 $SBY_MAIN -f $SBY_FILE $TASK
python3 ${SBY_FILE%.sby}.py $WORKDIR

16
tests/statusdb/mixed.v Normal file
View file

@ -0,0 +1,16 @@
module test (input CP, CN, input A, B, output reg XP, XN);
reg [7:0] counter = 0;
always @* begin
assume (A || B);
assume (!A || !B);
assert (A == B);
cover (counter == 3 && A);
cover (counter == 3 && B);
end
always @(posedge CP)
counter <= counter + 1;
always @(posedge CP)
XP <= A;
always @(negedge CN)
XN <= B;
endmodule