Secuencias

A veces es eficiente definir la secuencia separadamente

sequence s1;

  ##1 b [*0:$] ##1 b;

endsequence

sequence s2;

     $fell(b) ##1 !b ##1 b;

endsequence

De esta forma podemos definir fácilmente las aserciones utilizando las secuencias que han sido previamente definidas

Ejemplos :

assert propperty (@(negedge clk) s1 |-> ##2 s2)

assert propperty (@(negedge clk) a==0 |=> s1 or s2)

assert propperty (@(negedge clk) s1 ##1 s2 |-> a==5)

assert propperty (@(negedge clk) s1 and s2 |=> b==1 ##1 b==0)

Utilizacion de variables internas

La otra gran ventaja de las secuencias es que pueden tener variables locales

sequence s1;

  int cnt;

  (a==1, cnt=b) ##1 !a [*0:$] ##1 (a && b==cnt+1);

endsequence

la secuencia corresponde : si “a” es 1, guarde el valor de b en cnt, luego espere hasta que “a” suba de nuevo y compruebe que “b” es igual a cnt+1;

Reglas

Siempre necesitamos una condición para hacer una asignación a una variable local, en caso de que no haya condición podemos utilizar condición trivial “1”

Puede hacerse varias asignaciones:

    (1, cnt=b, cnt2=c)

Incluso puede tener llamadas de función y $display – útil para la depuración 

##1 (a==1, $display(cnt))

Ejemplo

Supongamos que queremos definir unas aserciones para un contador up-down

En este ejemplo observamos dos secuencias definidas, una de las cuales utilizaremos para comprobar los incrementos (s1) y la otra para comprobar los decrementos (s2). Posteriormente esas secuencias son utilizadas en la aserción concurrente prueba1 y en la aserción concurrente prueba2 . Conviene sin embargo detenerse en algunos detalles que vamos a enumerar:

  • Las secuencias están llamadas después de una implicación que determine cuando esas secuencias deben de ser ciertas.
  • La aserciónes que las utilizan deben de ser convenientemente inhabilitadas cuando el reset es desconocido o es activo
  • La sintaxis de expresiones que implican esas variables locales debe de ser muy estricta. Por ejemplo colocar (salida==aux+1) en lugar de (salida==aux+1’b1) hace que la aserción falle porque al incrementar aux con un literal de tipo integer, automáticamente la parte derecha de la expresión de comparación se hace de 32 bits, con lo cual nunca será igual a la parte izquierda
  • Se han colocado comprobaciones equivalentes mediante el uso de la función predefinida $past en las aserciones denominadas prueba2 (hace la misma función que prueba1) y prueba4 (hace la misma función que prueba3)

Laboratorio Virtual

Enlace al laboratorio Virtual