{"id":517,"date":"2020-10-21T15:34:29","date_gmt":"2020-10-21T15:34:29","guid":{"rendered":"http:\/\/dsd.webs.upv.es\/?page_id=517"},"modified":"2025-08-07T09:02:30","modified_gmt":"2025-08-07T09:02:30","slug":"clocking-blocks","status":"publish","type":"page","link":"https:\/\/dsd.webs.upv.es\/?page_id=517","title":{"rendered":"Clocking blocks"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Especifica las caracter\u00edsticas de sincronizaci\u00f3n del dise\u00f1o separ\u00e1ndola de las consideraciones funcionales. Ofrece una forma clara de conducir y muestrear se\u00f1ales. Puede ser declarado en m\u00f3dulos , interface y program Posibilidades<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Especificaci\u00f3n de reloj<\/li>\n\n\n\n<li>Input skew,output skew (que pueden ser omitidos)<\/li>\n\n\n\n<li>Cycle delay (##)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Funcionamiento de clocking blocks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a poner un ejemplo de clocking block insertado dentro de un modulo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: systemverilog; title: ; notranslate\" title=\"\">\nmodule M1(ck, ein, din, dout);\n input         ck,ein;\n input  &#x5B;31:0] din    ;\n output &#x5B;31:0] dout   ;\n clocking sd @(posedge ck);\n   input  #2ns ein,din    ;\n   output #3ns dout;\n endclocking:sd\n default clocking sd;\n logic  sd_ein, ein_reg ;\n logic &#x5B;31:0] din_reg,sd_din_reg, sd_din;\n logic &#x5B;31:0] sd_dout;\n initial begin\n   ##1 sd.dout&lt;=8&#039;h19;\n   ##1 sd.dout&lt;=8&#039;h21;\n end\nassign sd_dout=sd.dout;\nassign sd_din=sd.din;\nassign sd_ein=sd.ein; \nalways @(posedge ck)\n begin\n   sd_din_reg &lt;= sd.din;\n   din_reg &lt;= din; \n   ein_reg&lt;=ein;\n   \n end\nendmodule:M1\n<\/pre><\/div>\n\n\n<h4 class=\"wp-block-heading\">Driver<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Si analizamos la generaci\u00f3n de la secuencia de sd.dout (25=&gt;33) podemos observar el efecto del clocking block en la copia exacta que tenemos en la se\u00f1al dout retrasada un tiempo exactamente igual al skew especificado en la l\u00ednea 8. <\/p>\n\n\n<style>\n       .errordiv { padding:10px; margin:10px; border: 1px solid #555555;color: #000000;background-color: #f8f8f8; width:500px; }#advanced_iframe {visibility:visible;opacity:1;vertical-align:top;}.ai-info-bottom-iframe { position: fixed; z-index: 10000; bottom:0; left: 0; margin: 0px; text-align: center; width: 100%; background-color: #ff9999; padding-left: 5px;padding-bottom: 5px; border-top: 1px solid #aaa } a.ai-bold {font-weight: bold;}#ai-layer-div-advanced_iframe p {height:100%;margin:0;padding:0}<\/style><script type=\"text\/javascript\">var ai_iframe_width_advanced_iframe = 0;var ai_iframe_height_advanced_iframe = 0;function aiReceiveMessageadvanced_iframe(event) {  aiProcessMessage(event,\"advanced_iframe\", \"true\",\"\",\"false\",\"false\");}if (window.addEventListener) {  window.addEventListener(\"message\", aiReceiveMessageadvanced_iframe);} else if (el.attachEvent)  {  el.attachEvent(\"message\", aiReceiveMessageadvanced_iframe);}var aiOnloadScrollTop=\"true\";var aiShowDebug=false;\n\t\tif (typeof aiReadyCallbacks === 'undefined') {\n\t\t\tvar aiReadyCallbacks = [];\n\t\t} else if (!(aiReadyCallbacks instanceof Array)) {\n\t\t\tvar aiReadyCallbacks = [];\n\t\t}    function aiShowIframeId(id_iframe) { jQuery(\"#\"+id_iframe).css(\"visibility\", \"visible\");    }    function aiResizeIframeHeight(height) { aiResizeIframeHeight(height,advanced_iframe); }    function aiResizeIframeHeightId(height,width,id) {aiResizeIframeHeightById(id,height);}<\/script><iframe id=\"advanced_iframe\"  name=\"advanced_iframe\"  src=\"https:\/\/drom.io\/vcd\/?github=ralfgad\/simulaciones_vcd\/main\/clockin1.vcd\"  width=\"100%\"  height=\"300\"  frameborder=\"0\"  border=\"0\"  allowtransparency=\"true\"  loading=\"lazy\"  style=\";border-width: 0px;;border: none;;width:100%;;height:300px;\" ><\/iframe><script type=\"text\/javascript\">var ifrm_advanced_iframe = document.getElementById(\"advanced_iframe\");var hiddenTabsDoneadvanced_iframe = false;\nfunction resizeCallbackadvanced_iframe() {}<\/script><script type=\"text\/javascript\"><\/script><p style=\"display:block !important; visibility:visible !important;margin: -18px 14px 0 0;padding-left: 3px;padding-top:3px;background: white; overflow: hidden; position: relative; line-height:15px;width: fit-content;\"><small style=\"display:block !important;visibility:visible !important\">powered by Advanced iFrame<\/small><\/p>\n\n\n<h4 class=\"wp-block-heading\">Muestreo<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">En cuanto a din (que es generado desde el banco de pruebas) y es introducido en el modulo M1 a trav\u00e9s de un puerto de entrada, podemos ver que sd.din es una copia exacta de din sincronizada por el reloj y que asemeja su comportamiento al que tendr\u00eda una copia registrada de  din mediante una asignaci\u00f3n \u00abnon_blocking\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La \u00fanica forma de ver el efecto del skew se\u00f1alado en la l\u00ednea 7 ser\u00eda si nos fijamos en la se\u00f1al ein. Su comportamiento (que procede tambi\u00e9n del banco de pruebas) se ha programado para que su cambio sea 1 ns antes de cada flanco positivo del reloj de forma que pueda observarse que sd.ein es una copia exacta de ein sincronizada por el reloj; pero  el momento de captura se encuentra 2 ns antes de cada flanco de reloj (su skew en el clocking block).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si alguno tiene dudas sobre este funcionamiento, he preparado el siguiente proyecto de simulaci\u00f3n, en el que se han creado ciertas copias de las se\u00f1ales del clocking block para que pod\u00e1is observarlas en un visualizador VCD. En el caso de realizar esta simulaci\u00f3n en questasim podr\u00e9is referenciar directamente a dichas variables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ser\u00eda conveniente que hag\u00e1is los cambios que cre\u00e1is convenientes para acabar de entender c\u00f3mo funciona el clocking block.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.edaplayground.com\/x\/6uYW\" 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","protected":false},"excerpt":{"rendered":"<p>Especifica las caracter\u00edsticas de sincronizaci\u00f3n del dise\u00f1o separ\u00e1ndola de las consideraciones funcionales. Ofrece una forma clara de conducir y muestrear se\u00f1ales. Puede ser declarado en m\u00f3dulos , interface y program Posibilidades Funcionamiento de clocking blocks Vamos a poner un ejemplo de clocking block insertado dentro de un modulo Driver Si analizamos la generaci\u00f3n de la secuencia de sd.dout (25=&gt;33) podemos observar el efecto del clocking block en la copia exacta que tenemos en la se\u00f1al dout retrasada un tiempo exactamente igual al skew especificado en la l\u00ednea 8. Muestreo En cuanto a din (que es generado desde el banco de pruebas) y es introducido en el modulo M1 a trav\u00e9s de un puerto de entrada, podemos ver que sd.din es una copia exacta de din sincronizada por el reloj y que asemeja su comportamiento al que tendr\u00eda una copia registrada de din mediante una asignaci\u00f3n \u00abnon_blocking\u00bb. La \u00fanica forma de ver el efecto del skew se\u00f1alado en la l\u00ednea 7 ser\u00eda si nos fijamos en la se\u00f1al ein. Su comportamiento (que procede tambi\u00e9n del banco de pruebas) se ha programado para que su cambio sea 1 ns antes de cada flanco positivo del reloj de forma que pueda observarse que sd.ein es una copia exacta de ein sincronizada por el reloj; pero el momento de captura se encuentra 2 ns antes de cada flanco de reloj (su skew en el clocking block). Si alguno tiene dudas sobre este funcionamiento, he preparado el siguiente proyecto de simulaci\u00f3n, en el que se han creado ciertas copias de las se\u00f1ales del clocking block para que pod\u00e1is observarlas en un visualizador VCD. En el caso de realizar esta simulaci\u00f3n en questasim podr\u00e9is referenciar directamente a dichas variables. Ser\u00eda conveniente que hag\u00e1is los cambios que cre\u00e1is convenientes para acabar de entender c\u00f3mo funciona el clocking block.<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":510,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":"","footnotes":""},"class_list":["post-517","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\/517","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=517"}],"version-history":[{"count":12,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/517\/revisions"}],"predecessor-version":[{"id":1865,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/517\/revisions\/1865"}],"up":[{"embeddable":true,"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=\/wp\/v2\/pages\/510"}],"wp:attachment":[{"href":"https:\/\/dsd.webs.upv.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}