Hi Ed, Probably I was not clear enough, but I meant that in *** the most interesting cases *** in SVA it may be replaced by sequence fusion (##0). Sure you cannot always use the sequence fusion for that. But the only interesting scenario for the coverage is the sequence fusion, therefore I am saying that there is no need for followed_by if we are talking about coverage only. Thanks, Dmitry -----Original Message----- From: Eduard Cerny [mailto:Eduard.Cerny@synopsys.com] Sent: Tuesday, March 14, 2006 3:22 PM To: Korchemny, Dmitry; Doron Bustan Cc: sv-ac@eda.org Subject: RE: [sv-ac] Issue 805 Hello Doron, Dmitry, I agree with Doron, followed_by as the dual of |-> is needed, because ##0 cannot be used with property on the RHS. If a cover property is under a condition it shouuld be converted to followed by rather than |->, where the condition is on the LHS. I do not see much of a problem implementing followed_by. Should there be two forms, one overlapping and one non-overlapping? ed > -----Original Message----- > From: owner-sv-ac@eda.org [mailto:owner-sv-ac@eda.org] On > Behalf Of Korchemny, Dmitry > Sent: Tuesday, March 14, 2006 8:14 AM > To: Doron Bustan > Cc: sv-ac@eda.org > Subject: RE: [sv-ac] Issue 805 > > Hi Doron, > > I agree with your property coverage generalization with > followed_by, but > I see several usability problems with this approach: > * Property coverage (A|->B) becomes meaningless. This is problematic > because the cover property statement may be located under a > conditional > statement, and then it has an implicit enabling condition > * The reset condition handling is still problematic > * Using followed_by in assertions may be difficult for simulators, and > when introduced this operator should be supported everywhere. I think > that this operator should be introduced only in case if SVA > is extended > with LTL operators (similarly to PSL). Otherwise its applicability is > questionable since in the most interesting cases in SVA it may be > replaced by sequence fusion (##0) > > Therefore I am suggesting defining > cover property (disable iff(rst) A |-> B) as assert property (disable > iff A |-> not B) where the failures of the latter statement are > considered to be cover points of the former one. > > See details in Mantis 1383. > > Sorry for the late answer. > Dmitry > > -----Original Message----- > From: Doron Bustan [mailto:dbustan@freescale.com] > Sent: Wednesday, March 01, 2006 12:45 AM > To: Korchemny, Dmitry > Cc: sv-ac@eda.org > Subject: Re: [sv-ac] Issue 805 > > I suggest that the definition of the semantic of coverage goal be as > follows: > > Let 'w' be a computation, and P be a property, then w satisfies cover > property (P) > iff for some 0 <= i < |w|, we have that w^{i..}, {} |= P. > > Where the |= relation is the one defined in appendix E.3.5. > > I agree that sometime people mistakenly write cover properties of the > form R |-> P, when > they want to identify a match of R followed by a satisfaction > of P. This > > should be written > as "not (R |-> not P)". I suggest that we will defined a derived > operator "followed_by" > (similar to forespec) such that "R followed_by P" is > equivalent to "not > (R |-> not P)". This > will enable a more intuitive form of writing cover properties. > > Doron > > Korchemny, Dmitry wrote: > > > Hi all, > > > > I would like to understand what the request incentive is: a need in > > proper /cover/ statement semantics definition or a need to > collect a > > richer statistics - how many times the reset signal rose. I > don't have > > > anything against reporting reset statistics, except for > minor comments > > > given below, but I guess that the main point of the enhancement > > request is the statement semantics and this request is aimed to > > disable pathological coverage reporting. Therefore I would like to > > address mainly the latter issue. > > > > The semantics of the /cover/ statement is not defined > anywhere in the > > LRM, and there are only several words about property coverage > > collection in the dynamic simulation environment. We need > to define a > > formal semantics for /cover/ statement both to avoid > ambiguity in the > > LRM interpretation, to be confident that the coverage concept is > > always meaningful and to allow cover statement usage by formal > > analysis tools. > > > > The informal semantics of the /assert/ statement is to make > sure that > > the property is (*always*) correct. When the property is > violated then > > > the counter-example is either generated by formal analysis > tools or is > > > provided as a simulation trace fragment by dynamic > simulation tools. > > The informal semantics if the /cover/ statement is to make > sure that > > the property is feasible, i.e., it *may be* correct, and the tools > > should provide witness for it: the formal analysis tools should > > generate such a witness, while dynamic simulation tools > should provide > > > a trace fragment along with the collected statistics. > > > > Let's try to define the /cover/ statement semantics > formally. I will > > be using in the sequel the following LTL pseudo-code: > > > > * globally says that the property is checked each clock phase > > * eventually means some time in the future > > > > and will assume all clock events to be fair. I also assume in all > > below examples that the assertions are written outside of > an initial > > block, i.e., implicit /always/ semantics is applicable to them. > > > > The first attempt would be to define /cover/ /property/ as > /assert/ of > > > its negation. Then the assertion counter-example is a coverage > > witness. But this straightforward definition won't reflect our > > intention. Consider the simplest cover statement: > > > > (always) cover property (@(clk) a); // a is a Boolean expression > > > > Its pseudo code notation is: > > > > cover property (@(clk) globally a); > > > > After negation we get: > > > > assert property (@(clk) eventually !a); > > > > I.e., the property is covered if a never holds, this is > apparently not > > > our intention: the property is covered when a eventually holds. > > > > Here is the second take: > > > > cover property (@(clk) globally p) succeeds iff assert property > > (@(clk) globally not p)) fails > > > > In the case when p is a Boolean expression, or even a sequence this > > definition works: if at some moment p is high (or the sequence is > > matched), the property is covered. > > > > But in the common case, when p is a property, the problem persists: > > > > cover property ((@clk) globally a |=> b) succeeds iff? > assert property > > > ((clk) globally a ##1 !b); fails > > > > Has the property been covered if a never happens? According > to LRM it > > has, but it has been covered vacuously for the antecedent never > > happens. This definition of coverage is problematic: e.g., it is > > always recommended to avoid writing such /cover/ > properties. More than > > > that, this LRM definition of coverage is contradictory. The section > > 17.13.5 "Embedding concurrent assertions in procedural code": reads > > > > Another inference made from the context is the enabling > condition for > > a property. Such derivation takes place when a property is > placed in > > an if...else block or a case block. The enabling condition assumed > > > > from the context is used as the antecedent of the property. > > > > *property *r3; > > > > @(*posedge *mclk)(q != d); > > > > *endproperty* > > > > * * > > > > *always *@(*posedge *mclk) *begin* > > > > *if *(a) *begin* > > > > q <= d1; > > > > r3_p: *assert property *(r3); > > > > *end* > > > > *end* > > > > The above example is equivalent to the following: > > > > *property *r3; > > > > @(*posedge *mclk)a |-> (q != d); > > > > *endproperty* > > > > r3_p: *assert property *(r3); > > > > *always *@(*posedge *mclk) *begin* > > > > *if *(a) *begin* > > > > q <= d1; > > > > *end* > > > > *end* > > > > According to this definition if we substitute in the above examples > > /assert/ with /cover/, our property will be covered (even though > > vacuously) if a never happened! Such definition of coverage is > > somewhat counter-intuitive. > > > > Therefore, it seems to me that the acceptable definition of the > > /cover/ statement semantics would be: > > > > cover property ((@clk) globally disable iff (rst) s |-> p)) > succeeds > > iff assert property ((@clk) globally disable iff (rst) s > |-> *not* p)) > > > fails > > > > or in pure SVA: > > > > cover property ((@clk) disable iff (rst) s |-> p)) succeeds > iff assert > > > property ((@clk) disable iff (rst) s |-> *not* p)) fails > > > > Such semantics solves also the reset problem: when the reset > > expression is true, the assertion cannot fail, and therefore the > > original property cannot be covered. Therefore it looks to > me that the > > > reset being high is not a coverage event, and should not be > reported > > as such. > > > > Below is the summary. > > > > Suggestion: > > > > ======== > > > > I suggest defining the /cover property/ semantics as: > > > > cover property ((@clk) disable iff (rst) s |-> p)) succeeds > iff assert > > > property ((@clk) disable iff (rst) s |-> *not* p)) fails > > > > The /cover /statement reports coverage when the corresponding > > assertion fails for any property of the form s|->p, where s is a > > sequence and p is a property. The formal definition is: > > > > For the property of the form A |-> B (when A |=> B is > considered to be > > > A|-> ##1 B) > > > > cover property ((@clk) disable iff (rst) A |-> B)) succeeds > iff assert > > > property ((@clk) disable iff (rst) A |-> *not* B)) fails > > > > Otherwise > > > > cover property ((@clk) disable iff (rst) B)) succeeds iff assert > > property ((@clk) disable iff (rst) *not* B)) fails > > > > If the /cover/ statement is located inside a conditional statement, > > the inferred condition is automatically taken into account. E.g., > > > > If a property > > > > cover property (a); has an inferred enabling condition en, the > equivalence > > > > cover property (a) succeeds iff assert property(not a) > fails is still > > valid, since both statements are actually > > > > cover property (en |-> a) succeeds iff assert property(en |-> not a) > fails > > > > Discussion: > > > > ======== > > > > 1. I suggest adding a specification of /cover/ statement > for formal > > analysis tools: a /cover/ statement is equivalent to a > > corresponding /assert/ statement, but the generated > > counter-example should be called witness and the tool should > > report success. If the corresponding assertion > passes, the tool > > should report the coverage failure. > > 2. The coverage action statement should be executed each time the > > property is covered (like else in the assertion). According to > > the proposed definition the action statement won't > execute when > > reset is high or a triggering condition was not met. > > 3. "Number of times succeeded" means the number of times the dual > > assertion fails > > 4. "Number of times the property failed" is not quite clear. Does > > it mean that /cover property(p)/ fails when /assert property > > (p)/ fails? > > 5. "Number of times succeeded because of vacuity" is no longer > > valid. The accurate statement would be number of > times triggered > > (I would even say attempted, but it probably has another > > meaning). Should we report this number when the antecedent is > > trivial (always true)? > > 6. The definition of sequence coverage should be refined > (if it is > > needed at all). Do we have a case of sequence > coverage when B is > > a sequence (in the above definition)? But in this case the > > number of times triggered is still relevant. > > 7. "Number of time matched" for sequences is not clear - does it > > coincide with the number of times succeeded? (see > previous item) > > 8. If wanted, the information about reset signal can also be > > collected (this is the actual content of #805), but instead of > > "Number of times succeeded because of disabling" it should be > > something like "Number of times the reset rose" > > 9. All stated above is applicable to the corresponding > vpi calls as > > well. > > 10. The case of a cover property inside an initial block is > > syntactically identical. Semantic difference is that the > > implicit /globally/ operator should be dropped in > both /assert/ > > and /cover/ statements. > > 11. Completely different observation: adding more and more > > requirements to the data to be collected will > negatively affect > > the simulation performance, and the standard should give the > > user means to control the reporting level. > > > > General Disclaimer: > > > > ============== > > > > Since I don't always have enough time to collect the feedback from > > other Intel people, my position in some cases may change when this > > feedback becomes available. I won't add this disclaimer to my > > subsequent messages, but it always remains valid. > > > > Thanks, > > > > Dmitry > > > >Received on Tue Mar 14 07:17:17 2006
This archive was generated by hypermail 2.1.8 : Tue Mar 14 2006 - 07:17:20 PST