Menu

Donanım vs Yazılım: Verilog C veya Python'dan Nasıl Farklı Düşünür

Verilog'un yazılım dillerinden sonra neden kafa karıştırıcı hissettirdiği: varsayılan olarak eşzamanlılık, birinci sınıf bir kavram olarak zaman ve sırasıyla çalışmayan ifadeler.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Yazılım Zamanı vs Donanım Zamanı

Bir programda zaman her talimatta bir adım ilerler. CPU satır 1'i bitirir, sonra satır 2'yi çalıştırır. İki şeyin aynı anda olmasını istiyorsan thread, async veya ikinci bir makineye uzanırsın.

Donanımda her şey aynı anda olur. Bir devre sırayla çalışmaz. Adder her zaman topluyordur, multiplexer her zaman seçiyordur, flip-flop her zaman saati izliyordur. Program counter yok. "Mevcut satır" yok.

Verilog'un o dünyayı metinde tanımlaması gerekir. Bunu yapma şekli, bu bölümdeki her karışıklığın kaynağıdır.

İki Eşzamanlılık Katmanı

Bir Verilog modülünü okuduğunda aynı anda iki farklı şeye bakıyorsun:

  1. Devrenin statik tanımı. Wire'lar, register'lar, gate instance'ları, alt modül instance'ları, continuous assignment'lar. Bunların hepsi aynı anda var olur. Dosyadaki sıraları önemli değildir.
  2. Prosedürel bloklar - initial ve always - simülatörün adımladığı küçük programlar gibi görünür. Bunlardan birinin içinde, ifadeler bir tür sırayla çalışır. Ama birkaç always bloğu aynı anda aktif olabilir, her biri kendi simüle edilmiş zaman ipliğinde.
module example(input wire a, input wire b, output wire y, output wire z);
    assign y = a & b;        // her zaman var olur
    assign z = a | b;         // ayrıca her zaman var olur, paralel olarak

    always @(posedge a) begin
        // `a`'nın her yükselen kenarında uyanan
        // ayrı bir "her zaman açık" reaktör
    end
endmodule

İki assign satırı bir dizi değildir. Sentez aracının yan yana yerleştirebileceği iki kombinasyonel mantık parçasını tanımlar. always bloğu paralel olarak gerçekleşen üçüncü bir şeydir.

"Sinyal" Ne Anlama Gelir

Yazılımda bir değişken, değiştirene kadar bir değeri tutar. Verilog'da bir sinyal bir değeri sürekli olarak tutar - ve her anda onu sürenden ne ise ona bağlıdır.

Bir wire dışarıdan sürülür (bir assign, bir alt modülün çıkış portu, bir inout bağlantısı). Bir reg bir prosedürel bloktan sürülür. İkisinin de her zaman bir değeri vardır. C'nin kastettiği gibi "initialize edilmemiş" diye bir şey yoktur - sinyaller ya tanımlı bir değere sürülür, ya özel bilinmeyen x'e ya da yüksek empedans z'ye. Son ikisini X ve Z Değerleri bölümünde kapsayacağız.

Saatler Her Şeyi Değiştirir

Bir saat getirdiğinde, zaman önem kazanmaya başlar. Bir flip-flop, bir saatin yükselen (veya düşen) kenarında giriş değerini yakalayan ve bir sonraki kenara kadar tutan küçük bir donanım parçasıdır. Counter'lar, state machine'ler, pipeline'lar - bellek'i olan her şeyi kurmana izin veren şey saattir.

q = d yerine q <= d'ye dikkat et. Bu bir non-blocking atama'dır - saatli mantığın iş atı. "Bir sonraki saat kenarında, q'nun d'nin şu an ne ise o olmasını planla" der. Kurallarına Blocking vs Non-blocking bölümünde gireceğiz; şimdilik, atamanın bir yazılım ifadesi gibi davranmaya çalışmadığını tanı.

RTL: Register Transfer Mental Modeli

Sentezlenebilir Verilog'un çoğu Register Transfer Level veya RTL adı verilen bir stilde yazılır. Fikir basit:

  • Devrenin neye ihtiyacı olduğuna karar ver (register'lar).
  • Her register için, iki şeyi tanımla: onu neyin resetlediğini ve onun sonraki değerini hesaplayan kombinasyonel mantık.
  • Kombinasyonel mantık çıkışlarını register girişlerine bağla ve çalışan bir devre elde et.
always @(posedge clk) begin
    if (reset) state <= IDLE;
    else       state <= next_state;
end

always @(*) begin
    case (state)
        IDLE:   next_state = start ? RUNNING : IDLE;
        RUNNING: next_state = done  ? IDLE    : RUNNING;
        default: next_state = IDLE;
    endcase
end

Bu iki durumlu bir makine. İlk always bloğu saatli - bir flip-flop. İkincisi tamamen kombinasyonel - sadece bir denklem. Yazacağın hemen hemen her state machine, counter ve pipeline bu şekli takip eder.

Seni Takılıp Bırakan Alışkanlıklar

Yazılımdan geliyorsan, bırakman gereken kısa bir alışkanlık listesi:

  • "Değişkenler atadığımda güncellenir." Bir saat kenarında değil - bir non-blocking atama, güncellemeyi zaman adımının sonuna planlar.
  • "İfadeler yukarıdan aşağıya yürütülür." Prosedürel bloklar dışında, hayır. Saatli bir bloğun içinde, bir tür - ama blocking vs non-blocking "sırayla"nın gerçekten ne anlama geldiğini değiştirir.
  • "İhtiyacım olduğunda bunu allocate edeceğim." Donanım allocate etmez. Her register ve gate sentez zamanında var olmalıdır. Her vektörün boyutu sabittir.
  • "Bu döngü hızlı - sadece bir işlem." Sentezlenebilir Verilog'da bir for döngüsü paralel donanıma açılır. 64 iterasyonlu bir döngü 64 kez çalışan bir CPU talimatı değil, gövdenin 64 kopyası olur.

Bir program yazmayı öğrenmiyorsun. Bir devre tanımlamayı öğreniyorsun. Yukarıdan aşağıya okuma içgüdüsü tam olarak yanlış olanıdır ve onu yeniden eğitmek bir süre alır.

Sırada Ne Var

Bir sonraki doc'lar yerel bir toolchain alma (isteğe bağlı - browser editörü iyidir), sonra sıfırdan ilk modülünü yazmayı gözden geçirir. Donanım vs yazılım karşıtlığına garip bir şey göründüğünde her seferinde geri döneceğiz, çünkü "garip" kısımlarının çoğu aynı kök nedene sahiptir: bu yazılım değil.

Sıkça Sorulan Sorular

Verilog terimleriyle donanım ile yazılım arasındaki fark nedir?

Yazılım, bir CPU tarafından birbiri ardına yürütülen bir dizi talimattır. Donanım - Verilog'un tanımladığı şey - aynı anda sinyaller taşıyan bir kapı ve wire ağıdır. Bir Verilog dosyası o ağı tanımlar. Simülatör paralel davranışı taklit eder; bir sentez aracı onu gerçek silikona dönüştürür.

Verilog kodu C gibi yukarıdan aşağıya mı çalışır?

Hayır - ve böyle davranmak en yaygın başlangıç hatasıdır. Üst seviye ifadeler (assign'lar, modül instance'ları, always blokları) hepsi aynı anda 'var olur'. Yalnızca prosedürel blokların içinde - initial ve always - sıralı yürütmeye benzer bir şey olur ve orada bile non-blocking atamalar yanılsamayı kırar.

Verilog'da 'concurrent' ne demek?

Birden çok ifadenin aynı anda çalışan bir devrenin parçalarını tanımladığı anlamına gelir. Aynı modülde iki assign ifadesi 'satır 1 sonra satır 2' değildir - paralel çalışan, sürekli olarak girişlerine tepki veren iki donanım parçasıdır.

RTL tasarımı nedir?

RTL, Register Transfer Level anlamına gelir. Devreyi register'lar (flip-flop'lar) ve sonraki değerlerini hesaplayan kombinasyonel mantık olarak tanımladığın bir Verilog yazma stilidir. Sentezlenebilir Verilog'un çoğu RTL'dir. Yukarıdaki seviye davranışsaldır; aşağıdaki seviye gate-level'dir.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA