轉自:http://www.eefocus.com/liu1teng/blog/12-02/237897_4533d.html
前一段時間畫了一塊千兆擴展板,板子上有千兆網口和千兆光纖接口,兩種介質可以通過跳線來轉換,板子做好之后進行回環測試時,發現網口會有隨機的丟幀現象,而光口是正常的,一直沒有找到問題根源,后來在做另一個項目里,需要寫MAC的時序約束,發現Xilinx提供的MAC硬對‘RX_CLK’的時序約束要求很高,建立時間只有2.5ns,保持時間0.5ns,無論怎么反復修改這個約束值都無法達到約束要求,最后仔細研究了一下,發現評估板上的PHY芯片,'RX_CLK'這個信號連接在GC_CLK,而我的硬件設計只連接在普通IO口上,在時序約束時,用CLOCK_DEDICETED_ROUTE=FLASE繞過PAR的檢查,這樣就只是將本該接入專用時鍾管腳(或者叫做全局時鍾管腳)的信號,接到了普通IO口上,但並沒有做好如何用普通IO口來引入全局時鍾,Xilinx官方論壇上更是有老外直接指出這只是把一個error變成了warning,並沒有解決真正的問題。作為初學者的我並沒有意識到,什么是‘真正的問題’,直到出現這種丟幀現象之后,才慢慢意識到FPGA並不是我之前想象的那么‘簡單順手’。
現在說說專用時鍾引腳,它的出現具體原因可以說是FPGA自身的實現結構引起的,FPGA實現時,具體的時鍾大概有外部供給FPGA的工作時鍾,由DCM或者PLL產生的時鍾,和FPGA輸入輸出數據的隨路時鍾;再說說FPGA的實現,由於是基於觸發器的設計實現,這就造成了,在布局布線時,同一時鍾域但是布局相隔較遠的同步器件再被相同時鍾觸發時,會有延時,這反映在時鍾的skew(相位傾斜),為了解決這個問題,時鍾樹就出現了,將時鍾的布線成樹形結構,使得到達每一個邏輯單元的時鍾信號同相,這樣就可以實現同步,這就是全局時鍾網絡,GC_CLK。也就是說GC_CLK在FPGA內部是固定的位置,與其對應的引腳也就固定了,這樣的引腳稱為全局時鍾引腳GC_CLK PIN。實際上,綜合器會將扇出的較大的信號當做全局信號,並自動在引腳上加入IBUFG,但是只有全局引腳之后才有IBUFG,所以如果UCF中的時鍾管腳不是用的GC_CLKPIN,PAR就會報錯,反之,當一個信號分配的是GC_CLK PIN,無論是否扇出足夠大,都會加入IBUFG,這也其實是FPGA內部結構造成的,只有全局管腳上有IBUFG,所以只要該信號用了全局管腳,無論是,或不是全局信號,IBUFG都在那里。