{"id":1683,"date":"2025-08-02T10:06:46","date_gmt":"2025-08-02T10:06:46","guid":{"rendered":"https:\/\/dsd.webs.upv.es\/?page_id=1683"},"modified":"2025-08-06T17:49:03","modified_gmt":"2025-08-06T17:49:03","slug":"manejo-basico-de-clases-2a-parte","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=1683","title":{"rendered":"Manejo b\u00e1sico de clases 2\u00aa parte"},"content":{"rendered":"\n\n\n<h3 class=\"wp-block-heading\">Shallow Copy vs. Deep Copy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Shallow Copy (Copia Superficial):<\/strong> Una copia superficial crea un nuevo objeto, pero comparte los sub-objetos. Si se modifica un sub-objeto en la copia, el original tambi\u00e9n cambia.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass Header;\nrand int len; \/\/ Longitud de la cabecera\nfunction new();\nthis.len = $urandom_range(10, 20);\nendfunction\nendclass\n\nclass Packet;\nHeader hdr;   \/\/ Handle a otro objeto\nint    id;\nfunction new();\nthis.id = $urandom_range(1, 5);\nthis.hdr = new(); \/\/ Creamos el objeto cabecera\nendfunction\nendclass\n\nmodule test_shallow;\ninitial begin\nPacket p1 = new();\n$display(&quot;&#x5B;Inicial] p1.id=%0d, p1.hdr.len=%0d&quot;, p1.id, p1.hdr.len);\n\/\/ Creamos una copia superficial de p1\nPacket p2 = new p1;\n$display(&quot;&#x5B;Copia]   p2.id=%0d, p2.hdr.len=%0d&quot;, p2.id, p2.hdr.len);\n\/\/ Modificamos la cabecera e ID a trav\u00e9s de p2\np2.hdr.len = 99;\np2.id=25;\n$display(&quot;&#x5B;Resultado] p2.id=%0d, p2.hdr.len=%0d&quot;, p2.id, p2.hdr.len);\n\/\/ Verificamos p1... \u00a1Ha cambiado tambi\u00e9n la cabecera, no as\u00ed el ID!\n$display(&quot;&#x5B;Resultado] p1.id=%0d, p1.hdr.len=%0d&quot;, p1.id, p1.hdr.len);\nend\nendmodule\n<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/YACm\" 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\"><strong>Deep Copy (Copia Profunda):<\/strong> Una copia profunda crea un nuevo objeto y nuevas instancias de todos sus sub-objetos. Requiere un m\u00e9todo de copia personalizado.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass Header;\nrand int len; \/\/ Longitud de la cabecera\nfunction new();\nthis.len = $urandom_range(10, 20);\nendfunction\nfunction void copy(Header other);\nthis.len = other.len;\nendfunction\nendclass\n\nclass Packet;\nHeader hdr; \/\/ Handle a otro objeto\nint    id;\nfunction new();\nthis.id = $urandom_range(1, 5);\nthis.hdr = new(); \/\/ Creamos el objeto cabecera\nendfunction\n\/\/ Constructor de copia profunda\nfunction void copy(Packet other);\nthis.id = other.id;\nthis.hdr.copy(other.hdr); \/\/ Se copia el objeto\nendfunction\nendclass\n<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/6qg5\" 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\"><strong>Clonado:<\/strong> Es una buena pr\u00e1ctica implementar un m\u00e9todo <code>clone()<\/code> que devuelva una copia del objeto.<\/p>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nclass Packet;\nHeader hdr; \/\/ Handle a otro objeto\nint    id;\nfunction new();\nthis.id = $urandom_range(1, 5);\nthis.hdr = new(); \/\/ Creamos el objeto cabecera\nendfunction\nfunction void copy(Packet other);\n    this.id = other.id;\n    this.hdr.copy(other.hdr); \/\/ Se copia el objeto\nendfunction\n\nfunction Packet clone();\n    clone=new();\n    clone.copy(this); \/\/ Se copia el objeto\nendfunction\nendclass\n\nmodule test_clone;\ninitial begin\nPacket p1 = new();\nPacket p2;\n$display(&quot;&#x5B;Inicial] p1.id=%0d, p1.hdr.len=%0d&quot;, p1.id, p1.hdr.len);\n\/\/ Creamos una copia profunda usando clone\np2 = p1.clone();\n$display(&quot;&#x5B;Copia]   p2.id=%0d, p2.hdr.len=%0d&quot;, p2.id, p2.hdr.len);\n\/\/ Modificamos la cabecera a trav\u00e9s de p2\np2.hdr.len = 99;\n$display(&quot;n&#x5B;Modificado] p2.hdr.len ahora es 99&quot;);\n\/\/ Verificamos p1... \u00a1Permanece intacto!\n$display(&quot;&#x5B;Resultado] p1.id=%0d, p1.hdr.len=%0d&quot;, p1.id, p1.hdr.len);\nend\nendmodule\n<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/ZHqC\" 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<h3 class=\"wp-block-heading\">Uso de packages<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00bfQu\u00e9 es un package?<\/strong>\n<ul class=\"wp-block-list\">\n<li>Un package es un contenedor o espacio de nombres que agrupa definiciones comunes para que puedan ser compartidas f\u00e1cilmente a trav\u00e9s de m\u00faltiples archivos en un entorno de dise\u00f1o o verificaci\u00f3n.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u00bfQu\u00e9 puede contener?<\/strong>\n<ul class=\"wp-block-list\">\n<li>parameter y localparam: Constantes globales.<\/li>\n\n\n\n<li>typedef: Definiciones de tipos de datos personalizados (structs, enums, etc.).<\/li>\n\n\n\n<li>function y task: Rutinas de utilidad reutilizables.<\/li>\n\n\n\n<li>class: Definiciones de clases para la verificaci\u00f3n orientada a objetos (muy usado en UVM).<\/li>\n\n\n\n<li>import: Puede importar definiciones de otros paquetes.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a ver el siguiente ejemplo utilizando packages. Antes de ello supongamos que <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vamos escribiendo las diferentes clases en ficheros systemverilog independientes<\/li>\n\n\n\n<li>Habr\u00e1 relaciones \u00abis a\u00bb y \u00abhas a\u00bb en muchos de ellos. Esto condiciona clar\u00edsimamente el orden en que dichos ficheros deben de ser compilados; pero vamos a realizar una salvaguarda que es la utilizaci\u00f3n de la definici\u00f3n con <strong><em>typedef<\/em><\/strong> de las diferentes clases que vamos utilizando. Eso nos va a permitir incluir esos ficheros systemverilog en cualquier orden.<\/li>\n<\/ul>\n\n\n<pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\npackage definitions_pkg;\ntypedef class Packet;\ntypedef class Header;\n`include \u201cPacket.sv\u201d\n`include \u201cHeader.sv&quot; \nendpackage: definitions_pkg\n\nfunction Packet clone();\n    clone=new();\n    clone.copy(this); \/\/ Se copia el objeto\nendfunction\nendclass\n\nmodule test_clone;\ninitial begin\ndefinitions_pkg::Packet p1 = new();\ndefinitions_pkg::Packet p2;\n$display(&quot;&#x5B;Inicial] p1.id=%0d, p1.hdr.len=%0d&quot;, p1.id, p1.hdr.len);\n\/\/ Creamos una copia profunda usando clone\np2 = p1.clone();\n$display(&quot;&#x5B;Copia]   p2.id=%0d, p2.hdr.len=%0d&quot;, p2.id, p2.hdr.len);\n\/\/ Modificamos la cabecera a trav\u00e9s de p2\np2.hdr.len = 99;\n$display(&quot;n&#x5B;Modificado] p2.hdr.len ahora es 99&quot;);\n\/\/ Verificamos p1... \u00a1Permanece intacto!\n$display(&quot;&#x5B;Resultado] p1.id=%0d, p1.hdr.len=%0d&quot;, p1.id, p1.hdr.len);\nend\nendmodule\n<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/ZKzh\" 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<h3 class=\"wp-block-heading\">Convenciones del Curso<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Deberiamos escribir las clases en ficheros systemverilog independientes.<\/li>\n\n\n\n<li>Incluir como hemos visto dichos ficheros en un package que los agrupe.<\/li>\n\n\n\n<li>Los handles a clases deben denominarse con el sufijo <strong>_h<\/strong>.<\/li>\n\n\n\n<li>Al pasar un handle como argumento en funciones de clase, usar el nombre gen\u00e9rico <strong>rhs_h<\/strong>.<\/li>\n\n\n\n<li>Usar el prefijo <strong>p_<\/strong> o <strong>i_<\/strong> para los argumentos de funciones.<\/li>\n\n\n\n<li>Usar el prefijo <strong>m_<\/strong> para los miembros de una clase.<\/li>\n\n\n\n<li>Usar el sufijo <strong>_t<\/strong> para los <code>typedef<\/code>.<\/li>\n\n\n\n<li>Usar el sufijo <strong>e_<\/strong> para los enumerados.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shallow Copy vs. Deep Copy Shallow Copy (Copia Superficial): Una copia superficial crea un nuevo objeto, pero comparte los sub-objetos. Si se modifica un sub-objeto en la copia, el original tambi\u00e9n cambia. Deep Copy (Copia Profunda): Una copia profunda crea un nuevo objeto y nuevas instancias de todos sus sub-objetos. Requiere un m\u00e9todo de copia personalizado. Clonado: Es una buena pr\u00e1ctica implementar un m\u00e9todo clone() que devuelva una copia del objeto. Uso de packages Vamos a ver el siguiente ejemplo utilizando packages. Antes de ello supongamos que Convenciones del Curso<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":"","footnotes":""},"class_list":["post-1683","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\/1683","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=1683"}],"version-history":[{"count":7,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1683\/revisions"}],"predecessor-version":[{"id":1903,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/1683\/revisions\/1903"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1683"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}