{"id":971,"date":"2021-10-04T11:25:29","date_gmt":"2021-10-04T11:25:29","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=971"},"modified":"2025-08-06T18:01:28","modified_gmt":"2025-08-06T18:01:28","slug":"aleatorizacion","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=971","title":{"rendered":"Aleatorizaci\u00f3n"},"content":{"rendered":"\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">La aletaorizaci\u00f3n corre a cargo de la llamada al m\u00e9todo predefinido \u201crandomize\u201d a cualquier objeto del tipo definido por la clase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Definir un objeto, requiere el uso de la declaraci\u00f3n del objeto y de la instanciaci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nBus P; \/\/declarar: generar un identificador a un objeto de tipo Bus \u2013 inicializado en null\nP=new; \/\/instanciar: asignar el espacio para el objeto y ejecutar autom\u00e1ticamente la funci\u00f3n new() en la clase para la inicializaci\u00f3n\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>Evidentemente para poder hacer esto la clase que se referencia debe de ser visible<\/li>\n\n\n\n<li>Evidentemente ambas acciones (declarar e instanciar) se pueden hacer en una \u00fanica l\u00ednea:<span class=\"has-inline-color has-red-color\"> Bus P =new;<\/span><\/li>\n\n\n\n<li>La funci\u00f3n new() es el contructor \u2013 sin valor de retorno. El constructor se puede omitir en la clase: en este caso, se asigna el espacio para el nuevo objeto y se conservan los valores iniciales de las propiedades.<\/li>\n\n\n\n<li>new() puede tomar argumentos:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nfunction new(bit &#x5B;40:0] a);\n     addr = a;\nendfunction\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Llegado a este punto supongamos que quiero aleatorizar .   Bastar\u00eda, si ya tenemos el objeto construido , en llamar el m\u00e9todo \u00abrandomize\u00bb . En el siguiente ejemplo mostramos la construcci\u00f3n y la realizaci\u00f3n de dos randomizaciones:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nnitial begin\n  Bus busInst;\n  busInst = new;\n  \/\/ now busInt.addr and busInst.data are both zeroes\n  if (!busInst.randomize()) begin\n    $display(\u201crandomization failed\u201d);\n    $finish();\n  end\n\/\/ now bustInst.addr and busInst.data have random values that satisfy the constraints\n  assert (busInst.randomize()) else    $fatal(\u201crandomization failed\u201d);\n\/\/ now bustInst.addr and busInst.data have other random values that satisfy the constraints\nend\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Cada vez que aleatorizamos una clase, se selecciona aleatoriamente una entre todas las combinaciones posibles de todas las variables aleatorias que satisfacen todas las restricciones que hemos colocado. En el caso de que no haya ninguna combinaci\u00f3n posible, la funci\u00f3n randomize dar\u00e1 un \u00ab0\u00bb<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Acciones adicionales en el m\u00e9todo randomize<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">A\u00f1adir m\u00e1s restricciones<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Se realiza con la palabra reservada \u00abwith\u00bb<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nres = bus.randomize() with {addr&#x5B;0] || addr&#x5B;1];};\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Se puede observar que al randomizar indicamos una restricci\u00f3n adicional expresada entre las llaves. Adem\u00e1s de todas las restricciones dadas en la clase, para s\u00f3lo esta aleatorizaci\u00f3n agregamos la restricci\u00f3n que addr[0] o addr[1] debe ser 1.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cambiar el car\u00e1cter de las variables<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Las clases pueden tener miembros rand y no-rand<\/li>\n\n\n\n<li>al aleatorizar una clase, aleatorizamos solo las variables aleatorias, los no aleatorios mantienen sus valores <\/li>\n\n\n\n<li>Las restricciones pueden mezclar en sus expresiones variables rand y no rand<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos un ejemplo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass B;\n  rand bit a, b;\n  bit c, d;\n  constraint c1 { d -&gt; b;};\n  constraint c2 { a &amp;b == c;};\nendclass\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Cuando llamamos al m\u00e9todo randomize podemos cambiar el car\u00e1cter de dichas variables<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>inst.randomize(a) : poniendo como argumento la variable <strong>a<\/strong> indicamos que solo esta variable va a ser considerada como randomizable. La variable  <strong>b<\/strong> ser\u00e1 considerada como variable est\u00e1tica.<\/li>\n\n\n\n<li>inst.randomize(a,c):  El efecto sobre <strong>a<\/strong> y <strong>b<\/strong> es el mismo del ejemplo anterior; sin embargo la variable <strong>c<\/strong> que era est\u00e1tica, pasa a ser ahora en esta randomizaci\u00f3n como variable<strong>.<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e9todos adicionales<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">constraint_mode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos el siguiente ejemplo. Como puede observarse, podemos inhabilitar antes de cada llamada a randomize las restricciones que deseemos con tan solo llamar el m\u00e9todo <strong>constraint_mode<\/strong> asociadas a dicha restricci\u00f3n y poniendo como argumento un cero.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando deseemos podremos volver a habilitar la restricci\u00f3n con el mismo m\u00e9todo asociada a la misma y con un argumento uno.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass Bus;\n  rand bit&#x5B;15:0] addr;\n  rand bit&#x5B;31:0] data;\n  constraint word_align {addr&#x5B;1:0] == 2\u2019b0;}\n  constraint addr_data_dep {addr==0 -&gt; data==0;}\nendclass\ninitial begin\n  Bus bus;\n  bus = new;\nbus.randomize();\n\/\/ turn off the word_align constraint\nbus.word_align.constraint_mode(0);\nbus.randomize();\nbus.randomize() with {addr&#x5B;0]==1;};\n\/\/ turn on the word_align constraint\nbus.word_align.constraint_mode(1);\nbus.randomize();\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">rand_mode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tomando como ejemplo el c\u00f3digo anterior en el que tenemos dos variables aleatorizables : addr y data Despu\u00e9s de esta declaraci\u00f3n: bus.addr.<strong>rand_mode<\/strong>(0); <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00abaddr\u201d dentro del objeto \u201cbus\u201d se considera como una variable no-rand(no aleatorizado cuando realizamos el randomize()) <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para volver a su situaci\u00f3n rand, usamos: bus.addr.<strong>rand_mode<\/strong>(1);<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">pre_randomize y post_randomize<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">En nuestra clase podemos definir unas funciones <strong>pre_randomize <\/strong>y <strong>post_randomize<\/strong>. Veamos el siguiente ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nprogram ordering;\n  class frame_t;\n    rand bit zero;\n    rand bit &#x5B;15:0] data &#x5B;];\n  \n    constraint frame_sizes {\n     solve zero before data.size;     \n      zero -&amp;gt; data.size == 0;\n      data.size inside {&#x5B;0:10]};\n      foreach (data&#x5B;i])\n        data&#x5B;i] == i;\n    }\n     function void pre_randomize();\n      begin\n        assert (zero==1&#039;b0) else \n          $display(&quot;zero estaba activo&quot;);\n      end\n    endfunction\n    function void post_randomize();\n      begin\n        assert (zero==1&#039;b0) else \n          $display(&quot;zero esta activo&quot;);\n        $display(&quot;length   : %0d&quot;, data.size());\n        for (integer i = 0; i &amp;lt; data.size(); i++) begin\n         $write (&quot;%2x &quot;,data&#x5B;i]);\n        end\n        $write(&quot;\\n&quot;);\n      end\n    endfunction\n  endclass\n  initial begin\n     frame_t frame = new();\n     integer i,j = 0;\n    for (j=0;j &amp;lt; 10; j++) begin\n       $write(&quot;-------------------------------\\n&quot;);\n       $write(&quot;Randomize Value\\n&quot;);\n       i = frame.randomize();\n     end\n     $write(&quot;-------------------------------\\n&quot;);\n  end\nendprogram\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Dichos m\u00e9todos  ser\u00e1n ejecutados autom\u00e1ticamente (sin necesidad de llamarlos expl\u00edcitamente)   justo antes y despu\u00e9s de que tenga lugar la aleatorizaci\u00f3n al llamar <strong>randomize<\/strong>()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">el flujo de ejecuci\u00f3n ser\u00e1 el siguiente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>frame.<strong>pre_randomize<\/strong>();<\/li>\n\n\n\n<li>frame is randomized<\/li>\n\n\n\n<li>frame.<strong>post_randomize<\/strong>();<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos el funcionamiento en el siguiente laboratorio virtual<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/Fcgi\" 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\n\n\n<h3 class=\"wp-block-heading\">randcase<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A veces lo que deseamos aleatorizar mediante el \u00absolver\u00bb es la ejecuci\u00f3n de un determinada rutina u otra en funci\u00f3n de unos pesos que indiquen la probabilidad de las mismas. Eso lo realizaremos mediante \u00ab<strong>randcase<\/strong>\u00ab. Veamos el siguiente ejemplo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nwhile (driver.sb.size&amp;gt;0) \/\/empiezo a vaciar\n    fork begin\n\t\tfork\n\t\t\t randcase\n\t\t\t\t10: driver.genPop_rand();\n\t\t\t\t5: driver.genPush_rand();\n\t\t\t  endcase\n\t\t\t randcase\n\t\t\t\t10: driver.genPop_rand();\n\t\t\t\t6: driver.genPush_rand();\n\t\t\t  endcase\n\t\tjoin_any\n                $display(&quot;la fifo tiene  %d palabras&quot;, driver.sb.size);\n\t\t$display(&quot;Instance coverage is %e&quot;, driver.COV_entradas.get_coverage());\n\t\tdisable fork;\n      end join\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Podemos observar en el \u00abfork join_any\u00bb central que realizamos dos operaciones concurrentes representadas cada una  de ellas con un randcase. Estas operaciones concurrentes tienen una mayor probabilidad de ser operaciones de lectura (en este caso de una FIFO) que de escritura. Si ambos procesos concurrentes coinciden con la misma rutina, \u00e9sta se realiza una \u00fanica vez. Si la rutina es diferente se realizar\u00e1n ambas (lo cual permitir\u00eda lectura y escritura simult\u00e1nea de la FIFO). <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con esta estructura podemos lograr un vaciado progresivo random de la FIFO, sin impedir que pueda haber escrituras o escrituras y lecturas simult\u00e1neas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La aletaorizaci\u00f3n corre a cargo de la llamada al m\u00e9todo predefinido \u201crandomize\u201d a cualquier objeto del tipo definido por la clase. Definir un objeto, requiere el uso de la declaraci\u00f3n del objeto y de la instanciaci\u00f3n. Llegado a este punto supongamos que quiero aleatorizar . Bastar\u00eda, si ya tenemos el objeto construido , en llamar el m\u00e9todo \u00abrandomize\u00bb . En el siguiente ejemplo mostramos la construcci\u00f3n y la realizaci\u00f3n de dos randomizaciones: Cada vez que aleatorizamos una clase, se selecciona aleatoriamente una entre todas las combinaciones posibles de todas las variables aleatorias que satisfacen todas las restricciones que hemos colocado. En el caso de que no haya ninguna combinaci\u00f3n posible, la funci\u00f3n randomize dar\u00e1 un \u00ab0\u00bb Acciones adicionales en el m\u00e9todo randomize A\u00f1adir m\u00e1s restricciones Se realiza con la palabra reservada \u00abwith\u00bb Se puede observar que al randomizar indicamos una restricci\u00f3n adicional expresada entre las llaves. Adem\u00e1s de todas las restricciones dadas en la clase, para s\u00f3lo esta aleatorizaci\u00f3n agregamos la restricci\u00f3n que addr[0] o addr[1] debe ser 1. Cambiar el car\u00e1cter de las variables Veamos un ejemplo Cuando llamamos al m\u00e9todo randomize podemos cambiar el car\u00e1cter de dichas variables M\u00e9todos adicionales constraint_mode Veamos el siguiente ejemplo. Como puede observarse, podemos inhabilitar antes de cada llamada a randomize las restricciones que deseemos con tan solo llamar el m\u00e9todo constraint_mode asociadas a dicha restricci\u00f3n y poniendo como argumento un cero. Cuando deseemos podremos volver a habilitar la restricci\u00f3n con el mismo m\u00e9todo asociada a la misma y con un argumento uno. rand_mode Tomando como ejemplo el c\u00f3digo anterior en el que tenemos dos variables aleatorizables : addr y data Despu\u00e9s de esta declaraci\u00f3n: bus.addr.rand_mode(0); \u00abaddr\u201d dentro del objeto \u201cbus\u201d se considera como una variable no-rand(no aleatorizado cuando realizamos el randomize()) Para volver a su situaci\u00f3n rand, usamos: bus.addr.rand_mode(1); pre_randomize y post_randomize En nuestra clase podemos definir unas funciones pre_randomize y post_randomize. Veamos el siguiente ejemplo: Dichos m\u00e9todos ser\u00e1n ejecutados autom\u00e1ticamente (sin necesidad de llamarlos expl\u00edcitamente) justo antes y despu\u00e9s de que tenga lugar la aleatorizaci\u00f3n al llamar randomize() el flujo de ejecuci\u00f3n ser\u00e1 el siguiente: Veamos el funcionamiento en el siguiente laboratorio virtual randcase A veces lo que deseamos aleatorizar mediante el \u00absolver\u00bb es la ejecuci\u00f3n de un determinada rutina u otra en funci\u00f3n de unos pesos que indiquen la probabilidad de las mismas. Eso lo realizaremos mediante \u00abrandcase\u00ab. Veamos el siguiente ejemplo Podemos observar en el \u00abfork join_any\u00bb central que realizamos dos operaciones concurrentes representadas cada una de ellas con un randcase. Estas operaciones concurrentes tienen una mayor probabilidad de ser operaciones de lectura (en este caso de una FIFO) que de escritura. Si ambos procesos concurrentes coinciden con la misma rutina, \u00e9sta se realiza una \u00fanica vez. Si la rutina es diferente se realizar\u00e1n ambas (lo cual permitir\u00eda lectura y escritura simult\u00e1nea de la FIFO). Con esta estructura podemos lograr un vaciado progresivo random de la FIFO, sin impedir que pueda haber escrituras o escrituras y lecturas simult\u00e1neas.<\/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-971","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\/971","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=971"}],"version-history":[{"count":19,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/971\/revisions"}],"predecessor-version":[{"id":1914,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/971\/revisions\/1914"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=971"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}