RE: [sv-ac] immediate assertions in always_comb

From: Bustan, Doron <doron.bustan_at_.....>
Date: Tue Sep 11 2007 - 03:43:18 PDT
Hi Jonathan,

I think you understand me correctly, it is only the 
LRM language interpretation that is different.

The LRM says

"9.2.2.2.1 Implicit always_comb sensitivities

The implicit sensitivity list of an always_comb includes the expansions
of the longest static prefix of each variable or select expression that
is read within the block or within any function called within the block
with
the following exceptions:

a) Any expansion of a variable declared within the block or within any
function called within the block

b) Any expression that is also written within the block or within any
function called within the block.

For the definition of the longest static prefix, see 11.5.3. 

Hierarchical function calls and function calls from packages are
analyzed as normal functions. References to class objects and method
calls of class objects do not add anything to the sensitivity list of an
always_comb."

I am not sure what "variable or select expression that is read" means.
My interpretation was everything on the right hand side of an
assignment.
I guess that your interpretation is as good as mine (maybe better.)

I see that Manisha agrees with you so, I will let it go.

Thanks

Doron

-----Original Message-----
From: Jonathan Bromley [mailto:jonathan.bromley@doulos.com] 
Sent: Tuesday, September 11, 2007 1:21 PM
To: Bustan, Doron; sv-ac@server.eda-stds.org
Subject: RE: [sv-ac] immediate assertions in always_comb

Doron,

> begin
>   a = b; 
>   assert (a ==c)
> end
>  
> is similar  to
>  
> always @(b) 
> begin
>   a = b;
>   assert (a == c)
> end
>
> [...] It would have been more intuitive if c was
> added to the sensitivity list as well.


I'm not quite sure why you omitted 'c' from 
the second block's event control.  Surely
always_comb constructs its "sensitivity list"
from *every* net and variable that participates 
in an expression (with some exceptions, as listed
in 9.2.2.2.1); and "a==c" in your assert is 
just an expression?  And we can reliably assume
that the value of 'a' cannot change except by 
execution of the always_comb, since it is forbidden
to write to a variable from anywhere else if it
is written from within an always_comb.

There is another issue: always_comb processes
execute once from top to bottom at time zero,
which the alternative form would not necessarily
do.  To mimic always_comb in that respect, it's
necessary to put the @(b,c) just before the "end":

  always begin
    a = b;
    assert (a==c);
    @(b,c);
  end

Please excuse me if I've missed your point.
--
Jonathan Bromley, Consultant

DOULOS - Developing Design Know-how
VHDL * Verilog * SystemC * e * Perl * Tcl/Tk * Project Services

Doulos Ltd. Church Hatch, 22 Market Place, Ringwood, Hampshire, BH24
1AW, UK
Tel: +44 (0)1425 471223                   Email:
jonathan.bromley@doulos.com
Fax: +44 (0)1425 471573                           Web:
http://www.doulos.com

The contents of this message may contain personal views which
are not the views of Doulos Ltd., unless specifically stated.
---------------------------------------------------------------------
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, and is
believed to be clean.
Received on Tue Sep 11 03:44:23 2007

This archive was generated by hypermail 2.1.8 : Tue Sep 11 2007 - 03:44:31 PDT