This proposal corrects an incomplete fix for item 1381 regarding when an evaluation attempt takes place under inferred enabling condition from an always block.

 

P1800-2008-draft1, 17.13.5, p. 289  (IEEE Std 1800™-2005)

Replace

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. A concurrent assertion embedded in procedural code specifies that a new evaluation attempt of the underlying property_spec begins at every occurrence of the inferred clocking event.

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

 

Similarly, the enabling condition is also inferred from case statements.

 

property r4;

      @(posedge mclk)(q != d);

endproperty

always @(posedge mclk) begin

      case (a)

            1: begin q <= d1;

                  r4_p: assert property (r4);

            end

            default: q1 <= d1;

      endcase

end

 

The above example is equivalent to the following:

 

property r4;

      @(posedge mclk)(a==1) |-> (q != d);

endproperty

r4_p: assert property (r4);

always @(posedge mclk) begin

      case (a)

            1: begin q <= d1;

            end

            default: q1 <= d1;

      endcase

end

With

Another inference made from the context is the enabling condition for a verification statement. Such derivation takes place when a verification statement is placed in an if..else block or a case block. The enabling condition assumed from the context is used to modify the property_expr of the verification statement as follows:

 

- If the verification statement is assume property or assert property then the enabling condition is used as the antecedent of an overlapping implication of which the consequent is the property_expr stated in the verification statement.

 

- If the verification statement is cover property then the enabling condition is used as the antecedent of a negated overlapping implication of which the consequent is the negated property_expr stated in the verification statement. The double negation used in the property expression represents the dual property to the overlapping implication and it is often called "followed by".

 

The resulting new property_expr then replaces the original property_expr in the verification statement. A concurrent assertion embedded in procedural code in an if...else block or a case block specifies that a new evaluation attempt of the underlying property_spec begins at every occurrence of the (inferred) clocking event.

 

For example,

 

property r3;

      @(posedge mclk)((q != d) ##1 ack);

endproperty

always @(posedge mclk) begin

      if (a) begin

            q <= d1;

            r3_p: assert property (r3);

            r3_c: cover property (r3);

      end

end

 

The above example is equivalent to the following:

 

property r3_assert;

      @(posedge mclk)a |-> ((q != d) ##1 ack);

endproperty

property r3_cover;

      @(posedge mclk) not (a |-> not ((q != d) ##1 ack));

endproperty

r3_p: assert property (r3_assert);

r3_c: cover property (r3_cover);

always @(posedge mclk) begin

      if (a) begin

            q <= d1;

      end

end

 

Similarly, the enabling condition is also inferred from case statements.

 

property r4;

      @(posedge mclk)((q != d) ##1 ack);

endproperty

always @(posedge mclk) begin

      case (a)

            1: begin q <= d1;

                  r4_p: assert property (r4);

                  r4_c: cover property (r4);

            end

            default: q1 <= d1;

      endcase

end

 

The above example is equivalent to the following:

 

property r4_assert;

      @(posedge mclk)(a==1) |-> ((q != d) ##1 ack);

endproperty

property r4_cover;

      @(posedge mclk) not((a==1) |-> not ((q != d) ##1 ack));

endproperty

r4_p: assert property (r4_assert);

r4_c: cover property (r4_cover);

always @(posedge mclk) begin

      case (a)

            1: begin q <= d1;

            end

            default: q1 <= d1;

      endcase

end