Soru:
Bu Verilog RAM değişikliği kaynak kullanımı açısından neden daha iyi?
Hugo Sereno Ferreira
2019-12-24 05:36:22 UTC
view on stackexchange narkive permalink

Lattice HX8K FPGA için kod sentezlemek için Yosys > NextPnr > IcePack açık kaynaklı araç zincirini kullanıyorum. İşte 1Kb RAM'in genel bir sürümü (bir VGA modülü için Video RAM olarak kullanıyorum):

  modül text_ram # (
    parametre A = 10,
    parametre D = 8
  ) (
    giriş clk,
    girdi biz,
    giriş [A-1: 0] adres,
    giriş [D-1: 0] din,
    çıkış reg [D-1: 0] dout
  );

  reg [D-1: 0] vram [0: (1<<A) -1]; // 2 ^ D bitlik bir bellek alanı

  ilk
    $ readmemh ("lib / video.hex", vram, 0, 1024);

  her zaman @ (posedge clk) başla
      eğer (biz) vram [addr] < = din;
      dout < = vram [addr];
  son
son modül
 

Kaynakları icebox_stat ile analiz ettiğimde (sahip olduğum diğer tüm mantığın yanı sıra; üzgünüm, ancak tek bir bileşenin istatistiklerini nasıl izole edeceğimi bilmiyorum), rapor:

  DFF'ler: 21
LUT sayısı: 204
TAŞIMA SAYISI: 26
BRAM'lar: 3
IOB'ler: 4
PLL'ler: 0
GLB sayısı: 3
 

Şimdi, bu basit değişiklikle (verilen, dout 'u farklı kılar, ancak amacım için uygun):

  her zaman @ (posedge clk)
      eğer (biz) vram [addr] < = din;

  her zaman @(*)
      dout < = vram [addr];
 

Raporlar:

  DFF'ler: 21
LUT sayısı: 151
TAŞIMA SAYISI: 26
BRAM'lar: 0
IOB'ler: 4
PLL'ler: 0
GLB sayısı: 1
 

Sadece 53 daha az LUT değil, aynı zamanda gerçekten beni şaşırtan şey BRAM kullanımının gitmiş gibi görünmesi! Lütfen birisi bana nedenini açıklayabilir mi? Ayrıca, Yosys ve NextPnr'ın temel kararlarını anladığımdan emin olmak için bu tür vakaları nasıl inceleyebilirim ?

Iki yanıtlar:
Peter Green
2019-12-24 06:42:55 UTC
view on stackexchange narkive permalink

Joshua'nın dediği gibi, burada açıkça yanlış olan bir şeyler var.Sentez aracı, hafızanızı açıkça optimize etti.

ice40 blokramını hızlı bir şekilde okuduktan sonra, çıktıyı kaydetmiş gibi görünüyor, bu nedenle çıktı kombinasyonunu yapmak, aracı bir blockram yerine çok sayıda yazmaç kullanmaya zorlayacaktır.

Burada biraz spekülasyon yapıyor, ancak readmemh'in yalnızca sentez aracının blockram olarak çıkarsayabildiği şeyler üzerinde işe yarayıp yaramadığını ve "büyük yığın yığınları" üzerinde işe yarayıp yaramadığını merak ediyorum.

Diğer bir olasılık da, bazı girişleri ve / veya çıkışları doğru şekilde bağlamayı unutmuş olmanızdır.Sentez araçlarının yaptığı agresif optimizasyonla, işlevsel bir tasarıma sahip olmadan kaynak kullanımını gerçekten test edemezsiniz.

Aslında doğru yerdesiniz;BRAM çıkarımının kayıtlı çıktıya ihtiyacı var.Çıktı kombinasyonumu yaparak, "$ readmemh" dosyamı bir dizi LUT'a yükledi.Orada çok fazla sıfırım olduğu için, ortaya çıkan LUT'lar aslında BRAM'a erişmek için gereken mantıktan daha düşük hale geldi.Ve benim test tasarımım belleğe gerçekten * yazmaya * çalışmadığı için, temelde bir tür ROM ile sonuçlandım."Lib / video.hex" e daha fazla şey koyduğumda, LUT sayısı çok arttı!Ders öğrenildi...
Şimdi daha fazla ayrıntı verdiniz, önce onu kombinatoryal hale getirdiğiniz için sentez aracı bram yerine yazmaçları kullanmaya zorlandı, sonra yazma etkinliğiniz olmadığı için bu yazmaçlar optimize edilebilir ve sabit değerlerle değiştirilebilir.Daha sonra, verilerinizdeki sıfırlar nedeniyle okuma çokluğu büyük ölçüde optimize edilebilir.Günün sonunda çok az şey kaldı.
İlk ifadenin ve $ readmemh gibi dosya işlemlerinin sentez aracı tarafından değerlendirilmesine şaşırdım.Doğru hatırlarsam, Synopsys Design Compiler (ASIC'ler için) tüm ilk ifadeleri yok sayar.
@Michael Bence bu FPGA ve ASIC hedefleri arasında bir ayrım;FPGA'larda genellikle sentez araçlarının farkında olduğu özel bir küresel sıfırlama hattı bulunurken, AFAIK çoğu ASIC tasarımı, mantıkla birlikte yerleştirilen manuel bir küresel sıfırlama gerektirir.
Joshua de Haan
2019-12-24 06:04:10 UTC
view on stackexchange narkive permalink

Normalde tasarımım kaynaklarda bir düşüş gösteriyorsa, bu aslında bir şeyi dışarıda 'optimize ettiği' anlamına gelir;Aynı şeyin burada da yaşandığından şüpheleniyorum.

Tipik FPGA araç zincirleri, bir çıkış pinini doğrudan veya dolaylı olarak etkilemeyen her şeyi ortadan kaldırır.

Yosys'in ne yaptığını kontrol etmenin en iyi yolu, 'göster' komutunu kullanmak gibi görünüyor: http://www.clifford.at/yosys/files/yosys_appnote_011_design_investigation.pdf



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 4.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...