{"id":1640,"date":"2025-08-06T18:49:53","date_gmt":"2025-08-06T18:49:53","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?p=1640"},"modified":"2025-08-11T10:51:33","modified_gmt":"2025-08-11T10:51:33","slug":"sesion-1-microelectronica-avanzada","status":"publish","type":"post","link":"https:\/\/dsd.webs.upv.es\/?p=1640","title":{"rendered":"Sesion 1 microelectr\u00f3nica avanzada: Descripci\u00f3n"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instrucciones iniciales<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Haremos las sesiones de este seminario en el aula de microelectr\u00f3nica (situado en la primera planta del edificio 4D de la ETSIT)<\/li>\n\n\n\n<li>Necesito que vay\u00e1is equipados con vuestro port\u00e1til y que teng\u00e1is instalado dos programas que ten\u00e9is en recursos de poliformat. Son Questasim (que es posible que algunos de vosotros ya teng\u00e1is instalado) y un asistente de systemverilog denominado SystemVerilog-VHDL assistant. Afortunadamente, no son programas muy pesados y para poder ejecutarlos necesitar\u00e9is estar en la VPN de la universidad (si est\u00e1is fuera de la universidad) o conectados a trav\u00e9s de UPVNET. Es necesario que a\u00f1ad\u00e1is una variable de entorno a vuestro windows que encontrar\u00e9is disponible bajo la carpeta de questasim de recursos del poliformat del curso de formaci\u00f3n Aula de Microelectr\u00f3nica.<\/li>\n\n\n\n<li>Para terminar, nuestro canal de comunicaci\u00f3n con vosotros ser\u00e1 a partir de ahora ser\u00e1 la p\u00e1gina web <a href=\"https:\/\/dsd.webs.upv.es\/\">https:\/\/dsd.webs.upv.es\/<\/a> En dicha web est\u00e1 gravados en video los pasos que vamos a hacer en este seminario y que intentaremos ejecutar en directo. Es muy importante que veng\u00e1is equipados con auriculares!!<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Dise\u00f1o a verificar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a verificar una FIFO s\u00edncrona. El c\u00f3digo ASM es el que se adjunta en la siguiente figura<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"778\" height=\"1024\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1-778x1024.png\" alt=\"\" class=\"wp-image-1617\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1-778x1024.png 778w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1-228x300.png 228w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1-768x1010.png 768w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1-1168x1536.png 1168w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1-1140x1500.png 1140w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-1.png 1281w\" sizes=\"auto, (max-width: 778px) 100vw, 778px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Os adjunto informaci\u00f3n de c\u00f3mo deber\u00edan denominarse los puertos y de entrada y salida. Es muy importante respetar este tipo de nombres sobre todo si se quiere reusar un banco de pruebas previo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"969\" height=\"821\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-2.png\" alt=\"\" class=\"wp-image-1628\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-2.png 969w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-2-300x254.png 300w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/04\/image-2-768x651.png 768w\" sizes=\"auto, (max-width: 969px) 100vw, 969px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Comportamiento<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El comportamiento es el mostrado en el siguiente cronograma<\/p>\n\n\n<style>\n       .errordiv { padding:10px; margin:10px; border: 1px solid #555555;color: #000000;background-color: #f8f8f8; width:500px; }#advanced_iframe {visibility:visible;opacity:1;vertical-align:top;}.ai-info-bottom-iframe { position: fixed; z-index: 10000; bottom:0; left: 0; margin: 0px; text-align: center; width: 100%; background-color: #ff9999; padding-left: 5px;padding-bottom: 5px; border-top: 1px solid #aaa } a.ai-bold {font-weight: bold;}#ai-layer-div-advanced_iframe p {height:100%;margin:0;padding:0}<\/style><script type=\"text\/javascript\">var ai_iframe_width_advanced_iframe = 0;var ai_iframe_height_advanced_iframe = 0;function aiReceiveMessageadvanced_iframe(event) {  aiProcessMessage(event,\"advanced_iframe\", \"true\",\"\",\"false\",\"false\");}if (window.addEventListener) {  window.addEventListener(\"message\", aiReceiveMessageadvanced_iframe);} else if (el.attachEvent)  {  el.attachEvent(\"message\", aiReceiveMessageadvanced_iframe);}var aiOnloadScrollTop=\"true\";var aiShowDebug=false;\n\t\tif (typeof aiReadyCallbacks === 'undefined') {\n\t\t\tvar aiReadyCallbacks = [];\n\t\t} else if (!(aiReadyCallbacks instanceof Array)) {\n\t\t\tvar aiReadyCallbacks = [];\n\t\t}    function aiShowIframeId(id_iframe) { jQuery(\"#\"+id_iframe).css(\"visibility\", \"visible\");    }    function aiResizeIframeHeight(height) { aiResizeIframeHeight(height,advanced_iframe); }    function aiResizeIframeHeightId(height,width,id) {aiResizeIframeHeightById(id,height);}<\/script><iframe id=\"advanced_iframe\"  name=\"advanced_iframe\"  src=\"https:\/\/drom.io\/vcd\/?github=ralfgad\/simulaciones_vcd\/main\/FIFO_TB_good2.vcd\"  width=\"100%\"  height=\"350\"  frameborder=\"0\"  border=\"0\"  allowtransparency=\"true\"  loading=\"lazy\"  style=\";border-width: 0px;;border: none;;width:100%;;height:350px;\" ><\/iframe><script type=\"text\/javascript\">var ifrm_advanced_iframe = document.getElementById(\"advanced_iframe\");var hiddenTabsDoneadvanced_iframe = false;\nfunction resizeCallbackadvanced_iframe() {}<\/script><script type=\"text\/javascript\"><\/script><p style=\"display:block !important; visibility:visible !important;margin: -18px 14px 0 0;padding-left: 3px;padding-top:3px;background: white; overflow: hidden; position: relative; line-height:15px;width: fit-content;\"><small style=\"display:block !important;visibility:visible !important\">powered by Advanced iFrame<\/small><\/p>\n\n\n<h2 class=\"wp-block-heading\">Punto de partida<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En esta sesi\u00f3n nos vamos a conformar en la realizaci\u00f3n del dise\u00f1o y del proyecto del banco de pruebas  con  systemverilog.  Aunque incluimos la forma de acometer el dise\u00f1o en el siguiente subapartado, es bueno disponer de un dise\u00f1o de pruebas que os vamos a proporcionar<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dise\u00f1o<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para la realizaci\u00f3n del dise\u00f1o seguid las pautas del siguiente video en el cual el algoritmo realizado es un radicador. Con este procedimiento agilizaremos el dise\u00f1o aunque no se vislumbre claramente los elementos del control-path y del data-path; pero tambi\u00e9n es importante que sep\u00e1is hacer ese traslado directo de ASM a systemVerilog.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"ASM con un solo fichero |  | UPV\" width=\"960\" height=\"540\" src=\"https:\/\/www.youtube.com\/embed\/vfAn2e7o-Xc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como alternativa, y para agilizar el tr\u00e1nsito hacia la verificaci\u00f3n y poder avanzar, se os proporciona un c\u00f3digo no sintetizable que nos sirva como DUV de nuestro banco de verificaci\u00f3n UVM. De paso nos podr\u00e1 servir como modelo de alto nivel que explique el comportamiento de la FIFO deseada utilizando un tipo de dato<strong> queue<\/strong> de SV.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule FIFO_no_sintetizable\n  (\tinput \tCLOCK,  RESET_N, CLEAR_N,\n   input &#x5B;7:0] DATA_IN,\n   input READ,WRITE,\n   output &#x5B;7:0] DATA_OUT,\n   output  &#x5B;4:0] USE_DW,\n   output  F_EMPTY_N,F_FULL_N);\n  \n  \nlogic &#x5B;7:0] cola &#x5B;$:32] ;\n logic &#x5B;7:0] DATA_OUT_LOGIC;\n   logic  &#x5B;4:0] USE_DW_LOGIC;\n   logic  F_EMPTY_N_LOGIC,F_FULL_N_LOGIC;\nassign DATA_OUT=DATA_OUT_LOGIC;\nassign USE_DW=USE_DW_LOGIC;\nassign F_EMPTY_N=F_EMPTY_N_LOGIC;\nassign F_FULL_N=F_FULL_N_LOGIC;\n  \nalways_ff @(negedge RESET_N, posedge CLOCK)\nif (!RESET_N)\nbegin\n  cola.delete(); \n  DATA_OUT_LOGIC=0;\n  USE_DW_LOGIC=0;\n  F_FULL_N_LOGIC=1;\n  F_EMPTY_N_LOGIC=0;\nend\nelse\nif (!CLEAR_N)\nbegin\n  cola.delete();\n  DATA_OUT_LOGIC=0;\n  USE_DW_LOGIC=0;\n  F_FULL_N_LOGIC=1;\n  F_EMPTY_N_LOGIC=0;\nend\nelse\n  begin\n    case ({READ,WRITE})\n      2&#039;b01: cola.push_front(DATA_IN);\n      2&#039;b10: DATA_OUT_LOGIC=cola.pop_back(); \n      2&#039;b11: begin \n              cola.push_front(DATA_IN);              \n              DATA_OUT_LOGIC=cola.pop_back(); \n            end\n    endcase\n    USE_DW_LOGIC=cola.size();\n    F_FULL_N_LOGIC=!(cola.size()==32);\n    F_EMPTY_N_LOGIC=!(cola.size()==0); \n  end\n     \n \nproperty  llenado ;\n    (@(posedge CLOCK) not (WRITE==1&#039;b1 &amp;amp;&amp;amp; F_FULL_N==1&#039;b0 &amp;amp;&amp;amp;READ==1&#039;b0));\nendproperty\nsobrellenado:assert property (llenado)  else $error(&quot;estas escribiendo sobre una fifo llena&quot;);\nproperty  vaciado ;\n  (@(posedge CLOCK) not (READ==1&#039;b1 &amp;amp;&amp;amp; F_EMPTY_N==1&#039;b0&amp;amp;&amp;amp; WRITE==1&#039;b0)) ;\nendproperty\nsobrevaciado:assert property  (vaciado) else $error(&quot;estas leyendo de una fifo vacia&quot;);\n  \nendmodule\n<\/pre><\/div>\n\n<div style=\"background-color: #f8f8f8; border-width: 2px; border-color: #ECECEC; \" class=\"ub_call_to_action wp-block-ub-call-to-action-block\" id=\"ub_call_to_action_d7d5de1f-3731-4b00-b954-495334039a7c\">\n\t\t\t<div class=\"ub_call_to_action_headline\">\n\t\t\t\t<p class=\"ub_call_to_action_headline_text\" style=\"font-size: 30px; text-align: center; \">veamos<\/p>\n\t\t\t<\/div>\n\t\t\t<div class=\"ub_call_to_action_content\">\n\t\t\t\t<p class=\"ub_cta_content_text\" style=\"font-size: 15px; text-align: center; \"><\/p>\n\t\t\t<\/div>\n\t\t\t<div class=\"ub_call_to_action_button\">\n\t\t\t\t<a href=\"\" target=\"_self\" rel=\"noopener noreferrer\" class=\"ub_cta_button\" style=\"background-color: #E27330; width: 250px; \">\n\t\t\t\t\t<p class=\"ub_cta_button_text\" style=\"font-size: 14px; \">Atenci\u00f3n<\/p>\n\t\t\t\t<\/a>\n\t\t\t<\/div>\n\t\t<\/div>\n\n\n<h2 class=\"wp-block-heading\">Verificaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Este va a ser nuestro gran objetivo de la tarea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ya para empezar a realizar el banco de pruebas, proponemos un punto de partida totalmente cl\u00e1sico mediante un modulo que contiene un <strong><em>initial <\/em><\/strong>en donde se sucenden unos casos de test que est\u00e1n implementados mediante unos <strong><em>task <\/em><\/strong>(un buen representante de este vivel superior podr\u00eda ser el <strong><em>task <\/em><\/strong>denominado<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"> <strong>test_B<\/strong><\/mark>, que a su vez anidan en su interior unos tasks de nivel intermedio (como por ejemplo <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"><strong>llenar_simple<\/strong><\/mark>), que asu vez contienne en su interior tasks de operaciones b\u00e1sicas de escritura y lectura de la FIFO (<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">solo_escritura y solo_lectura<\/mark><\/strong> ser\u00edan ejemplos de este nivel de <strong><em>task <\/em><\/strong>).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n\/\/ Code`timescale 1 ns\/ 1 ps\n\nmodule FIFO_tb_v0();\n\nparameter DEPTH=32, WIDTH=8;\nlocalparam ADDRESS=$clog2(DEPTH-1);\n \nlogic  clock, reset, rden,wren,clear;\nlogic  &#x5B;WIDTH-1:0] data_in;\nlogic  &#x5B;ADDRESS-1:0] use_dw;\n\n\n\nlogic &#x5B;4:0] rdaddress;\n\nlogic &#x5B;4:0] wraddress;\n\nlogic full,empty;                                              \nlogic &#x5B;WIDTH-1:0]  data_out;\n\n\n\n\/\/Modelo de la FIFO\n\nlogic &#x5B;7:0] FIFO_ideal &#x5B;$]; \/\/Definida con una cola\nmailbox FIFO_ideal_mbox = new(); \/\/definida con un mailbox\n\n\/\/ Instancia del DUV\nFIFO_no_sintetizable DUV (.CLOCK(clock),\n               .RESET_N(reset),\n               .DATA_IN(data_in),\n               .READ(rden),\n               .WRITE(wren),\n               .CLEAR_N(1&#039;b1),\n               .F_FULL_N(full),\n               .F_EMPTY_N(empty),\n\t\t\t   .USE_DW(use_dw),\n               .DATA_OUT(data_out));\n\n\n\n\n\n\/\/ Casos de Test\t  \ninitial\nbegin\n$info(&quot;INICIO VALIDACION&quot;);\ninicializacion();\n\n$info(&quot;*** TEST 1: Escritura simple&quot;);\ntest_A();\n$info(&quot;*** FIN TEST 1 ****&quot;);\n\n\n\n$info   (&quot;*** TEST 2: LLenado simple de la FIFO&quot;);\nresetON();\nllenar_simple();\n$info(&quot;*** FIN TEST 2 ****&quot;);\n\n\n$info(&quot;*** TEST 3: Escritura y lectura simultanea con FIFO vacia&quot;);\nresetON();\nlectura_escritura(10,10);\n$info(&quot;*** FIN TEST 3 ****&quot;);\n\n$info(&quot;*** TEST 3: Escritura y lectura simultanea con FIFO llena&quot;);\nresetON();\ntest_B();\n$info(&quot;*** FIN TEST 3 ****&quot;);\n\n$info(&quot;*** TEST 4: Llenado y vaciado de la FIFO&quot;);\nresetON();\ntest_C();\n$info(&quot;*** FIN TEST 4 ****&quot;);\n\n$info(&quot;*** TEST 5: Escritura y lectura aleatoria con FIFO vacia, llena y a mitad.&quot;);\nresetON();\ntest_D();\n$info(&quot;*** FIN TEST 5 ****&quot;);\n\n\nrepeat(5) @(posedge clock);\n$info(&quot;FIN VALIDACION&quot;);\n$stop;\nend\n\n\ninitial begin\n  $dumpfile(&quot;FIFO_TB.vcd&quot;);\n  $dumpvars(0,FIFO_tb_v0.DUV);\nend  \n        \n\nassign clear = 1&#039;b1;\n\/\/ Generaci\u00f3n de reloj\ninitial                                                \nbegin   \n clock = 1&#039;b0;                                               \n forever #10 clock = !clock;                    \nend\n\n\n\n\n\/\/ Inicializaci\u00f3n de las entradas \t\ntask init_inputs();\nbegin\n  data_in &lt;=&#039;0;\n  wren &lt;= 1&#039;b0;\n  rden &lt;= 1&#039;b0;\nend\nendtask\n\/\/ Generaci\u00f3n de reset\ntask resetON();\nbegin\n#10 reset=1&#039;b0;\nFIFO_ideal={};\nrepeat(5) @(posedge clock);\n#7 reset=1&#039;b1;\nend\nendtask\n\n\/\/ Escritura de datos en la FIFO. \n\/\/ La entrada define el n\u00famero de datos a escribir   \ntask solo_escritura(input integer n_escrituras);\nbegin\nlogic &#x5B;7:0] dato;\nwren&lt;=1&#039;b0;\n@(negedge clock) \nwren&lt;=1&#039;b1;\nrepeat (n_escrituras) begin\n dato = $random%256;\n data_in = dato;\n FIFO_ideal.push_front(dato);\n @(negedge clock);\nend\nwren &lt;= 1&#039;b0;\nend\nendtask\n\/\/ Lectura de datos de la FIFO, el n\u00famero de datos a leer\n\/\/ Monitoriza la salida.\ntask solo_lectura(input integer n_lecturas);\nlogic &#x5B;7:0] dato;\nbegin\n  rden &lt;= 1&#039;b0;\n  @(negedge clock);\n  rden &lt;= 1&#039;b1;\n  repeat (n_lecturas) begin \n    @(negedge clock);\n    dato = FIFO_ideal.pop_back();\n    assert (dato == data_out) else $error(&quot;ERROR el dato leido %h no coincide con el esperado %h&quot;, dato, data_out);\n  end\n  rden &lt;= 1&#039;b0;\nend\nendtask\n\/\/ Lectura y escritura de datos simultanea. Se definen cuantos datos a leer y a escribir.\ntask lectura_escritura( input integer n_lecturas, input integer n_escrituras);\nfork\nsolo_escritura(n_escrituras);\nsolo_lectura(n_lecturas);\njoin\nendtask\n\n\n\n    \/\/Monitor de palabras en la fifo\n    \/\/ palabras en la fifo\ninteger palabras;\nalways @(posedge clock, negedge reset)\nif (!reset) palabras=0;\n    else if (!clear) palabras=0;\nelse \n   case({wren,rden})\n   2&#039;b01: palabras = palabras-1;\n   2&#039;b10: palabras = palabras+1;\n   endcase\n\/\/ Asserciones de control de la FIFO\n\n   always @(negedge clock)\nbegin\nif (reset &amp;&amp; clear) begin\n   assert ((!empty)?(palabras == 0):(palabras != 0)) else $error(&quot;ERROR se\u00f1al de FIFO vac\u00eda activada incorrectamente&quot;);\n   assert ((!full)? (palabras == 32):(palabras != 32)) else $error(&quot;ERROR se\u00f1al de FIFO llena activada incorrectamente&quot;);\n   assert (palabras &lt;= 32) else $error(&quot;ERROR FIFO con tama\u00f1o  incorrecto&quot;);\n   assert (palabras&#x5B;4:0] == use_dw) else $error(&quot;ERROR USE_DW no funciona como se espera&quot;);\nend\nend\n\n\n\/\/empiezan los tasks de alto nivel:casos de test\n\n\ntask inicializacion;\nbegin\n$display(&quot;Inicializacion de las entradas&quot;);\ninit_inputs;\n$display(&quot; reset inicial&quot;);\nresetON();\nend\nendtask\n\n\/\/ Escritura simple de dos valores y una lectura.\ntask test_A;\nbegin\n$display(&quot; escribo dos valores&quot;);\nsolo_escritura(1);\nsolo_escritura(1);\n$display(&quot;leo un valor&quot;);\nsolo_lectura(1);\nend\nendtask\n\n\/\/ Escritura y lectura simultanea con fifo llena.\ntask test_B;\nbegin\nllenar_simple;\nlectura_escritura(10,10);\nend\nendtask\n\n\/\/ Test de llenado y vaciado.\ntask test_C;\nbegin\n\nllenar_simple;\nvaciado_simple();\nlectura_escritura(10,10);\nend\nendtask\n\n\n\ntask test_D;\nbegin\n  vaciado_simple();\n  rd_wr_random(100);\n  llenar_simple;\n  rd_wr_random(100);\n  vaciado_simple();\n  solo_escritura(15);\n  rd_wr_random(100);\nend\nendtask\n\n \/\/ Escrituras y lecturas aleatorias.\n task rd_wr_random(integer numero);\n begin\n   integer caso;   \n   repeat(numero) begin\n   caso = $random%3;\n   case (caso)\n    0: if (empty) solo_lectura(1);\n    1: if (full) solo_escritura(1);\n    2:  lectura_escritura(1,1);\n    endcase\n   end\n end\n \nendtask\n\n\/\/ Task de llenado de la FIFO\ntask llenar_simple();\nlogic &#x5B;7:0]cuenta;\nbegin\n cuenta&lt;=8&#039;b0;\n while (full==1&#039;b1)\n begin\n  solo_escritura(1);\n  cuenta++;\n end\n  \nend\nendtask\n\n\/\/ Task de vaciado de la FIFO\ntask vaciado_simple();\nlogic &#x5B;7:0]cuenta;\nbegin\n cuenta&lt;=8&#039;b0;\n while (empty==1&#039;b1)\n begin\n  solo_lectura(1);\n  cuenta++;\n end\n \n \nend\nendtask\nendmodule \n\/\/ or browse Examples\n\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n    \/\/Monitor de palabras en la fifo\n    \/\/ palabras en la fifo\ninteger palabras;\nalways_ff @(posedge clock, negedge reset)\nif (!reset) palabras=0;\n    else if (!clear) palabras=0;\nelse \n   case({wren,rden})\n   2&#039;b01: palabras = palabras-1;\n   2&#039;b10: palabras = palabras+1;\n   endcase\n\/\/ Asserciones de control de la FIFO\n\n   always @(negedge clock)\nbegin\nif (reset &amp;&amp; clear) begin\n   assert ((!empty)?(palabras == 0):(palabras != 0)) else $error(&quot;ERROR se\u00f1al de FIFO vac\u00eda activada incorrectamente&quot;);\n   assert ((!full)? (palabras == 32):(palabras != 32)) else $error(&quot;ERROR se\u00f1al de FIFO llena activada incorrectamente&quot;);\n   assert (palabras &lt;= 32) else $error(&quot;ERROR FIFO con tama\u00f1o  incorrecto&quot;);\n   assert (palabras&#x5B;4:0] == use_dw) else $error(&quot;ERROR USE_DW no funciona como se espera&quot;);\nend\nend\n\n\n\/\/empiezan los tasks de alto nivel:casos de test\n\n\ntask inicializacion;\nbegin\n$display(&quot;Inicializacion de las entradas&quot;);\ninit_inputs;\n$display(&quot; reset inicial&quot;);\nresetON();\nend\nendtask\n\n\/\/ Escritura simple de dos valores y una lectura.\ntask test_A;\nbegin\n$display(&quot; escribo dos valores&quot;);\nsolo_escritura(1);\nsolo_escritura(1);\n$display(&quot;leo un valor&quot;);\nsolo_lectura(1);\nend\nendtask\n\n\/\/ Escritura y lectura simultanea con fifo llena.\ntask test_B;\nbegin\nllenar_simple;\nlectura_escritura(10,10);\nend\nendtask\n\n\/\/ Test de llenado y vaciado.\ntask test_C;\nbegin\n\nllenar_simple;\nvaciado_simple();\nlectura_escritura(10,10);\nend\nendtask\n\n\n\ntask test_D;\nbegin\n  vaciado_simple();\n  rd_wr_random(100);\n  llenar_simple;\n  rd_wr_random(100);\n  vaciado_simple();\n  solo_escritura(15);\n  rd_wr_random(100);\nend\nendtask\n\n \/\/ Escrituras y lecturas aleatorias.\n task rd_wr_random(integer numero);\n begin\n   integer caso;   \n   repeat(numero) begin\n   caso = $random%3;\n   case (caso)\n    0: if (empty) solo_lectura(1);\n    1: if (full) solo_escritura(1);\n    2:  lectura_escritura(1,1);\n    endcase\n   end\n end\n \nendtask\n\n\/\/ Task de llenado de la FIFO\ntask llenar_simple();\nlogic &#x5B;7:0]cuenta;\nbegin\n cuenta&lt;=8&#039;b0;\n while (full==1&#039;b1)\n begin\n  solo_escritura(1);\n  cuenta++;\n end\n  \nend\nendtask\n\n\/\/ Task de vaciado de la FIFO\ntask vaciado_simple();\nlogic &#x5B;7:0]cuenta;\nbegin\n cuenta&lt;=8&#039;b0;\n while (empty==1&#039;b1)\n begin\n  solo_lectura(1);\n  cuenta++;\n end\n \n \nend\nendtask\nendmodule \n\/\/ or browse Examples\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">El diagrama de bloques de este banco de pruebas ser\u00eda:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"687\" height=\"631\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/08\/work_testbench_punto_partida_sv_bdv.png\" alt=\"\" class=\"wp-image-1947\" srcset=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/08\/work_testbench_punto_partida_sv_bdv.png 687w, https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2025\/08\/work_testbench_punto_partida_sv_bdv-300x276.png 300w\" sizes=\"auto, (max-width: 687px) 100vw, 687px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Para que pod\u00e1is reproducir todo esta verificaci\u00f3n con esta fifo no sintetizable y poder disponer completamente del proyecto preparado para questasim, incorporamos el siguiente laboratorio virtual que est\u00e1 preparado para que cuando se ejecute, al final os proporcione un zip con todos los ficheros disponibles en formato adecuado para questasim. Este ser\u00e1 vuestro punto de partida!! y vamos a intentar realizar mediante test aleatorios el mismo grado de cobertura funcional o incluso superior que lo que est\u00e1 conseguido mediante este banco de pruebas con tests directos que os proporcionamos. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/ZNSM\" 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\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Instrucciones iniciales Dise\u00f1o a verificar Vamos a verificar una FIFO s\u00edncrona. El c\u00f3digo ASM es el que se adjunta en la siguiente figura Os adjunto informaci\u00f3n de c\u00f3mo deber\u00edan denominarse los puertos y de entrada y salida. Es muy importante respetar este tipo de nombres sobre todo si se quiere reusar un banco de pruebas previo. Comportamiento El comportamiento es el mostrado en el siguiente cronograma Punto de partida En esta sesi\u00f3n nos vamos a conformar en la realizaci\u00f3n del dise\u00f1o y del proyecto del banco de pruebas con systemverilog. Aunque incluimos la forma de acometer el dise\u00f1o en el siguiente subapartado, es bueno disponer de un dise\u00f1o de pruebas que os vamos a proporcionar Dise\u00f1o Para la realizaci\u00f3n del dise\u00f1o seguid las pautas del siguiente video en el cual el algoritmo realizado es un radicador. Con este procedimiento agilizaremos el dise\u00f1o aunque no se vislumbre claramente los elementos del control-path y del data-path; pero tambi\u00e9n es importante que sep\u00e1is hacer ese traslado directo de ASM a systemVerilog. Como alternativa, y para agilizar el tr\u00e1nsito hacia la verificaci\u00f3n y poder avanzar, se os proporciona un c\u00f3digo no sintetizable que nos sirva como DUV de nuestro banco de verificaci\u00f3n UVM. De paso nos podr\u00e1 servir como modelo de alto nivel que explique el comportamiento de la FIFO deseada utilizando un tipo de dato queue de SV. Verificaci\u00f3n Este va a ser nuestro gran objetivo de la tarea. Ya para empezar a realizar el banco de pruebas, proponemos un punto de partida totalmente cl\u00e1sico mediante un modulo que contiene un initial en donde se sucenden unos casos de test que est\u00e1n implementados mediante unos task (un buen representante de este vivel superior podr\u00eda ser el task denominado test_B, que a su vez anidan en su interior unos tasks de nivel intermedio (como por ejemplo llenar_simple), que asu vez contienne en su interior tasks de operaciones b\u00e1sicas de escritura y lectura de la FIFO (solo_escritura y solo_lectura ser\u00edan ejemplos de este nivel de task ). El diagrama de bloques de este banco de pruebas ser\u00eda: Para que pod\u00e1is reproducir todo esta verificaci\u00f3n con esta fifo no sintetizable y poder disponer completamente del proyecto preparado para questasim, incorporamos el siguiente laboratorio virtual que est\u00e1 preparado para que cuando se ejecute, al final os proporcione un zip con todos los ficheros disponibles en formato adecuado para questasim. Este ser\u00e1 vuestro punto de partida!! y vamos a intentar realizar mediante test aleatorios el mismo grado de cobertura funcional o incluso superior que lo que est\u00e1 conseguido mediante este banco de pruebas con tests directos que os proporcionamos.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","ub_ctt_via":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-1640","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"featured_image_src":null,"author_info":{"display_name":"admin","author_link":"https:\/\/dsd.webs.upv.es\/?author=1"},"_links":{"self":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/1640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1640"}],"version-history":[{"count":33,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/1640\/revisions"}],"predecessor-version":[{"id":1966,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/1640\/revisions\/1966"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}