{"id":12921,"date":"2017-12-06T15:56:28","date_gmt":"2017-12-06T22:56:28","guid":{"rendered":"https:\/\/blogs.mentor.com\/verificationhorizons\/?p=12921"},"modified":"2026-03-27T08:51:34","modified_gmt":"2026-03-27T12:51:34","slug":"formal-tech-tip-what-are-vacuous-proofs-why-they-are-bad-and-how-to-fix-them","status":"publish","type":"post","link":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/2017\/12\/06\/formal-tech-tip-what-are-vacuous-proofs-why-they-are-bad-and-how-to-fix-them\/","title":{"rendered":"Formal Tech Tip: What are Vacuous Proofs, Why They Are Bad, and How to Fix Them"},"content":{"rendered":"<p><a href=\"https:\/\/blogs.sw.siemens.com\/wp-content\/uploads\/sites\/54\/2017\/11\/r-y-traffic-light1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-12920 alignright\" src=\"https:\/\/blogs.sw.siemens.com\/wp-content\/uploads\/sites\/54\/2017\/11\/r-y-traffic-light1.jpg\" alt=\"\" width=\"129\" height=\"240\" \/><\/a>In formal verification, proving all of your properties is pretty much the main goal of the whole exercise \u2013 if all the assertions are proven, clearly the design has been exhaustively verified. This suggests that there is no such thing as a \u201cbad proof\u201d, right? Wrong! There is one case where a proof is bad \u2013 misleading, actually. It is when a proof is \u201cvacuous\u201d. What is this bad apple, how can you spot it, and how can you fix it?\u00a0 Read on \u2026<\/p>\n<p><u>What is a \u201cvacuous proof\u201d?<\/u><\/p>\n<p>It often starts with a poorly written property: the \u201cantecedent\u201d \u2013 i.e. the definition on the left-hand-side of the operator \u2013 defines an inconsistent state that can never be true. The most common occurrence of this is when you mistakenly AND a signal to its complement somehow. This seems like it would be an easy mistake to spot, but when signals go through a lot of combinatorial logic, and\/or change names when they cross IP boundaries or layers of hierarchy, you can lose track of such things pretty quickly. Regardless, the \u201cproof\u201d result from such a \u201cself-vacuous\u201d property is an empty set, hence the term \u201cvacuous proof\u201d.<\/p>\n<p>A similar source of \u201cvacuity\u201d is when your constraints (via \u201cassume\u201d, \u201cassert\u201d, or \u201ccover\u201d statements in SVA or PSL) constrict the input such that the \u201cantecedent\u201d in a property can never be true.<\/p>\n<p>Finally, if the behavior described by a property is simply not supported by the design, or vice-versa, you can also get a vacuous proof. For example, imagine you are verifying a traffic light controller where the spec says the light will go from Red-to-Green, Green-to-Yellow, Yellow-to-Red, and then loop back again. You write properties for this, but the tool comes back reporting them as vacuous \u2013 what gives? As it turns out, your colleague sent you the DUT code for a type of European traffic light controller that briefly flashes the Yellow light after a Red signal, THEN goes to Green. In this case, the vacuous proof is the fault of a spec or DUT configuration bug, and not a problem with the constraint properties, per se. But we\u2019re getting ahead of ourselves \u2026<\/p>\n<p><u>How can you find out whether a property \/ proof is vacuous?<\/u><\/p>\n<p>The good news is that quite often modern formal analysis tools like <a href=\"https:\/\/eda.sw.siemens.com\/en-US\/ic\/questa\/formal-verification\/property-checking\/\" target=\"_blank\" rel=\"noopener\">Questa PropCheck<\/a> will flag vacuous properties immediately after the analysis is started. Building on this momentum, a related and easy \u201cpro tip\u201d to try is to temporarily remove ALL the constraint properties \u2013 just comment out all the \u201cassume\u201d statements for a moment, re-run <a href=\"https:\/\/eda.sw.siemens.com\/en-US\/ic\/questa\/formal-verification\/property-checking\/\" target=\"_blank\" rel=\"noopener\">PropCheck<\/a>, and see which assertions are reported as \u201cvacuous\u201d.\u00a0 Fix these erroneous properties using the guidance below before proceeding.<\/p>\n<p>Next, bring back in all the constraints and re-run <a href=\"https:\/\/eda.sw.siemens.com\/en-US\/ic\/questa\/formal-verification\/property-checking\/\" target=\"_blank\" rel=\"noopener\">PropCheck<\/a>. This time some perfectly good properties could still be reported as being \u201cvacuous\u201d. Chances are this is due to either:<\/p>\n<p>(A) An overly aggressive constraint, or set of constraints (as warned above)<\/p>\n<p>or<\/p>\n<p>(B) A bug in the specification, or either the property code writer or the DUT developer misread the spec such that they coded state transitions that simply can\u2019t happen because their property or DUT code completely skips intermediate states (as per the US vs. EU traffic light controller example)<\/p>\n<p><u>How can you fix a property that caused a vacuous proof?<\/u><\/p>\n<p>Naturally, the first step is to go ahead and fix any obvious errors in the antecedent (left hand side) of properties reported as vacuous by editing the property to describe possible behavior between the signals.<\/p>\n<p>But what if all the properties are \u201cclean\u201d, but some of these perfectly good properties are still being reported as being \u201cvacuous\u201d?\u00a0 As suggested above, your constraint properties somehow conflict with each other to produce a false positive result. There are two ways to address this:<\/p>\n<p>1 \u2013 If your formal tool does not have a formal coverage analysis capability, there is very clever methodology described in the Verification Horizons article titled \u201c<a href=\"https:\/\/verificationacademy.com\/verification-horizons\/november-2015-volume-11-issue-3\/minimizing-constraints-to-debug-vacuous-proofs\" target=\"_blank\" rel=\"noopener\"><em>Minimizing Constraints to Debug Vacuous Proofs<\/em><\/a>\u201d by Anshul Jain of Oski Technology. In a nutshell, Anshul outlines an easy-to-implement \u201cdivide and conquer\u201d methodology that identifies a \u201cminimum failing subset\u201d (MFS) of constraints with a minimum number of formal runs. As the article shows, even if you have 1,000 constraint properties, if one constraint is the culprit the worst-case is that you will only have to do 15 iterations to find your needle in a haystack.<\/p>\n<p>2 \u2013 If you are using <a href=\"https:\/\/eda.sw.siemens.com\/en-US\/ic\/questa\/formal-verification\/property-checking\/\" target=\"_blank\" rel=\"noopener\">Questa PropCheck<\/a> you are in luck: <a href=\"https:\/\/eda.sw.siemens.com\/en-US\/ic\/questa\/formal-verification\/property-checking\/\" target=\"_blank\" rel=\"noopener\">PropCheck<\/a> includes formal coverage analysis \u2013 no separate license is needed! Specifically, the formal coverage on the vacuously proven property tells you what logic\/assumptions, if any, were used to determine the property as vacuous. With this information, you can immediately zero in on places to look to debug and fix the vacuous property by removing\/rewriting constraints, fixing the antecedent to match spec\/design behavior, or fixing self-vacuous conditions.<\/p>\n<p>Detailing PropCheck\u2019s coverage capabilities will be the subject of future posts, but in the meantime formal verification expert Mark Eslinger has posted some <a href=\"https:\/\/verificationacademy.com\/courses\/formal-coverage\" target=\"_blank\" rel=\"noopener\">technical video presentations<\/a> on Verification Academy on how formal coverage can be used to debug properties &#8212; vacuous and otherwise; as well as help resolve Inconclusives, and expedite over-constraint and state reachability analysis.<\/p>\n<p>In conclusion, vacuous proofs need to be addressed because they give you no information about the DUT behavior you are looking to verify. They can be caused by self-vacuous properties (the A &amp; !A clear conflict), or be \u201cvacuous with respect to the design\u201d if the spec and implementation are mismatched. Once constraints are added into the picture, then proofs which are \u201cvacuous with respect to the constraint\u201d could show up. The good news is that <a href=\"https:\/\/eda.sw.siemens.com\/en-US\/ic\/questa\/formal-verification\/property-checking\/\" target=\"_blank\" rel=\"noopener\">Questa PropCheck<\/a> has built-in capabilities to quickly discover and fix all these cases.<\/p>\n<p>Joe Hupcey III,<br \/>\nfor the Questa Formal Team<\/p>\n<p><strong>Reference links:<\/strong><\/p>\n<ul>\n<li>Wikipedia: the mathematical definition of \u201c<a href=\"https:\/\/en.wikipedia.org\/wiki\/Vacuous_truth\" target=\"_blank\" rel=\"noopener\">vacuous truth<\/a>\u201d<\/li>\n<li>Verification Horizons, \u201c<a href=\"https:\/\/verificationacademy.com\/verification-horizons\/november-2015-volume-11-issue-3\/minimizing-constraints-to-debug-vacuous-proofs\" target=\"_blank\" rel=\"noopener\"><em>Minimizing Constraints to Debug Vacuous Proofs<\/em><\/a>\u201d by Anshul Jain of Oski Technology<\/li>\n<li>Verification Horizons blog, November 2015: <a href=\"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/2015\/11\/18\/formal-tech-tip-how-good-properties-can-be-over-constrained-and-how-to-fix-it\/\"><em>Formal Tech Tip: How Good Properties Can be Over-constrained and How to Fix It<\/em><\/a><\/li>\n<li>Quora: <a href=\"https:\/\/www.quora.com\/Why-do-traffic-lights-in-some-countries-like-the-UK-go-amber-red-then-green-rather-than-straight-from-red-to-green\" target=\"_blank\" rel=\"noopener\">Why do traffic lights in some countries (like the UK) go amber-red then green, rather than straight from red to green<\/a>?<\/li>\n<li>Video: <a href=\"https:\/\/youtu.be\/xqOcw6XeOeg\" target=\"_blank\" rel=\"noopener\">A traffic light in Germany going from Red, to Red-Yellow, and then finally to Green<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In formal verification, proving all of your properties is pretty much the main goal of the whole exercise \u2013 if&#8230;<\/p>\n","protected":false},"author":71594,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spanish_translation":"","french_translation":"","german_translation":"","italian_translation":"","polish_translation":"","japanese_translation":"","chinese_translation":"","footnotes":""},"categories":[1],"tags":[],"industry":[],"product":[],"coauthors":[931],"class_list":["post-12921","post","type-post","status-publish","format-standard","hentry","category-news"],"_links":{"self":[{"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/posts\/12921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/users\/71594"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/comments?post=12921"}],"version-history":[{"count":1,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/posts\/12921\/revisions"}],"predecessor-version":[{"id":18354,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/posts\/12921\/revisions\/18354"}],"wp:attachment":[{"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/media?parent=12921"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/categories?post=12921"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/tags?post=12921"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/industry?post=12921"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/product?post=12921"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blogs.sw.siemens.com\/verificationhorizons\/wp-json\/wp\/v2\/coauthors?post=12921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}