Re: [sv-ac] SVA: Clarification: Is result of .triggered a boolean or a sequence ?

From: ben cohen <hdlcohen_at_.....>
Date: Sun Oct 25 2009 - 15:01:40 PDT
John and all,
Thanks for the clarifications.  The original issue came about because there
was a question on the assertions below:
 sequence q_b;   @ (posedge clk) $rose(a) ##[1:$] b;   endsequence : q_b
 sequence q_bFM;   @ (posedge clk) first_match ($rose(a) ##[1:$] b);
endsequence : q_bFM
 *aP1*:  assert property (@ (posedge clk)  *first_match*(q_b.*triggered*)
|=> c);
 *aP1_FM*:  assert property (@ (posedge clk)  *first_match*(q_bFM.*triggered
*) |=> c);
 As John restated it, *q_b.triggered* has multiple matches, and aP1 has
multiple evaluation attempts of a static concurrent
assertion.  The *first_match* does NOT reduce those multiple evaluations,
and is unlike the first_match(some_sequence)..  That was the issue.
 However, q_bFM has a single match, and thus one evaluation.  Again the
first_match  does nothing to reduce the evaluations, but there is only one
evaluation because there is only one match.
** While we're on the subject, I do have another question.
What is the difference between
*   always *@some_seq                           and
*   always *@some_seq.*triggerred*
I did some simulation and saw no difference.  In my view, the
*@some_seq * triggers
at the completion of the sequence, but that completion is an end point.  The
counter argument is that *@some_seq.**triggerred *is a pulse that lasts for
one time step,thus there are 2 edges.  However, the simulator disproves that
theory.   What I also saw in the simulation is that is a sequence with
multiple matches will cause multiple triggering of the always procedure
(regardless of the *@some_seq* or the *@some_seq.**triggerred). *
*Thus, can we say that those two are equivalent? *
As a guideline, I presume that there is no need for the .triggered in that
case.
Thanks to all,
Ben

.


On Sun, Oct 25, 2009 at 12:49 PM, Havlicek John-R8AAAU <r8aaau@freescale.com
> wrote:

>  Hi Ed:
>
> Hmm ... I agree with Doron.
>
> I think that first_match(b) is equivalent to b for any Boolean b.  Ben made
> this point.
>
> What Doron disagrees with, and I do too, is the statement that the
> antecedent of
>
>    b |=> p
>
> has multiple matches.  The antecedent b either matches once or does not
> match -- there is no opportunity for multiple matches here.
>
> Now, Ben did not exactly say that the antecedent has multiple matches -- he
> said that it has multiple threads.  I agree that multiple threads are
> associated with the antecedent, but this is just because
>
>    assert property (first_match(s.triggered) |=> p);
>
> results in multiple evaluation attempts of the underlying implication.  I
> find Ben's phrase "antecedent has multiple threads" confusing, because these
> multiple threads have nothing to do with the antecedent.  They are multiple
> evaluation attempts of a static concurrent assertion.
>
> J.H.
>
>  ------------------------------
>  *From:* owner-sv-ac@eda.org [mailto:owner-sv-ac@eda.org] *On Behalf Of *Eduard
> Cerny
>
> *Sent:* Sunday, October 25, 2009 8:53 AM
> *To:* Bustan, Doron; ben@systemverilog.us; sv-ac@server.eda.org; Lisa
> Piper; Seligman, Erik; Korchemny, Dmitry
>
> *Subject:* RE: [sv-ac] SVA: Clarification: Is result of .triggered a
> boolean or a sequence ?
>
>  Hi Doron,
>
>
>
> I think that Ben is right, you cannot distinguish multiple setting of the
> conceptual (and real) boolean by several threads/attempts.
>
>
>
> ed
>
>
>
>
>
> *From:* owner-sv-ac@eda.org [mailto:owner-sv-ac@eda.org] *On Behalf Of *Bustan,
> Doron
> *Sent:* Sunday, October 25, 2009 4:02 AM
> *To:* ben@systemverilog.us; sv-ac@server.eda.org; Lisa Piper; Seligman,
> Erik; Korchemny, Dmitry
> *Subject:* RE: [sv-ac] SVA: Clarification: Is result of .triggered a
> boolean or a sequence ?
>
>
>
> Hi Ben,
>
>
>
> I disagree. In your example every attempt has one thread (not sure thread
> is defined in the LRM), and all attempts fail.
>
> So, the multiple match of q_b, just means that there are multiple attempts
> where the triggering Boolean is true.
>
>
>
>
>
>
>
> Doron
>   ------------------------------
>
> *From:* owner-sv-ac@server.eda.org [mailto:owner-sv-ac@server.eda.org] *On
> Behalf Of *ben cohen
> *Sent:* Sunday, October 25, 2009 4:21 AM
> *To:* sv-ac@server.eda.org; Lisa Piper; Seligman, Erik; Korchemny, Dmitry
> *Subject:* [sv-ac] SVA: Clarification: Is result of .triggered a boolean
> or a sequence ?
>
>
>
> LRM: *16.9.11 Detecting and using end point of a sequence ...The end point
> of a sequence is reached whenever the ending clock tick of a match of the
> sequence is reached, regardless of the starting clock tick of the match. The
> reaching of the end point can be tested by using the method triggered.
>  .... When method triggered is evaluated in an expression, it tests whether
> its operand sequence has reached its end point at that particular point in
> time. The result of triggered does not depend upon the starting point of the
> match of its operand sequence.*
>
> [Ben] Thus, the .*triggered *produces just a boolean that identifies the
> end point of a sequence, regardless of when it started.  I read this as also
> stating that if a sequence has a range, it may have multiple threads, and
> each matching thread generates an individual end point.  Since the result of
> a *.triggered* is a boolean, and not as a sequence, I claim that the
> result of *first_match*(sequence_instance.*triggered*) is same
> as sequence_instance.*triggered.  *
>
> Here is the situation:
>
> * sequence *q_b*;   @ (posedge clk) $rose(*a) *##*[1:*$*] b;*
>    endsequence *: q_b
>
> P1:  *assert property* (
>
>      @ (*posedge *clk) * first_match(*q_b.*triggered*) |=> c);
>
> Assume that "a==1"  for ONLY ONE cycle, and false forever thereafter (i.e.,
> a has a single $rose. )
>
> Assume that "b==1" for  all cycles. // thus q_b has a successful attempt,
> and has multiple threads.
>
> Assume that "c==0" for all cycles. // property  fails for any of the
> threads.
>
>
>
> In this model, sequence q_b has multiple threads for the 1st successful
> attempt.  I claim that the antecedent* first_match(q_b.triggered)* has
> multiple threads, and not one thread*. * Thus, the *first_match* does
> nothing because each end point of q_b.*triggered *is a boolean expression,
> and *first_match* of a boolean is same as boolean.
>
> I tested this on one simulator, and it behaved that way.
>
> Ben cohen
>
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean.
>
> ---------------------------------------------------------------------
>
> Intel Israel (74) Limited
>
>
>
> This e-mail and any attachments may contain confidential material for
>
> the sole use of the intended recipient(s). Any review or distribution
>
> by others is strictly prohibited. If you are not the intended
>
> recipient, please contact the sender and delete all copies.
>
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean.
>
> --
> This message has been scanned for viruses and
> dangerous content by *MailScanner* <http://www.mailscanner.info/>, and is
> believed to be clean.
>

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
Received on Sun Oct 25 15:02:57 2009

This archive was generated by hypermail 2.1.8 : Sun Oct 25 2009 - 15:04:06 PDT