FPGA Donanım Kaynakları: LUT, Flip-Flop, BRAM, DSP, Saat Dağıtımı ve Yönlendirme
FPGA Donanım Kaynakları: LUT, Flip-Flop, BRAM, DSP, Saat Dağıtımı ve Yönlendirme
Geçen sefer FPGA’lerin neden önemli olduğundan konuştuk işe göre kendini yeniden şekillendiren esnek donanım. Bu sefer dokuyu açıp o esnekliğin gerçekte neyden yapıldığına bakıyoruz. Tanıtım diyagramlarını bir kenara bırakırsanız, her FPGA aynı altı tür kaynaktan kurulur; hepsi tek bir yonga üzerinde birbirine bağlanmış haldedir.
LUT: programlanabilir mantık
LUT (Look-Up Table Arama Tablosu), yonga üzerindeki en küçük karar verme birimidir: yeniden programlayabildiğiniz küçücük bir doğruluk tablosu. Ona birkaç giriş verin; bu girişlerin her kombinasyonu için LUT’ta, çıkışın ne olması gerektiğini söyleyen bir bitlik bellek bulunur. Bu bellek bitlerini bir kez ayarlarsınız yonga bitstream’ini yüklerken ve o andan sonra LUT, siz yeniden yapılandırana kadar tam olarak sabit bir mantık kapısı gibi davranır: AND, OR, XOR ya da başka herhangi bir şey. Mimariye bağlı olarak bir LUT’un 1 ile yaklaşık 8 arasında girişi olabilir; modern FPGA’lerin çoğu, bir LUT’un ne kadar mantığı içine alabildiği ile ne kadar silikona mal olduğu arasındaki en verimli nokta olarak 4–6 girişli LUT’larda karar kılar.
Her biri bağımsız olarak programlanmış binlerce böyle küçük doğruluk tablosu, aynı yonganın bir gün sayıcı, ertesi gün filtre olmasını sağlayan şeydir.
Flip-flop’lar: dokunun belleği
LUT karar verir; flip-flop hatırlar. Her flip-flop tek bir bit tutar ve bunu yalnızca bir saat kenarında günceller; bir yığın birleşimsel mantığı pipeline’a, sayıcıya ya da durum makinesine dönüştüren de tam olarak budur. Flip-flop’lar doğrudan LUT’ların yanında yer alır çoğu mimaride her LUT çıkışının kullanabileceği bir ya da iki flip-flop vardır, çünkü gerçek bir tasarımdaki hemen her LUT bir flip-flop besler.
Flip-flop’lar aynı zamanda zamanlama analizinin var olma sebebidir. Aracın kontrol ettiği her yol bir flip-flop’tan başlar, birkaç LUT ve yönlendirmenin içinden geçer ve bir sonraki flip-flop’a girer; saat periyodunun da bu yolların en yavaşına yetecek kadar uzun olması gerekir. Flip-flop eklemek her yolu kısaltır: donanımda pipeline’lamanın anlamı tam olarak bu.
BRAM ve DSP: iki sabit devreli iş atı
LUT’lar esnektir, ama esnekliğin bir bedeli var: büyük bellekleri veya hızlı çarpıcıları yalnızca LUT’lardan kurmak yavaştır ve dokunun çok büyük bir kısmını yer. Bu yüzden her FPGA, dokunun içine serpiştirilmiş, amaca özel üretilmiş iki tür sabit devreli blokla da gelir.
BRAM (Blok RAM), yonganın içine gömülmüş, kendi kendine yeten bir bellek dizisidir ona bir adres verin, bir sonraki saat kenarında oradaki veriyi geri verir ya da saklar. Tek bir BRAM örneği mimariye göre genellikle 18 ile 36 kilobit civarında veri tutar ve bu bitleri tasarımınızın istediği genişlikte düzenler: geniş ve sığ, ya da dar ve derin. Tamponlar, FIFO’lar, arama tabloları ve önbellekler tek bir LUT harcanmadan bundan kurulur.
DSP dilimleri, sabit devreli çarp-topla-biriktir birimleridir. Bu matematiği genel amaçlı mantıktan kurmak ki bu hem daha yavaş hem de alan bakımından çok daha pahalı olurdu yerine bir tasarım doğrudan bu hazır bloklardan birini kullanır. Tek bir DSP dilimi, oldukça geniş iki operandı çarpabilir yaygın olarak giriş başına 18 ile 27 bit aralığında ve sonucu tek bir saat çevriminde biriktirebilir; aynı çarpmayı sıfırdan kurmanın LUT maliyetinin çok küçük bir kısmına. FPGA’lerin filtrelerde, FFT’lerde ve makine öğrenmesi çıkarımında bu kadar iyi olmasının sebebi bu: işin matematik ağırlıklı kısmı tam olarak o iş için üretilmiş silikonda çalışır.
Saat dağıtımı ve yönlendirme: her şeyi birbirine bağlayan iki ağ
Mantık, bellek ve matematik blokları tek başlarına işe yaramaz. Bunların birlikte çalışmasını sağlamak için yonganın tamamına iki ağ daha nüfuz eder: biri saati taşır, diğeri geri kalan her şeyi.
Saat dağıtımı bir PLL veya MMCM’de başlar; bu blok bir giriş saatini alıp tasarımın gerçekten ihtiyaç duyduğu tam frekansları üretir. Oradan itibaren dikkatle dengelenmiş bir ağaç, bu saati yonga üzerindeki her register’a dağıtır ki hepsi (neredeyse) tam olarak aynı anda güncellensin. Şu “neredeyse” önemli saatin farklı register’lara varış zamanları arasındaki küçücük fark skew (saat kayması) olarak adlandırılır ve bunun fazlası, bir tasarımın hedeflediği hıza ulaşamamasının en yaygın sebeplerinden biridir.
Yönlendirme ise genel amaçlı kablolamadır: her kesişimde anahtar kutuları bulunan, programlanabilir tel parçalarından oluşan yoğun bir ağ. Bir bloğun çıkışını başka bir bloğun girişine bağlamak için yerleştirme-yönlendirme aracı bu ağın içinden bir yol bulur ve yol boyunca her anahtar kutusunu yapılandırır. Daha uzun ve daha sıkışık yollar daha yavaştır tasarımınızın bloklarının yonga üzerinde nereye düştüğünün performansı mantığın kendisi kadar etkilemesinin sebebi de bu.
Kısa Özet
| Resource | What it does |
|---|---|
| LUT | Computes a small, reprogrammable logic function |
| Flip-flop | Holds one bit of state, updating on a clock edge |
| BRAM | Stores data on-chip as addressable memory |
| DSP | Hard-wired multiply-add-accumulate math |
| Clocking | Distributes a synchronized timing signal to every register |
| Routing | Programmable wiring connecting every other resource |
Her FPGA tasarımı, ne kadar karmaşık olursa olsun, sonunda bu altı şeyin bir bileşimine indirgenir. Bir dahaki sefere bir kullanım raporunu açıp LUT sayısını, flip-flop sayısını, BRAM sayısını, DSP sayısını ve bir zamanlama özetini gördüğünüzde neyin sayıldığını ve bunun neden önemli olduğunu tam olarak bileceksiniz.
Bu altısı dokunun kendisidir, ama yonga üzerindeki her şey değildir. Kenarlarda fiziksel pinleri süren I/O bankaları, daha büyük parçalarda ise PCIe ve Ethernet gibi protokoller için yüksek hızlı seri alıcı-vericiler bulunur. SoC cihazlar bir adım daha ileri gider ve sabit PCIe ile bellek denetleyicilerini ve tam ARM işlemci çekirdeklerini dokuyla aynı silikon parçasının üzerine yerleştirir.
Bir Kat Daha Derin: Parçalanma
Bütün bunların altında, bu kaynakları ilk bakışta göründüklerinden bile daha esnek yapan bir numara var: parçalanma (fracturing). Bir LUT, DSP veya BRAM’in yalnızca tek bir büyük sabit blok olarak kullanılabilmesi yerine, birçok FPGA mimarisi tek bir büyük primitifin tasarımınız tek bir büyük parça yerine daha fazla küçük parçaya ihtiyaç duyduğunda iki veya daha fazla küçük ve bağımsız kaynağa bölünmesine, yani “parçalanmasına” izin verir. Bu, halihazırda konuştuğumuz yeniden yapılandırılabilirliğin üzerine oturan ekstra bir katmandır ve FPGA kullanım sayılarının basit bir kaynak sayımından daha nüanslı olmasının büyük bir sebebidir.
Parçalanabilir bir LUT tipik olarak, ya tek bir geniş fonksiyon olarak çalışabilen ya da her biri daha az girişli iki küçük ve bağımsız fonksiyona bölünebilen daha büyük bir arama tablosu olarak kurulur yeter ki bu fonksiyonlar aynı giriş pinlerinin bir kısmını paylaşsın. Hangi modun kullanılacağına, mantığınızı hangisi daha verimli paketliyorsa ona göre, sentez aracı otomatik olarak karar verir.
DSP dilimleri de parçalanabilir. Tek bir geniş, yüksek hassasiyetli çarpma için tasarlanmış büyük bir DSP bloğu, çoğu zaman bunun yerine paralel olarak birkaç küçük, daha düşük hassasiyetli çarpma yapacak şekilde yeniden yapılandırılabilir bu da özellikle düşük hassasiyetli AI çıkarımı gibi, birkaç geniş çarpma-biriktirme işleminden çok sayıda dar işlemin daha önemli olduğu yükler için değerlidir. (Kesin bölünme biçimi üreticiye ve DSP nesline göre değişir; net sayılar için daima kendi mimarinizin dokümantasyonuna bakın.)
BRAM de benzer şekilde parçalanabilir örneğin daha büyük bir bellek bloğu, bir tasarım tek bir büyük bitişik alan yerine daha fazla bağımsız bellek portuna ihtiyaç duyduğunda, her biri kendi adres ve veri portlarına sahip iki küçük ve bağımsız belleğe bölünebilir. (Uyarı: BRAM parçalanmasının ayrıntıları üreticiye ve aileye göre epeyce değişir, dolayısıyla bunu belirli bir sayı değil genel fikir olarak alın.)
Üç örneğin de altındaki desen, FPGA mimarisinde tekrar tekrar göreceğiniz desenle aynı: büyük ve yetenekli bir blok, tasarım büyüğünden bir tane yerine küçüğünden daha fazlasını gerektirdiğinde parçalanıp birkaç küçük ve bağımsız bloğa ayrılabilecek şekilde tasarlanır. Etkisi boyutunu fazlasıyla aşan küçük bir mimari fikir yonga üzerindeki sabit sayıda fiziksel primitifin, katı ve tek boyutlu bir kaynağın hizmet edebileceğinden çok daha geniş bir tasarım yelpazesine hizmet etmesini sağlıyor.
Neden RunX
Bu yazıdaki her kaynak, bir aracın sizin için sayacağı bir şey. Bir kullanım raporunu bu kadar kolay optimize edilebilir kılan da bu birkaç LUT kırpın, bir modu budayın, farkı kutlayın ve onu hedefle karıştırmayı bu kadar kolaylaştıran da.
Biz kullanım oranı için optimize etmiyoruz. Bir sonraki gereksinim değişikliğinden sağ çıkacak pay için optimize ediyoruz. Bu farklı bir tasarım kararı ve genellikle farklı bir mimari: bugün LUT sayısında kazanan yapı, çoğu zaman spesifikasyon kaydığında baştan yazılan yapı oluyor daha geniş bir yük, bir mod fazlası, ikinci bir saat alanı. Yalnızca tek bir yapılandırmada var olan pay, hiçbir zaman pay değildi.
Parçalanmayla aynı fikir, bir kat yukarısı. Kaynaklar yeniden şekillendirilebilecek şekilde tasarlanmış üzerlerine kurduğumuz her şey de öyle.