{"id":251,"date":"2020-09-23T13:47:11","date_gmt":"2020-09-23T13:47:11","guid":{"rendered":"http:\/\/dsd.webs.upv.es\/?p=251"},"modified":"2023-09-26T13:01:34","modified_gmt":"2023-09-26T13:01:34","slug":"modelo-de-fifo-ideal-con-colas-2","status":"publish","type":"post","link":"https:\/\/dsd.webs.upv.es\/?p=251","title":{"rendered":"Modelo de Fifo ideal con colas"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\" id=\"block-11a8a999-38f0-4879-a401-94075bd3bd84\">En este <a href=\"https:\/\/www.edaplayground.com\/x\/dG6a\">enlace <\/a>podr\u00e9is ver una modelizaci\u00f3n de una fifo como la solicitada en la tarea 1 mediante una cola y un peque\u00f1o banco de pruebas de algunos casos de verificaci\u00f3n.<\/p>\n\n\n\n<ul class=\"wp-block-list\" id=\"block-4e1f87cb-c445-4091-8a7c-503db073d2ee\">\n<li>Ni qu\u00e9 decir tiene que esa fifo no es sintetizable<\/li>\n\n\n\n<li>El caso 1 de verificaci\u00f3n solo puede comprobarse el correcto comportamiento mediante la observaci\u00f3n de una forma de ondas<\/li>\n\n\n\n<li>El caso 2 de verificaci\u00f3n ya comprueba el propio c\u00f3digo el funcionamiento y no requiere que visualice las formas de ondas. Esto se consigue con el \u00abtask\u00bb denominado \u00abautomatic leo_comprueba_vector_2pos\u00bb . Aparece por tanto el valor esperado (\u00abgolden vector\u00bb) que es introducido en la \u00abtask\u00bb de lectura y comprobaci\u00f3n en la l\u00ednea 7.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: verilog; highlight: [16,17,18]; title: ; notranslate\" title=\"\">\n  \/\/ejemplo MFB bajo nivel\n  \ntask automatic leo_comprueba_vector_2pos;\n  ref  &#x5B;7:0] datos_sal_obtenido;\n  ref enable_lectura;\n  ref  reloj;  \n  input  &#x5B;7:0] datos_sal_esperado;\nbegin\n  @(posedge reloj);\n  #(Thold);\n  enable_lectura=1&#039;b1;\n  @(posedge reloj);\n  #(Thold);\n  enable_lectura=1&#039;b0; \n  #(T-Tsetup-Thold);\n  assert (datos_sal_obtenido == datos_sal_esperado) \n  else \n    $error (&quot;La fifo esta fallando&quot;);   \n \nend\nendtask\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>En esta misma task se puede ver un ejemplo sencillo de utilizaci\u00f3n de una aserci\u00f3n inmediata (l\u00edneas de 16 a 18). Como conozco el valor esperado y en qu\u00e9 instante tiene que aparecer, observo si el valor obtenido en la salida de la FIFO es el igual al esperado, y si no lo es determino que hay un error en la FIFO que estoy simulando.  Por supuesto esta <span style=\"color:#912611\" class=\"has-inline-color\">aserci\u00f3n inmediata<\/span> se ejecutar\u00e1 tantas veces como este \u00abtask\u00bb sea llamado desde el \u00abinitial\u00bb general del banco de pruebas; pero en cualquier caso siempre en un \u00e1mbito secuencial inmediato.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Paso de argumentos por referencia<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Quiz\u00e1 en este ejemplo de \u00abtask\u00bb sea necesario insistir en la cuesti\u00f3n: <span class=\"has-inline-color has-vivid-red-color\">\u00bfQu\u00e9 es el paso de argumentos por referencia?<\/span> Supongamos que tenemos una instanciaci\u00f3n de la FIFO en nuestro banco de pruebas de la siguiente forma<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:verilog decode:true \">FIFO #(32,8) myFIFO\n(.CLOCK(clk),\n .RESET_N(reset),\n .DATA_OUT(dato_salida),\n .DATA_IN (dato_entrada),\n .FULL_N(lleno)\n .EMPTY_N(vacio)\n .USE_DW(use_dw));<\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En principio el task de lectura y comprobaci\u00f3n podr\u00eda haberse escrito como<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:verilog decode:true \">task leo_comprueba_vector_2pos;\n  \n  input  [7:0] datos_sal_esperado;\nbegin\n  @(posedge clk);\n  #(Thold);\n  read=1'b1;\n  @(posedge clk);\n  #(Thold);\n  read=1'b0; \n  #(T-Tsetup-Thold);\n  assert (datos_salida == datos_sal_esperado)\n    \n  else \n    $error (\"La fifo esta fallando\");   \n \nend\nendtask <\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Puede verse que ahora solo tenemos en la \u00abtask\u00bb un argumento (el valor esperado en la salida de la fifo que se observa en la l\u00ednea 3).  Puede comprobarse que el resto de se\u00f1ales que se leen en el interior del \u00abtask\u00bb no han sido transferidos al mismo a trav\u00e9s de argumentos, sino que se utilizan directamente las variables y se\u00f1ales globales que tengo en el banco de pruebas (clk, read, dato_salida). Esto se puede hacer pero evidentemente este \u00abtask\u00bb cada vez que quiera reusarlo tendr\u00e9 que rescribirlo para adaptarme a los nombres que estas se\u00f1ales  tengan en el nuevo banco de pruebas.<\/li>\n\n\n\n<li>Una alternativa es pasar esas variables al \u00abtask\u00bb a trav\u00e9s de nuevos argumentos  <\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:verilog decode:true \">ref [7:0] datos_sal_obtenido;\nref enable_lectura;\nref reloj;<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">siempre teniendo en cuenta que el paso no puede ser por valor sino por referencia (por eso se utiliza la palabra reservada <span class=\"has-inline-color has-vivid-red-color\">ref<\/span>). Si yo pasara por valor con <\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:verilog decode:true \">input [7:0] datos_sal_obtenido;\ninput enable_lectura;\ninput reloj;<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">el problema que tenemos es que estas se\u00f1ales  cuando llam\u00e1ramos al task de la forma<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      @(negedge clk);     \n      leo_comprueba_vector_2pos(dato_salida,read,clk, valor);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">tendr\u00edan en el interior del task siempre el<strong> MISMO VALOR<\/strong> que ten\u00edan cuando dicho task fue lanzado (en el @negedge clk previo) y permanecer\u00eda su <strong>VALOR <\/strong>constante a trav\u00e9s de toda la ejecuci\u00f3n interna del task (que puede durar varios ciclos). Si yo quiero que esos argumentos sigan los cambios de las se\u00f1ales que se referencian, debo utilizar <span class=\"has-inline-color has-vivid-red-color\">ref<\/span><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Laboratorio virtual<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/dG6a\" 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-8.png\" alt=\"\" class=\"wp-image-1518\"\/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este enlace podr\u00e9is ver una modelizaci\u00f3n de una fifo como la solicitada en la tarea 1 mediante una cola y un peque\u00f1o banco de pruebas de algunos casos de verificaci\u00f3n. Paso de argumentos por referencia siempre teniendo en cuenta que el paso no puede ser por valor sino por referencia (por eso se utiliza la palabra reservada ref). Si yo pasara por valor con el problema que tenemos es que estas se\u00f1ales cuando llam\u00e1ramos al task de la forma tendr\u00edan en el interior del task siempre el MISMO VALOR que ten\u00edan cuando dicho task fue lanzado (en el @negedge clk previo) y permanecer\u00eda su VALOR constante a trav\u00e9s de toda la ejecuci\u00f3n interna del task (que puede durar varios ciclos). Si yo quiero que esos argumentos sigan los cambios de las se\u00f1ales que se referencian, debo utilizar ref Laboratorio virtual<\/p>\n","protected":false},"author":2,"featured_media":1427,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[5,36],"tags":[13,17,14,9,11],"class_list":["post-251","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-verificacion","category-verificacion-funcional-verificacion","tag-golden-model","tag-golden-vectors","tag-aserciones-inmediatas","tag-colas","tag-verificacion"],"featured_image_src":"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2022\/09\/image-1.png","author_info":{"display_name":"ralfgad","author_link":"https:\/\/dsd.webs.upv.es\/?author=2"},"_links":{"self":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/251","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\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=251"}],"version-history":[{"count":19,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/251\/revisions"}],"predecessor-version":[{"id":1522,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/posts\/251\/revisions\/1522"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/media\/1427"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}