{"id":1456,"date":"2023-02-21T12:14:19","date_gmt":"2023-02-21T12:14:19","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=1456"},"modified":"2025-08-06T17:34:04","modified_gmt":"2025-08-06T17:34:04","slug":"secuencias","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=1456","title":{"rendered":"Secuencias"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A veces es eficiente definir la secuencia separadamente<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\"><strong>sequence<\/strong> <\/mark><strong>s1<\/strong>;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; ##1 b [*0:$] ##1 b;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\"><strong>endsequence<\/strong><\/mark><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">sequence <\/mark>s2<\/strong>;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp; $fell(b) ##1 !b ##1 b;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">endsequence<\/mark><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De esta forma podemos definir f\u00e1cilmente las aserciones utilizando las secuencias que han sido previamente definidas<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ejemplos :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">assert propperty<\/mark> (@(negedge clk) <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s1<\/mark><\/strong> |-&gt; ##2 <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s2<\/mark><\/strong>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">assert propperty <\/mark>(@(negedge clk) a==0 |=&gt; <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s1<\/mark><\/strong> or <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s2<\/mark><\/strong>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">assert propperty<\/mark> (@(negedge clk) <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s1<\/mark><\/strong> ##1 <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s2<\/mark><\/strong> |-&gt; a==5)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">assert propperty<\/mark> (@(negedge clk) <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s1<\/mark><\/strong> and <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">s2<\/mark><\/strong> |=&gt; b==1 ##1 b==0)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Utilizacion de variables internas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La otra gran ventaja de las secuencias es que pueden tener variables locales<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\"><strong>sequence<\/strong> <\/mark>s1;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; int cnt;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp; (a==1, cnt=b) ##1 !a [*0:$] ##1 (a &amp;&amp; b==cnt+1);<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">endsequence<\/mark><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">la secuencia corresponde : si \u201ca\u201d es 1, guarde el valor de b en cnt, luego espere hasta que \u201ca\u201d suba de nuevo y compruebe que \u201cb\u201d es igual a cnt+1;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reglas<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Siempre necesitamos una condici\u00f3n para hacer una asignaci\u00f3n a una variable local, en caso de que no haya condici\u00f3n podemos utilizar condici\u00f3n trivial \u00ab1\u00bb<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puede hacerse varias asignaciones:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp; (1, cnt=b, cnt2=c)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Incluso puede tener llamadas de funci\u00f3n y $display \u2013 \u00fatil para la depuraci\u00f3n&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> ##1 (a==1, $display(cnt))<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ejemplo<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Supongamos que queremos definir unas aserciones para un contador up-down<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule Contador  #(parameter n = 4)\n  (input clk, incr,areset_n, sreset_n,load,up_down ,\n   input &#x5B;n-1:0] dato, \n   output reg &#x5B;n-1:0] salida,\n   output TC );\n\/\/localparam width_counter=4;\n  wire  &#x5B;n-1:0] fin_cuenta= up_down?2**n-1:0;\n  assign TC=(salida==fin_cuenta)?1&#039;b1:1&#039;b0;\nalways @(posedge clk or negedge areset_n)\n  if (!areset_n)\n        salida&lt;=0;\n  else\n         if (sreset_n==1&#039;b0)\n    \t\tsalida&lt;=0;\n  \t else\n          if(load)\n            salida&lt;=dato;\n           else\n             if (incr)\n               if(up_down)\n\t\t          salida&lt;=salida+1;\n  \t        else\n                  salida&lt;=salida-1;\nsequence s1;\n  logic &#x5B;n-1:0]  aux;\n    (1, aux=salida)  ##1 (salida==aux+1&#039;b1);\nendsequence  \nsequence s2;\n  logic &#x5B;n-1:0]  aux;\n    (1, aux=salida)  ##1 (salida==aux-1&#039;b1);\nendsequence    \nprueba1:  assert property (@(posedge clk) disable iff (areset_n===1&#039;bx ||areset_n==1&#039;b0 ) load==1&#039;b0&amp;&amp;incr==1&#039;b1&amp;&amp;up_down==1&#039;b1&amp;&amp;sreset_n==1&#039;b1|-&gt;s1) else $error(&quot;el contador va mal&quot;);\nprueba2:  assert property (@(posedge clk) disable iff (areset_n!=1&#039;b1) load==1&#039;b0&amp;&amp;incr==1&#039;b1&amp;&amp;up_down==1&#039;b1&amp;&amp;sreset_n==1&#039;b1|=&gt;salida==$past(salida)+1&#039;b1) else $error(&quot;el contador va mal2&quot;);  \nprueba3:  assert property (@(posedge clk) disable iff (areset_n!=1&#039;b1) load==1&#039;b0&amp;&amp;incr==1&#039;b1&amp;&amp;up_down==1&#039;b0&amp;&amp;sreset_n==1&#039;b1|-&gt;s2) else $error(&quot;el contador va mal3&quot;);\nprueba4:  assert property (@(posedge clk) disable iff (areset_n!=1&#039;b1) load==1&#039;b0&amp;&amp;incr==1&#039;b1&amp;&amp;up_down==1&#039;b0&amp;&amp;sreset_n==1&#039;b1|=&gt;salida==$past(salida)-1&#039;b1) else $error(&quot;el contador va mal4&quot;);  \n  \nendmodule\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">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\u00f3n concurrente prueba1 y en la aserci\u00f3n concurrente prueba2 . Conviene sin embargo detenerse en algunos detalles que vamos a enumerar:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Las secuencias est\u00e1n llamadas despu\u00e9s de una implicaci\u00f3n que determine cuando esas secuencias deben de ser ciertas.<\/li>\n\n\n\n<li>La aserci\u00f3nes que las utilizan deben de ser convenientemente inhabilitadas cuando el reset es desconocido o es activo<\/li>\n\n\n\n<li>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&#8217;b1) hace que la aserci\u00f3n falle porque al incrementar aux con un literal de tipo integer, autom\u00e1ticamente la parte derecha de la expresi\u00f3n de comparaci\u00f3n se hace de 32 bits, con lo cual nunca ser\u00e1 igual a la parte izquierda<\/li>\n\n\n\n<li>Se han colocado comprobaciones equivalentes mediante el uso de la funci\u00f3n predefinida $past en las aserciones denominadas prueba2 (hace la misma funci\u00f3n que prueba1) y prueba4 (hace la misma funci\u00f3n que prueba3)  <\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Laboratorio Virtual<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.edaplayground.com\/x\/cJha\" target=\"_blank\" rel=\"noreferrer noopener\">Enlace al laboratorio Virtual<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/cJha\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"295\" height=\"71\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2023\/09\/image-3.png\" alt=\"\" class=\"wp-image-1504\"\/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>A veces es eficiente definir la secuencia separadamente sequence s1; &nbsp; ##1 b [*0:$] ##1 b; endsequence sequence s2; &nbsp;&nbsp;&nbsp;&nbsp; $fell(b) ##1 !b ##1 b; endsequence De esta forma podemos definir f\u00e1cilmente las aserciones utilizando las secuencias que han sido previamente definidas Ejemplos : assert propperty (@(negedge clk) s1 |-&gt; ##2 s2) assert propperty (@(negedge clk) a==0 |=&gt; s1 or s2) assert propperty (@(negedge clk) s1 ##1 s2 |-&gt; a==5) assert propperty (@(negedge clk) s1 and s2 |=&gt; b==1 ##1 b==0) Utilizacion de variables internas La otra gran ventaja de las secuencias es que pueden tener variables locales sequence s1; &nbsp; int cnt; &nbsp; (a==1, cnt=b) ##1 !a [*0:$] ##1 (a &amp;&amp; b==cnt+1); endsequence la secuencia corresponde : si \u201ca\u201d es 1, guarde el valor de b en cnt, luego espere hasta que \u201ca\u201d suba de nuevo y compruebe que \u201cb\u201d es igual a cnt+1; Reglas Siempre necesitamos una condici\u00f3n para hacer una asignaci\u00f3n a una variable local, en caso de que no haya condici\u00f3n podemos utilizar condici\u00f3n trivial \u00ab1\u00bb Puede hacerse varias asignaciones: &nbsp;&nbsp;&nbsp; (1, cnt=b, cnt2=c) Incluso puede tener llamadas de funci\u00f3n y $display \u2013 \u00fatil para la depuraci\u00f3n&nbsp; ##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\u00f3n concurrente prueba1 y en la aserci\u00f3n concurrente prueba2 . Conviene sin embargo detenerse en algunos detalles que vamos a enumerar: Laboratorio Virtual Enlace al laboratorio Virtual<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":"","footnotes":""},"class_list":["post-1456","page","type-page","status-publish","hentry"],"featured_image_src":null,"_links":{"self":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1456"}],"version-history":[{"count":18,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1456\/revisions"}],"predecessor-version":[{"id":1897,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1456\/revisions\/1897"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}