{"id":1706,"date":"2025-08-05T16:57:54","date_gmt":"2025-08-05T16:57:54","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=1706"},"modified":"2025-08-06T17:52:30","modified_gmt":"2025-08-06T17:52:30","slug":"1706-2","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=1706","title":{"rendered":"Concurrencia en Verilog"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Timing Control<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Delay control: zero delay<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando dos bloques<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>initial<\/code> compiten, el orden de ejecuci\u00f3n no est\u00e1 garantizado<sup><\/sup>. Esto puede llevar a m\u00faltiples funcionamientos posibles<sup><\/sup>.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule event_control;\nreg &#x5B;4:0] N;\ninitial begin\n$display (\u201cAAA\u201d);\n$display(\u201cBBB\u201d);\nend\n\ninitial\nfor (N=0; N&amp;gt;=3; N=N+1)\n$display (N);\nendmodule\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Funcionamientos Posibles:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AAA, BBB, 0, 1, 2, 3 <\/li>\n\n\n\n<li>0, 1, 2, 3, AAA, BBB <\/li>\n\n\n\n<li>Y cualquier intercalado entre ellos.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Usando un retardo de <code>#0<\/code>, se puede forzar a un bloque a ejecutarse despu\u00e9s de otros bloques que no tienen retardo en el mismo <em>timeslot<\/em> de simulaci\u00f3n. Esto asegura un funcionamiento determinista.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule event_control;\nreg &#x5B;4:0] N;\ninitial begin\n$display (\u201cAAA\u201d);\n$display(\u201cBBB\u201d);\nend\n\ninitial\n#0 for (N=0; N&amp;gt;=3; N=N+1)\n$display (N);\nendmodule\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Funcionamiento \u00danico:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AAA, BBB, 0, 1, 2, 3 <\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Delay control: intra-assignment<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Existe una diferencia clave entre un retardo aplicado a toda la asignaci\u00f3n y un retardo intra-asignaci\u00f3n<sup><\/sup>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Asignaci\u00f3n Retardada (delayed assignment):<\/strong> Se espera el tiempo de retardo y LUEGO se leen los valores del lado derecho (RHS) para hacer la asignaci\u00f3n.<\/li>\n<\/ul>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n\/\/ Espera 1 unidad de tiempo, luego asigna el valor actual de &#039;y&#039; a &#039;x&#039;.\n#1 x = y;\n\n\/\/ Equivalente a:\nbegin\n#1; \t\t\/\/ Delay.\nx = y; \t\/\/ Asigna &#039;y&#039; a &#039;x&#039;\nend\n<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Retardo Intra-asignaci\u00f3n (intra-assignment delay):<\/strong> Se leen los valores del lado derecho (RHS) inmediatamente, se espera el tiempo de retardo y LUEGO se actualiza el valor del lado izquierdo (LHS).<\/li>\n<\/ul>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n\/\/ Lee &#039;y&#039; ahora, espera 1 unidad de tiempo, y luego asigna el valor le\u00eddo a &#039;x&#039;.\nx = #1 y;\n\n\/\/ Equivalente a:\nbegin\nhold = y; \t\/\/ Muestra y guarda &#039;y&#039; inmediatamente.\n#1; \t\t\/\/ Delay.\nx = hold; \t\/\/ Asignaci\u00f3n a &#039;x&#039;.\nend\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Diferencias clave:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>#10 a = b + c;<\/code> -&gt; los valores de <code>b<\/code> y <code>c<\/code> se leen en el instante <code>(now + 10)<\/code>.<\/li>\n\n\n\n<li><code>a = #10 b + c;<\/code> -&gt; los valores de <code>b<\/code> y <code>c<\/code> se leen en el instante <code>(now)<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Asignaciones Blocking (<code>=<\/code>) y Non-Blocking (<code>&lt;=<\/code>)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Blocking (<code>=<\/code>)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Una asignaci\u00f3n \u00abblocking\u00bb o bloqueante detiene la ejecuci\u00f3n de las sentencias siguientes dentro de un bloque secuencial (<code>begin\/end<\/code>) hasta que la asignaci\u00f3n actual se completa.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nalways begin\nq = blahblah;\nr = q - someInput;\n\/\/ La ejecuci\u00f3n se para aqu\u00ed por 10 unidades de tiempo.\n\/\/ Otros procesos (always, assigns) contin\u00faan ejecut\u00e1ndose.\na = #10 q + r;\n\/\/ Esta l\u00ednea solo se ejecuta despu\u00e9s de que el retardo de 10 unidades ha pasado.\nt = a - someOtherInput;\n\u2026\nend\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando se usan en secuencia, el resultado de una asignaci\u00f3n est\u00e1 inmediatamente disponible para la siguiente<sup><\/sup>.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n\/\/ Blocking assignment:\na = 1;\nb = a; \/\/ b toma el nuevo valor de a (1)\nc = b; \/\/ c toma el nuevo valor de b (1)\n\n\/\/ Resultado: a = 1, b = 1, c = 1\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Non-Blocking (<code>&lt;=<\/code>)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Una asignaci\u00f3n \u00abnon-blocking\u00bb o no bloqueante permite planificar la actualizaci\u00f3n de un valor sin detener la ejecuci\u00f3n de las sentencias siguientes<sup><\/sup>.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Evaluaci\u00f3n:<\/strong> Todas las expresiones del lado derecho (RHS) de un bloque se eval\u00faan concurrentemente en el momento en que se ejecuta la sentencia.<\/li>\n\n\n\n<li><strong>Actualizaci\u00f3n:<\/strong> Las variables del lado izquierdo (LHS) se actualizan con los valores evaluados cuando todos los procesos est\u00e1n suspendidos.<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n\/\/ Nonblocking assignment:\na &lt;= 1;\nb &lt;= a; \/\/ b se planifica para tomar el valor antiguo (anterior) de a\nc &lt;= b; \/\/ c se planifica para tomar el valor antiguo (anterior) de b\n\n\/\/ Resultado: a se actualiza a 1, b obtiene el valor original de a, y c obtiene el valor original de b\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Regla General:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usa <strong>asignaciones blocking (<code>=<\/code>)<\/strong> para modelar l\u00f3gica combinacional.<\/li>\n\n\n\n<li>Usa <strong>asignaciones non-blocking (<code>&lt;=<\/code>)<\/strong> para modelar l\u00f3gica secuencial (como registros en un <code>always @(posedge clk)<\/code>).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esto evita las \u00abrace conditions\u00bb (condiciones de carrera), donde el resultado de la simulaci\u00f3n depende del orden en que el simulador ejecuta los bloques  <code>always<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Bloques Secuenciales y Paralelos<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Bloques Secuenciales (<code>begin<\/code>\/<code>end<\/code>)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Las sentencias se ejecutan en el orden en que aparecen<sup><\/sup>. Una sentencia no comienza hasta que la anterior ha terminado<sup><\/sup>.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\ninitial\nbegin\nx=1\u2019b0;       \/\/ t=0\n#5\ty=1\u2019b1;    \/\/ t=5\n#10\tz={x,y};  \/\/ t=15\n#20\tw={y,x};  \/\/ t=35\nend\n<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Bloques Paralelos (<code>fork<\/code>\/<code>join<\/code>)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Las sentencias dentro del bloque se ejecutan concurrentemente<sup><\/sup>. Los retardos son relativos al inicio del bloque<sup><\/sup>. El orden de las sentencias no afecta el resultado (si no hay dependencias)<sup><\/sup>.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\ninitial\nfork\nx=1\u2019b0;       \/\/ t=0\n#5\ty=1\u2019b1;    \/\/ t=5 (relativo al inicio)\n#10\tz={x,y};  \/\/ t=10 (relativo al inicio)\n#20\tw={y,x};  \/\/ t=20 (relativo al inicio)\njoin\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Bloques Nombrados y <code>disable<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los bloques pueden ser nombrados, lo que permite declarar variables locales y deshabilitarlos desde cualquier parte del c\u00f3digo<sup><\/sup><sup><\/sup><sup><\/sup><sup><\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sintaxis:<\/strong><\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nbegin: nombre_del_bloque\n\/\/ ...\nend\n\nfork: otro_nombre\n\/\/ ...\njoin\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La palabra clave <code>disable<\/code> act\u00faa como un <code>break<\/code> en C, pero puede terminar la ejecuci\u00f3n de cualquier bloque nombrado, sin importar cu\u00e1n anidado est\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejemplo: Encontrar el primer bit en <code>1<\/code>.<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule find_true_bit; \nreg &#x5B;15:0] flag; \ninteger i; \ninitial \nbegin \n    flag = 16&#039;b0010_0000_0000_0000; \n    i = 0; \n    begin: block1 while(i &lt; 16) \n              begin \n                 if (flag&#x5B;i]) \n                   begin \n                     $display(&quot;Encontrado un bit en TRUE en el elemento %d&quot;, i); \n                     disable block1; \/\/ Termina el bloque &#039;block1&#039; \n                    end \n                 i = i + 1; \n               end \n    end \nend \nendmodule \n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Timing Control Delay control: zero delay Cuando dos bloques initial compiten, el orden de ejecuci\u00f3n no est\u00e1 garantizado. Esto puede llevar a m\u00faltiples funcionamientos posibles. Funcionamientos Posibles: Usando un retardo de #0, se puede forzar a un bloque a ejecutarse despu\u00e9s de otros bloques que no tienen retardo en el mismo timeslot de simulaci\u00f3n. Esto asegura un funcionamiento determinista. Funcionamiento \u00danico: Delay control: intra-assignment Existe una diferencia clave entre un retardo aplicado a toda la asignaci\u00f3n y un retardo intra-asignaci\u00f3n. Diferencias clave: Asignaciones Blocking (=) y Non-Blocking (&lt;=) Blocking (=) Una asignaci\u00f3n \u00abblocking\u00bb o bloqueante detiene la ejecuci\u00f3n de las sentencias siguientes dentro de un bloque secuencial (begin\/end) hasta que la asignaci\u00f3n actual se completa. Cuando se usan en secuencia, el resultado de una asignaci\u00f3n est\u00e1 inmediatamente disponible para la siguiente. Non-Blocking (&lt;=) Una asignaci\u00f3n \u00abnon-blocking\u00bb o no bloqueante permite planificar la actualizaci\u00f3n de un valor sin detener la ejecuci\u00f3n de las sentencias siguientes. Regla General: Esto evita las \u00abrace conditions\u00bb (condiciones de carrera), donde el resultado de la simulaci\u00f3n depende del orden en que el simulador ejecuta los bloques always. Bloques Secuenciales y Paralelos Bloques Secuenciales (begin\/end) Las sentencias se ejecutan en el orden en que aparecen. Una sentencia no comienza hasta que la anterior ha terminado. Bloques Paralelos (fork\/join) Las sentencias dentro del bloque se ejecutan concurrentemente. Los retardos son relativos al inicio del bloque. El orden de las sentencias no afecta el resultado (si no hay dependencias). Bloques Nombrados y disable Los bloques pueden ser nombrados, lo que permite declarar variables locales y deshabilitarlos desde cualquier parte del c\u00f3digo. Sintaxis: La palabra clave disable act\u00faa como un break en C, pero puede terminar la ejecuci\u00f3n de cualquier bloque nombrado, sin importar cu\u00e1n anidado est\u00e9. Ejemplo: Encontrar el primer bit en 1.<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","ub_ctt_via":"","footnotes":""},"class_list":["post-1706","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\/1706","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=1706"}],"version-history":[{"count":51,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1706\/revisions"}],"predecessor-version":[{"id":1909,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1706\/revisions\/1909"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}