{"id":1673,"date":"2025-08-02T07:23:50","date_gmt":"2025-08-02T07:23:50","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=1673"},"modified":"2025-08-06T17:48:30","modified_gmt":"2025-08-06T17:48:30","slug":"manejo-basico-de-clases","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=1673","title":{"rendered":"Manejo b\u00e1sico de clases 1\u00aa parte"},"content":{"rendered":"\n\n\n<h3 class=\"wp-block-heading\">Clases<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Las clases se pueden declarar en un programa, un m\u00f3dulo o un paquete. Un elemento de una clase puede ser una propiedad (class property) o un m\u00e9todo (class method).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sintaxis:<\/strong> <pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\"> &#x5B; virtual ] class class-name &#x5B; parameter-list ] &#x5B; extends class-type &#x5B; ( argument-list ) ] ] ; { class-item } endclass &#x5B; : class-name ] <\/pre><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejemplo: Una clase para una transacci\u00f3n de bus<\/strong><\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass BusTran;\n\/\/ Propiedades de la clase\nlogic &#x5B;31:0] addr, crc, data&#x5B;8];\n\/\/ M\u00e9todos de la clase\ntask display;\n    $display(&quot;BusTran: addr = %0h&quot;, addr);\nendtask : display\n\nfunction void compute_crc();\n    crc = addr ^ data.xor;\nendfunction : compute_crc;\nendclass : BusTran\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Objetos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Los objetos son instancias de clases que se crean din\u00e1micamente.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\"> BusTran btran; \/\/ Declara un handle nulo (valor null) \n\nbtran = new; \/\/ Crea un objeto BusTran y hace que btran apunte a \u00e9l\n\n \/\/ Inicializa todas las variables del objeto a &#039;X&#039;\n\n <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se puede acceder a las variables y m\u00e9todos del objeto a trav\u00e9s de su nombre: <\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n btran.addr = 32&#039;h127;\n btran.display;\n <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Constructores<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Un constructor es una funci\u00f3n especial <code>new<\/code> que se define dentro de la clase. No tiene tipo de retorno y devuelve un objeto del tipo de la clase.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Constructor sin argumentos:<\/strong><\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass BusTran;\nlogic &#x5B;31:0] addr, crc, data&#x5B;8];\nfunction new;\n    addr = 0;\n    foreach (data&#x5B;i]) data&#x5B;i] = 0;\nendfunction : new\nendclass : BusTran\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Constructor con argumentos:<\/strong><\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass BusTran;\nlogic &#x5B;31:0] addr, crc, data&#x5B;8];\nfunction new (logic &#x5B;31:0] addr = 0, data = 0);\n    this.addr = addr;\n    foreach (this.data&#x5B;i]) this.data&#x5B;i] = data;\nendfunction : new\nendclass : BusTran\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Gesti\u00f3n de la memoria y Copia<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n de memoria<\/strong>: Cada llamada a <code>new<\/code> asigna nueva memoria. Las llamadas sucesivas sobre el mismo handle liberan la memoria anterior. Un objeto se desasigna asignando su handle a <code>null<\/code> o cuando sale de su \u00e1mbito.<\/li>\n\n\n\n<li><strong>Asignaci\u00f3n y Renombrado<\/strong>: No hay que confundir el <strong>handle<\/strong> (la variable que apunta) con el <strong>objeto<\/strong> (la instancia en memoria). Asignar un handle a otro solo renombra el puntero.<\/li>\n\n\n\n<li><strong>Shallow Copy (Copia Superficial)<\/strong>: Copia las variables del objeto, pero si hay objetos anidados, solo copia sus handles. <code>b3 = new b1;<\/code> realiza una copia superficial. Lo veremos con m\u00e1s detalle en la seguna parte dedicada a manejo b\u00e1sico de clases.<\/li>\n\n\n\n<li><strong>Deep Copy (Copia Profunda)<\/strong>: Copia el objeto y, de forma recursiva, todos los objetos anidados. Requiere un m\u00e9todo de copia personalizado. Lo veremos con m\u00e1s detalle en la segunda parte dedicada a manejo b\u00e1sico de clases.<\/li>\n<\/ul>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule testbench;\nBustran btran,btran2;\ninitial\nbegin\nbtran = new;\t\t\/\/ allocates a new BusTran object\nbtran = new;\t \/\/ allocates a second one, frees the first\nbtran2 = new;\t \/\/ allocates a third one\nbtran =null      \/\/frees the second\nend\n\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Variables y M\u00e9todos Est\u00e1ticos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Las variables y m\u00e9todos est\u00e1ticos son compartidos por todas las instancias de una clase. Se puede acceder a ellos sin necesidad de crear un objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Variables Est\u00e1ticas:<\/strong><\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass BusTran;\nstatic int count = 0; \/\/ Variable compartida\nint id;\nfunction new ();\n    id = ++count; \/\/ Cada objeto nuevo incrementa el contador\nendfunction : new\nendclass : BusTran\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos en el siguiente ejemplo c\u00f3mo hacerlo. Destaca la utilizaci\u00f3n recomendada del operador ::<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule testbench;\nBustran btran1,btran2;\ninitial\nbegin\nb1::count=10 \/\/no object creation needed\nbtran1 = new();\t\t\/\/ allocates a new BusTran object, with btran1.id=11\nbtran2 = new btran1;\t \/\/ allocates a second one, with btran2.id=11\nbtran2 =new(33)      \/\/fbtran2.id=12\nend\n\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>M\u00e9todos Est\u00e1ticos:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al igual que las subrutinas regulares, no puede tener acceso a miembros de clase no est\u00e1ticos (variables y m\u00e9todos).<br>Se puede llamar sin creaci\u00f3n de objetos<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass BusTran;\nstatic int count = 0;\nstatic function int next_id ();\n    next_id = ++count;\nendfunction : next_id;\nendclass : BusTran\n\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos ahora su uso. Fij\u00e9monos que ahora los \u00abhandle\u00bb los declarar\u00e9 dentro del bloque initial, con lo cual cuando dicho initial finalice el objeto ser\u00e1 recolectado y dejar\u00e1 de ocupar espacio de memoria<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule testbench;\n\ninitial begin\nBustran b1,b2:\nb1::count=b1:next_id();\n\/\/ Se puede llamar sin crear un objeto\nint next = BusTran::next_id();\nend\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Ocultaci\u00f3n y Encapsulaci\u00f3n de Datos<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>local<\/code>: Un miembro <code>local<\/code> solo es accesible desde m\u00e9todos de la misma clase. No es visible para clases derivadas.<\/li>\n\n\n\n<li><code>protected<\/code>: Un miembro <code>protected<\/code> es como <code>local<\/code>, pero s\u00ed es visible para las clases derivadas.<\/li>\n<\/ul>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass BusTran;\nlocal int id;\nfunction int compare_id (BusTran b);\n    \/\/ Es legal acceder a b.id porque estamos dentro de la misma clase\n    return (this.id == b.id);\nendfunction : compare_id\nendclass : BusTran\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Clases Derivadas y Herencia<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Relaci\u00f3n \u00abIs a\u00bb (Herencia):<\/strong> Una clase puede derivarse de una clase padre, heredando todas sus propiedades y m\u00e9todos.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\n\/\/ Clase padre\nclass BusTran;\nlogic &#x5B;31:0] addr, crc, data&#x5B;8];\nint id;\nendclass : BusTran\n\n\/\/ Clase derivada\nclass PCITran extends BusTran;\nlogic &#x5B;31:0] data; \/\/ Sobrescribe la propiedad de la clase padre\nendclass : PCITran\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Upcasting (Seguro):<\/strong> Asignar un objeto de una clase derivada a un handle de su clase padre.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nBusTran Bus_padre;\nPCITran Bus_hijo;\n\n\/\/ creamos un objeto PCITran\nBus_hijo=new();\n\/\/asignaci\u00f3n legal\nBus_padre=Bus_hijo;\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Downcasting (Verificaci\u00f3n segura):<\/strong> Asignar un handle de clase padre a uno de clase derivada. Requiere el uso de <code>$cast<\/code>.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\"> if ($cast(handle_derivado, handle_base)) \nbegin \/\/ \u00c9xito: $cast verific\u00f3 en tiempo de ejecuci\u00f3n que handle_base \n\/\/ S\u00cd apuntaba a un objeto compatible con MiClaseDerivada. \/\/ Ahora es seguro usar handle_derivado. handle_derivado.metodo_especifico_derivado(); \nend \nelse begin \/\/ Fallo: handle_base no apuntaba a un objeto MiClaseDerivada. \nend <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Clases Las clases se pueden declarar en un programa, un m\u00f3dulo o un paquete. Un elemento de una clase puede ser una propiedad (class property) o un m\u00e9todo (class method). Sintaxis: &#x5B; virtual ] class class-name &#x5B; parameter-list ] &#x5B; extends class-type &#x5B; ( argument-list ) ] ] ; { class-item } endclass &#x5B; : class-name ] Ejemplo: Una clase para una transacci\u00f3n de bus Objetos Los objetos son instancias de clases que se crean din\u00e1micamente. Se puede acceder a las variables y m\u00e9todos del objeto a trav\u00e9s de su nombre: Constructores Un constructor es una funci\u00f3n especial new que se define dentro de la clase. No tiene tipo de retorno y devuelve un objeto del tipo de la clase. Constructor sin argumentos: Constructor con argumentos: Gesti\u00f3n de la memoria y Copia Variables y M\u00e9todos Est\u00e1ticos Las variables y m\u00e9todos est\u00e1ticos son compartidos por todas las instancias de una clase. Se puede acceder a ellos sin necesidad de crear un objeto. Variables Est\u00e1ticas: Veamos en el siguiente ejemplo c\u00f3mo hacerlo. Destaca la utilizaci\u00f3n recomendada del operador :: M\u00e9todos Est\u00e1ticos: Al igual que las subrutinas regulares, no puede tener acceso a miembros de clase no est\u00e1ticos (variables y m\u00e9todos).Se puede llamar sin creaci\u00f3n de objetos Veamos ahora su uso. Fij\u00e9monos que ahora los \u00abhandle\u00bb los declarar\u00e9 dentro del bloque initial, con lo cual cuando dicho initial finalice el objeto ser\u00e1 recolectado y dejar\u00e1 de ocupar espacio de memoria Ocultaci\u00f3n y Encapsulaci\u00f3n de Datos Clases Derivadas y Herencia Relaci\u00f3n \u00abIs a\u00bb (Herencia): Una clase puede derivarse de una clase padre, heredando todas sus propiedades y m\u00e9todos. Upcasting (Seguro): Asignar un objeto de una clase derivada a un handle de su clase padre. Downcasting (Verificaci\u00f3n segura): Asignar un handle de clase padre a uno de clase derivada. Requiere el uso de $cast.<\/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-1673","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\/1673","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=1673"}],"version-history":[{"count":17,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1673\/revisions"}],"predecessor-version":[{"id":1901,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1673\/revisions\/1901"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}