Re: [sv-ac] blocking assignments

From: Doron Bustan <dbustan_at_.....>
Date: Wed Nov 08 2006 - 13:37:23 PST
Hi Matt,

please give more detailes

what happen at timestep 0?  At timestep 1?  At the rest of the timesteps 
(if any)

Are there more than one evaluation in a single time step?

BTW doesn't the clk flip between x and z ?

thanks

Doron

Maidment, Matthew R wrote:

>Here's a more interesting example.
>
>module bar();
>
>bit clk;
>bit m,n,o;
>bit ff1,ff2;
>bit i_ff1,i_ff2;
>always_comb begin
>  assert(m==ff1);
>  case({m,ff1})
>   2'b00: o = 1'b0;
>   2'b11: o = 1'b1;
>  endcase
>  $display("%t m:%b ff1:%b",$time,m,ff1);
>end
>
>bit tmp;
>always_comb
> tmp = 1;
>always_comb
>  n = ff2;
>always_comb
>  m = n && tmp;
>always_ff@(posedge clk)
>  ff1 <= i_ff1;
>always_ff@(posedge clk)
>  ff2 <= i_ff2;
>
>initial
> forever begin
>   #1;
>   clk = ~clk;
> end
>initial begin
>@(clk) begin
>  i_ff1 <=1;
>  i_ff2 <=1;
>end
>#1000;
>$finish;
>end
>endmodule
>
>This assertion fires on 2 simulators that I tried.
>The order of evaluation is:
>
>{m,ff1} == 01 //Fire
>{m,ff1} == 11 //Does not fire
>
>This assertion is an explicit form of the implicit unique case 
>check.  I believe unique and priority checks should also be 
>addressed by your work.
>
>
>Matt
>--
>Matt Maidment
>mmaidmen@ichips.intel.com
>  
>
>  
>
>>-----Original Message-----
>>From: owner-sv-ac@server.eda.org 
>>[mailto:owner-sv-ac@server.eda.org] On Behalf Of Doron Bustan
>>Sent: Wednesday, November 08, 2006 11:20 AM
>>Cc: sv-ac@server.eda.org
>>Subject: Re: [sv-ac] blocking assignments
>>
>>Hi Dmitry,
>>
>>I guess that illustrates the problem, but it does not
>>make sens, does it?
>>
>>we need a reasonable example that is deterministic,
>>and in which the assertion is being evaluated at least
>>twice without leaving the active region.
>>
>>Doron
>>
>>Korchemny, Dmitry wrote:
>>
>>    
>>
>>>Hi Doron,
>>>
>>>You are right. @(posedge clk) is a typo, should be @(*) (or 
>>>      
>>>
>>@(b), but it
>>    
>>
>>>is not synthesizable).
>>>
>>>always @* begin
>>>               if (cond) begin
>>>                    a = b;
>>>                    assert (a == c) ;
>>>                    b = c;
>>>              end
>>>end
>>>
>>>Is it correct now?
>>>
>>>I'll try to get a real life example in addition to this 
>>>      
>>>
>>artificial one.
>>    
>>
>>>I think, we should define simulation semantics that would be 
>>>      
>>>
>>consistent
>>    
>>
>>>with FV in the synthesizable case. Two candidates are
>>>-  taking the latest signal value from the active region before the
>>>first entry to the observed region, and
>>>- "sampling" the signal values at the first entry to the observed
>>>region. As for non-synthesizable or "difficult" for synthesis example,
>>>it is important only that the algorithm is well defined: for "exotic"
>>>cases it is difficult to invent something better than immediate
>>>assertions.
>>>
>>>Thanks,
>>>Dmitry
>>>
>>>-----Original Message-----
>>>From: owner-sv-ac@server.eda.org 
>>>      
>>>
>>[mailto:owner-sv-ac@server.eda.org] On
>>    
>>
>>>Behalf Of Doron Bustan
>>>Sent: Wednesday, November 08, 2006 12:26 AM
>>>To: sv-ac@server.eda.org
>>>Subject: [sv-ac] blocking assignments
>>>
>>>Just to make sure that I don't miss something important...
>>>
>>>In the example:
>>>
>>>always @(posedge clk) begin
>>>               if (cond) begin
>>>                    a = b;
>>>                    assert (a == c) ;
>>>                    b = c;
>>>              end
>>>end
>>>
>>>the assertion is being evaluated at most once in every "clk" cycle.
>>>
>>>
>>>I think that we need more than one always block to cause the assertion
>>>to
>>>execute more than once, something like:
>>>
>>>always @(b) begin
>>>              if (cond) begin
>>>                    a = b;
>>>                    assert (a == c) ;
>>>              end
>>>end
>>>
>>>always @(c) begin
>>>           b = c;
>>>end
>>>
>>>this will cause the assert to possibly fire twice at the same 
>>>      
>>>
>>time step 
>>    
>>
>>>without
>>>exiting the active region. We should also consider the following case:
>>>
>>>
>>>always @(b) begin
>>>              if (cond) begin
>>>                    a = b;
>>>                    assert (a == c) ;
>>>              end
>>>end
>>>
>>>always @(c) begin
>>>           b <= c;
>>>end
>>>
>>>Here the assert is being triggered twice, but the simulator 
>>>      
>>>
>>goes to the
>>    
>>
>>>NBA
>>>region between the two triggers.
>>>
>>>
>>>is this right?
>>>
>>>Doron
>>> 
>>>
>>>      
>>>
Received on Wed Nov 8 13:37:31 2006

This archive was generated by hypermail 2.1.8 : Wed Nov 08 2006 - 13:37:37 PST