{"id":963,"date":"2021-10-04T10:55:47","date_gmt":"2021-10-04T10:55:47","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=963"},"modified":"2025-08-06T17:45:57","modified_gmt":"2025-08-06T17:45:57","slug":"definicion","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=963","title":{"rendered":"Definici\u00f3n"},"content":{"rendered":"\n\n\n<p class=\"wp-block-paragraph\">El lugar natural de definici\u00f3n de qu\u00e9 variables queremos aleatorizar y c\u00f3mo es dentro de una clase de systemVerilog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos un primer ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass Bus;\n  rand bit &#x5B;4:0] addr1;\n  rand bit &#x5B;4:0] addr2;\n  rand bit &#x5B;7:0] data;\n  rand bit   enable;\n  constraint word_align1    {addr1&#x5B;1:0] == 2&#039;b0;}\n  constraint word_align2    {addr2&#x5B;1:0] == 2&#039;b0;}\n  constraint addr_data_dep {addr1==0 -&amp;gt; data==0;}\nendclass\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo sencillo indicamos :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En las l\u00edneas 2 , 3, 4 y 5 que las variables aleatorizables son addr y data.<\/li>\n\n\n\n<li>En las l\u00edneas 6, 7 y 8 indicamos unas restricciones (expresiones) que debe de cumplir la aleatorizaci\u00f3n (digamos que estas expresiones tienen que ser ciertas. Fij\u00e9monos que estas restricciones pueden afectar \u00fanicamente a una variable o a varias de ellas de manera conjunta. <\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos otro ejemplo en el cual en lugar de utilizar la palabra reservada \u00ab<strong>rand<\/strong>\u00bb utilizamos \u00ab<strong>randc<\/strong>\u00ab<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass inData;\n  randc bit&#x5B;2:0] b;\nendclass\n<\/pre><\/div>\n\n\n<div class=\"wp-block-media-text alignwide is-stacked-on-mobile\" style=\"grid-template-columns:37% auto\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"143\" height=\"300\" src=\"https:\/\/dsd.webs.upv.es\/wp-content\/uploads\/2021\/10\/image-143x300.png\" alt=\"\" class=\"wp-image-1084 size-medium\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<p class=\"wp-block-paragraph\">El \u201cramdom solver\u201d iterar\u00e1 a trav\u00e9s de todos los valores en un orden aleatorio, a continuaci\u00f3n, reiniciar\u00e1 un nuevo ciclo con un orden diferente. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n<\/div>\n<\/div>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos observar en el siguiente Laboratorio virtual el diferente comportamiento de usar rand y randc.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/73Jz\" 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-1.png\" alt=\"\" class=\"wp-image-1499\"\/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Tipos de restricci\u00f3n<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Inside keyword<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puede tener una forma bastante simple, como la del siguiente ejemplo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass inData;\n  rand bit&#x5B;2:0] b;\n  constraint bc {b inside {0, 3, &#x5B;5:7]};};\nendclass\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Podr\u00eda involucrar a varias variables aleatorizables<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass inData;\n  rand bit&#x5B;7:0] b;\n  rand bit&#x5B;7:0] c;\n  constraint bc {b inside {0, 3, &#x5B;c+1:255]};};\nendclass\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Implication<\/strong> <strong>keyword<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implication constraints:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass inData\nrand int len;\nrand enum {little,big} mode;\nconstraint c1 {mode == little -&gt;len &lt;10 ;};\nconstraint c2 {mode == big    -&gt; len &gt;100;};\nendclass\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>Si modo es \u201clittle\u201d, entonces \u201clen\u201d debe de ser &lt;10<\/li>\n\n\n\n<li>Si modo es \u201cbig\u201d, entonces \u201clen\u201d debe de ser &gt;100<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dist keyword<\/strong><\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass id;\n rand int x;\n constraint{x dist {100 := 1, 200 := 2, 300 := 5};}\nendclass;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>x puede tomar los valores 100, 200, 300 con probabilidad 1\/8, 2\/8, 5\/8 (Pesos 1,2,5). <\/li>\n\n\n\n<li>x no puede tomar ning\u00fan otro valor (Como 97, 262, etc.)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Por supuesto, este tipo de restricci\u00f3n se puede combinar con la implicaci\u00f3n<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nconstraint c {a -&gt; b dist {0 := 1, 1 := 4;};}\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>si \u201ca\u201d es verdadera entonces \u201cb\u201d se distribuye de acuerdo con la distribuci\u00f3n indicada por dist<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Solving order<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos el siguiente ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass B;\n  rand bit s;\n  rand bit &#x5B;31:0] d;\n  constraint c { s -&gt; d == 0; }\n  constraint order { solve s before d; }\nendclass\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>primero los elementos en <strong>s<\/strong> se resolver\u00e1n (aleatorizar\u00e1n) desactivando todas las restricciones que incluyen un elemento que es diferente de s; luego<strong> s<\/strong> se toma como un valor fijo y <strong>d<\/strong> se resuelve despu\u00e9s de activar de nuevo todas las restricciones<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos otro 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  rand bit &#x5B;7:0] c;\n  constraint c1 { a -&gt;b;};\n  constraint c2 { a &amp;b -&gt; c inside {&#x5B;0:4]};};\n  constraint c3 {c inside {&#x5B;0:3]} -&gt;a==0;}\n  constraint order { solve a,b before c; }\nendclass\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>primero <strong>c2 y c3<\/strong> se desactivan (puesto que afectan a algunas variables diferentes <strong>a<\/strong> y <strong>b<\/strong>) , <strong>a <\/strong>y <strong>b<\/strong> se aleatorizan con s\u00f3lo <strong>c1<\/strong> activo. A continuaci\u00f3n, <strong>c2<\/strong> y <strong>c3<\/strong> se reactivan; y se realiza la aleatorizaci\u00f3n de <strong>c<\/strong> calculando todas las combinaciones legales  en funci\u00f3n de los valores de <strong>a <\/strong>y<strong> b<\/strong> que se hab\u00edan aleatorizado con anterioridad.<\/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-2.png\" alt=\"\" class=\"wp-image-1501\"\/><\/a><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>El lugar natural de definici\u00f3n de qu\u00e9 variables queremos aleatorizar y c\u00f3mo es dentro de una clase de systemVerilog. Veamos un primer ejemplo: En este ejemplo sencillo indicamos : Veamos otro ejemplo en el cual en lugar de utilizar la palabra reservada \u00abrand\u00bb utilizamos \u00abrandc\u00ab Podemos observar en el siguiente Laboratorio virtual el diferente comportamiento de usar rand y randc. Tipos de restricci\u00f3n Inside keyword Puede tener una forma bastante simple, como la del siguiente ejemplo Podr\u00eda involucrar a varias variables aleatorizables Implication keyword Implication constraints: Dist keyword Por supuesto, este tipo de restricci\u00f3n se puede combinar con la implicaci\u00f3n Solving order Veamos el siguiente ejemplo: Veamos otro ejemplo: Veamos el funcionamiento en el siguiente laboratorio virtual<\/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-963","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\/963","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=963"}],"version-history":[{"count":26,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/963\/revisions"}],"predecessor-version":[{"id":1899,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/963\/revisions\/1899"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}