在IC和PCB設計的時候,Fanout反映的是輸出的驅動能力和負載之間的關係。設計者要根據輸出的驅動能力和可能的負載的大小計算一個輸出可以掛多少個負載。負載超過驅動能力的範圍會造成信號質量的下降。這個下降一方面表現在信號的變緩,另一方面可能信號的電平達不到標準所需的最低電平。信號變緩意味著信號的有效窗口變小,有可能不能滿足建立時間和保持時間的要求。電平不達標則會造成功能的錯誤。
在FPGA和CPLD的設計中,Fanout更多的是會給時序造成一些負面影響。作為半定製的晶片,FPGA和CPLD內部信號的驅動能力是在出廠的時候就得到保證的。也就是說對FPGA/CPLD的內部信號來說,理論上一個寄存器信號的輸出負載是可以無限大的。負載越多,在FPGA/CPLD布局的時候分布的越分散,同一個輸出到達每個負載的延時差(SKEW)也就越大。就會出現有些路徑的延時超出了我們的期望範圍,而且不可調和。
遇到這種情況,我們可以通過約束的方法設定某個驅動的最大負載。當實際的負載超過這個限制的時候,綜合工具會自動複製驅動寄存器,降低每個輸出的負載數量。這樣在布局布線的時候,工具就有更大的調整空間保證組合邏輯的延時。
對應的語法形式是這樣的:
reg A/* synthesis syn_maxfan=8 */;
可以看到,調整fanout實際上是用面積換速度的一種方式。一般來講,在不確定fanout是timing的關鍵路徑的時候,我們不希望額外佔用邏輯資源。在配置綜合工具的時候,我們可以將全局的fanout設成一個無限大的數,如果發現某個寄存器的fanout成為關鍵路徑的時候再單獨調整。
需要注意的是,fanout約束作用於數據,不是時鐘。在FPGA/CPLD中,時鐘沒有這個問題。