{"id":979,"date":"2021-10-04T12:31:15","date_gmt":"2021-10-04T12:31:15","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=979"},"modified":"2025-08-06T18:06:38","modified_gmt":"2025-08-06T18:06:38","slug":"driver","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=979","title":{"rendered":"Driver"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cuando aleatorizamos, deseamos que esos valores obtenidos fruto de la aleatorizaci\u00f3n se conviertan en est\u00edmulos que conduzcan se\u00f1ales a nuestros dise\u00f1os objeto de verificaci\u00f3n. Veamos c\u00f3mo lo hacemos en varios ejemplos desarrollados en nuestros laboratorios virtuales de ejemplo del radicador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dsd.webs.upv.es\/?page_id=664\" data-type=\"page\" data-id=\"664\">Paso 1<\/a>:  Tenemos la instanciaci\u00f3n del objeto RCSG dentro del mismo m\u00f3dulo donde se declara la se\u00f1al que se conecta al puerto de entrada del DUV. Tenemos por tanto una visibilidad completa y podemos hacerla c\u00f3mo se resalta en el siguiente ejemplo, en el que queremos introducir un valor aleatorizado a la entrada X del radicador.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n while ( veamos.get_coverage()&lt;90)\n\tbegin\n \t   busInst.impares.constraint_mode(0);\n\t   busInst.pares.constraint_mode(1);\n\t   $display(&quot;pruebo con pares&quot;);\n\t   assert (busInst.randomize()) else    $fatal(&quot;randomization failed&quot;);\n    \t   X = busInst.valor;\t\n    \t   veamos.sample();  \n    \t   @(posedge CLK);  \t\n\t   START &lt;= 1&#039;b1;\n\t   @(posedge CLK);\n\t   START &lt;= 1&#039;b0;\n\t   @(posedge FIN);\n\t   -&gt; comprobar;\n\t   @(negedge FIN);\n   end\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dsd.webs.upv.es\/?page_id=673\" data-type=\"page\" data-id=\"673\">Paso 2:<\/a>  La situaci\u00f3n es bastante parecida. Solo que ahora el m\u00f3dulo en donde conviven el objeto RCSG y la se\u00f1al a recibir el valor es substituido por un program. La se\u00f1al X no es directamente la que se conecta a la entrada del DUV, sino una salida del program que se conectar\u00e1 a la entrada del DUV <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nsed i1 (\n\/\/ port map - connection between master ports and signals\/registers   \n\t.CLK(CLK),\n\t.COUNT(COUNT),\n\t.FIN(FIN),\n\t.RESET(RESET),\n\t.START(START),\n\t.X(X)\n);\n \/\/instanciacion del program  \n  estimulos #(.size(4))\n   estim1 (.*,\n           .X(X)); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La gran diferencia de comportamiento la tendremos por generar la asociaci\u00f3n de la entrada X a trav\u00e9s de un program (ver p\u00e1gina relativa al <a href=\"https:\/\/dsd.webs.upv.es\/?page_id=512\" data-type=\"page\" data-id=\"512\">Program<\/a>); garantizando que el est\u00edmulo X sea percibido sin carreras.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dsd.webs.upv.es\/?page_id=676\" data-type=\"page\" data-id=\"676\">Paso 3:<\/a> De nuevo tenemos un est\u00edmulo procedente de un program, pero en este caso hemos cogido el valor aleatorio que nos interesa y lo asignamos a un elemento de un clocking block que tiene un skew de 1 ns. Vemos en el siguiente ejemplo como conducimos sobre sd.X el valor obtenido en la aleatorizaci\u00f3n. <strong>LLama la atenci\u00f3n que toda acci\u00f3n de asignaci\u00f3n driver a trav\u00e9s de un clocking block debe realizarse con asignaciones de tipo non-blocking<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nwhile ( veamos.get_coverage()&amp;lt;40)\t\nbegin\n\t   busInst.pares.constraint_mode(0);\n\t   $display(&quot;pruebo con impares&quot;);\n\t   assert (busInst.randomize()) else    $fatal(&quot;randomization failed&quot;);\n   \t   sd.X &amp;lt;= busInst.valor;\n   \t   veamos.sample();\n   \t   ##1\n\t   sd.START &amp;lt;= 1&#039;b1;\n\t   ##1\n\t   sd.START &amp;lt;= 1&#039;b0;\n\t   @(negedge sd.FIN);\nend\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Podemos ver el cronograma del comportamiento del est\u00edmulo sd.X, de c\u00f3mo es percibida esta entrada por el DUV . Aprovechamos tambi\u00e9n para observar c\u00f3mo este est\u00edmulo  es monitorizado (md.X) para llevarlo al modelo de referencia. hacemos uso de otro clocking block engargado de todas las tareas de monitorizaci\u00f3n de salidas y entradas.<\/p>\n\n\n\n<iframe frameborder=\"0\" src=\"https:\/\/drom.io\/vcd\/?github=ralfgad\/simulaciones_vcd\/main\/radicador_detalles3_2.vcd\" class=\"\" style=\"width:100%;max-width:100%;height:800\"><\/iframe>\n\n\n\n<p class=\"wp-block-paragraph\">En cualquier caso en este paso 3 la visibilidad de todas las variables es completa y no es necesario ning\u00fan mecanismos especial para garantizarla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dsd.webs.upv.es\/?page_id=678\" data-type=\"page\" data-id=\"678\">Paso 4<\/a> : Estamos en una situaci\u00f3n muy parecida a la anterior. Estoy dentro del program y tengo visibilidad de los datos aleatorizados obtenidos en el objeto de la clase RCSG y tengo acceso a las se\u00f1ales del interfaz en sus modport correspondientes (controlados por los clocking-block). Destacamos la l\u00ednea donde realizamos la acci\u00f3n de driver.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nwhile ( veamos.get_coverage()&amp;lt;40)\n\tbegin\n\t   busInst.pares.constraint_mode(0);\n\t   $display(&quot;pruebo con impares&quot;);\n\t   assert (busInst.randomize()) else    $fatal(&quot;randomization failed&quot;);\n   \t   testar.sd.data_in&amp;lt;= busInst.valor;\t\n   \t   veamos.sample();\n   \t   @(testar.sd);\n\t   testar.sd.empieza &amp;lt;= 1&#039;b1;\n\t   @(testar.sd);\n\t   testar.sd.empieza &amp;lt;= 1&#039;b0;\n   \t   @(negedge testar.sd.termina);\n     end\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">En cuanto al comportamiento tenemos el mismo que ten\u00edamos en el paso 3 controlado por la acci\u00f3n de sincronismo de los clocking blocks, ahora situados en el interfaz en lugar de directamente en el program<\/p>\n\n\n\n<iframe frameborder=\"0\" src=\"https:\/\/drom.io\/vcd\/?github=ralfgad\/simulaciones_vcd\/main\/radicador_detalles4_1.vcd\" class=\"\" style=\"width:100%;max-width:100%;height:800\"><\/iframe>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dsd.webs.upv.es\/?page_id=680\" data-type=\"page\" data-id=\"680\">Paso 5<\/a>: Este caso el driver se  realiza en una task que se encuentra dentro de una clase denominada enviroment. <\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\ntask prueba_random_impares;\n  while ( valores_X_trigger.mon_entradas_impares.get_coverage()&amp;lt;80)\n\tbegin\n\t   busInst.pares.constraint_mode(0);\n\t   $display(&quot;pruebo con impares&quot;);\n\t   assert (busInst.randomize()) else    $fatal(&quot;randomization failed&quot;);\n   \t   testar_ports.sd.data_in&lt;= busInst.valor;\t\n   \t   valores_X.sample();\n   \t   @(testar_ports.sd);\n\t   testar_ports.sd.empieza &lt;= 1&#039;b1;\n   \t   @(testar_ports.sd);\n\t   testar_ports.sd.empieza &lt;= 1&#039;b0;\n   \t   @(negedge testar_ports.sd.termina);\n     end\nendtask\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La visibilidad de valor randomizado no es un problema, puesto que proviene de un objeto de tipo RCSG que hemos construido dentro de la clase \u00abenviroment\u00bb. M\u00e1s complejo es hacerse luego acceso al interfaz del dise\u00f1o para asignar ese valor aleatorizado al est\u00edmulo \u00absd.data_in\u00bb, puesto que se trata de un interfaz f\u00edsico que no es accesible desde una clase salvo que se utilice un interfaz virtual asociado al mismo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nvirtual test_if.test testar_ports;\n  virtual test_if.monitor monitorizar_ports;\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Cuando aleatorizamos, deseamos que esos valores obtenidos fruto de la aleatorizaci\u00f3n se conviertan en est\u00edmulos que conduzcan se\u00f1ales a nuestros dise\u00f1os objeto de verificaci\u00f3n. Veamos c\u00f3mo lo hacemos en varios ejemplos desarrollados en nuestros laboratorios virtuales de ejemplo del radicador. Paso 1: Tenemos la instanciaci\u00f3n del objeto RCSG dentro del mismo m\u00f3dulo donde se declara la se\u00f1al que se conecta al puerto de entrada del DUV. Tenemos por tanto una visibilidad completa y podemos hacerla c\u00f3mo se resalta en el siguiente ejemplo, en el que queremos introducir un valor aleatorizado a la entrada X del radicador. Paso 2: La situaci\u00f3n es bastante parecida. Solo que ahora el m\u00f3dulo en donde conviven el objeto RCSG y la se\u00f1al a recibir el valor es substituido por un program. La se\u00f1al X no es directamente la que se conecta a la entrada del DUV, sino una salida del program que se conectar\u00e1 a la entrada del DUV La gran diferencia de comportamiento la tendremos por generar la asociaci\u00f3n de la entrada X a trav\u00e9s de un program (ver p\u00e1gina relativa al Program); garantizando que el est\u00edmulo X sea percibido sin carreras. Paso 3: De nuevo tenemos un est\u00edmulo procedente de un program, pero en este caso hemos cogido el valor aleatorio que nos interesa y lo asignamos a un elemento de un clocking block que tiene un skew de 1 ns. Vemos en el siguiente ejemplo como conducimos sobre sd.X el valor obtenido en la aleatorizaci\u00f3n. LLama la atenci\u00f3n que toda acci\u00f3n de asignaci\u00f3n driver a trav\u00e9s de un clocking block debe realizarse con asignaciones de tipo non-blocking Podemos ver el cronograma del comportamiento del est\u00edmulo sd.X, de c\u00f3mo es percibida esta entrada por el DUV . Aprovechamos tambi\u00e9n para observar c\u00f3mo este est\u00edmulo es monitorizado (md.X) para llevarlo al modelo de referencia. hacemos uso de otro clocking block engargado de todas las tareas de monitorizaci\u00f3n de salidas y entradas. En cualquier caso en este paso 3 la visibilidad de todas las variables es completa y no es necesario ning\u00fan mecanismos especial para garantizarla. Paso 4 : Estamos en una situaci\u00f3n muy parecida a la anterior. Estoy dentro del program y tengo visibilidad de los datos aleatorizados obtenidos en el objeto de la clase RCSG y tengo acceso a las se\u00f1ales del interfaz en sus modport correspondientes (controlados por los clocking-block). Destacamos la l\u00ednea donde realizamos la acci\u00f3n de driver. En cuanto al comportamiento tenemos el mismo que ten\u00edamos en el paso 3 controlado por la acci\u00f3n de sincronismo de los clocking blocks, ahora situados en el interfaz en lugar de directamente en el program Paso 5: Este caso el driver se realiza en una task que se encuentra dentro de una clase denominada enviroment. La visibilidad de valor randomizado no es un problema, puesto que proviene de un objeto de tipo RCSG que hemos construido dentro de la clase \u00abenviroment\u00bb. M\u00e1s complejo es hacerse luego acceso al interfaz del dise\u00f1o para asignar ese valor aleatorizado al est\u00edmulo \u00absd.data_in\u00bb, puesto que se trata de un interfaz f\u00edsico que no es accesible desde una clase salvo que se utilice un interfaz virtual asociado al mismo.<\/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-979","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\/979","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=979"}],"version-history":[{"count":19,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/979\/revisions"}],"predecessor-version":[{"id":1915,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/979\/revisions\/1915"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}