RE: [sv-ac] blocking assignments

From: Maidment, Matthew R <matthew.r.maidment_at_.....>
Date: Wed Nov 08 2006 - 13:03:29 PST
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:04:18 2006

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