Menu

Verilog Parameters: Modülleri Konfigüre Edilebilir Yapma

Derleme zamanı sabitleri tanımlamak, genişlikleri ve derinlikleri parametrelemek ve bir modülü instantiate ettiğinde değerleri override etmek için parameter ve localparam nasıl kullanılır.

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

Bir Twist'li Sabitler

Bir parameter bir sabittir - derleyici değerini seçer ve simülasyon başlamadan önce tasarıma pişirir. Twist, onu instantiate edenin değeri değiştirebilmesidir. Aynı modül kaynağı dosyası, çağıranların onu nasıl parametrelendirdiğine bağlı olarak farklı boyutlarda devreler üretebilir.

Yeniden kullanılabilir IP'yi böyle kurarsın. WIDTH ve DEPTH parametrelerine sahip bir FIFO modülü bir şirketteki her takımı destekleyebilir. WIDTH parametresine sahip bir counter, 16'ya veya 4 milyara saysın aynı kaynaktır.

Temel Parameter Tanımı

Üç yeni sözdizimi parçası:

  1. Parameter bloğu: modül adı ile port listesi arasında #( parameter WIDTH = 8 ). Varsayılan değer 8, kimse override etmediğinde modülün kullandığıdır.
  2. Kullanım yeri: output reg [WIDTH-1:0] count. Parametre sadece bir sabittir - onu bit aralığına takarız. Aynı modül kaynağı WIDTH'e bağlı olarak 8 bitlik veya 16 bitlik bir çıkış üretir.
  3. Override sözdizimi: instantiation zamanında counter #(.WIDTH(16)) dut16(...). #(...) bloğu instance adından önce, modül adından sonra gelir. Bahsetmediğin parametreler varsayılanlarını korur.

localparam: Dahili Sabitler

Çağıranların override etmesini istemediğin sabitler vardır. State encoding'leri klasik örnektir:

localparam, IDLE, RUNNING, DONE'u modülün içinde kullanılabilir yapar ama instantiation'dan override edilemez. Bu doğru seçimdir - modül dışından hangi state değerinin IDLE anlamına geldiğini değiştirmek korkutucu olurdu.

Çağıranların konfigüre etmesi gereken şeyler için (genişlikler, derinlikler, davranış seçenekleri) parameter ve diğer her şey için localparam kullan. Yaygın bir kalıp, parameter'lardan localparam'lar türetmektir:

parameter WIDTH = 32;
localparam WIDTH_M1 = WIDTH - 1;   // bir kez hesaplandı; override edilemez

Pratikte Parametrelenmiş Genişlikler

Parametrelerin en yaygın kullanımı bus genişliklerini esnek hale getirmektir. İşte herhangi bir genişlikte çalışan bir adder:

Bir kaynak dosya, iki instance, iki farklı genişlik, kopyala-yapıştır yok. Parametrelerin tüm getirisi budur.

Birden Çok Parametre, Adlandırılmış Override

Daha büyük modüller için genellikle birkaç parametren olur. Onları herhangi bir sırada adlandırarak override et:

module fifo #(
    parameter WIDTH = 8,
    parameter DEPTH = 16,
    parameter AFULL = DEPTH - 2
)(
    input  wire             clk,
    input  wire             reset,
    // ... portlar ...
);
    // ...
endmodule

// Çağrı sitesinde:
fifo #(.WIDTH(32), .DEPTH(1024)) cmd_queue (.clk(clk), .reset(reset), ...);

Her parametreyi override etmek zorunda değilsin; belirtilmeyenler varsayılanlarını korur. Örnekteki AFULL varsayılanı DEPTH'ten hesaplanır, bu da eğer DEPTH'i override edersen, AFULL'un otomatik olarak takip ettiği anlamına gelir - eğer çağıranların AFULL'u bağımsız olarak override edebilmesini istemiyorsan localparam'ın da ele alacağı türden bir bağımlılık.

Yaygın Hatalar

Override'da #'i unutmak. counter (.WIDTH(16)) dut(...) bir override gibi görünür ama Verilog (.WIDTH(16))'ı bir port bağlantısı olarak okur. counter #(.WIDTH(16)) dut(...) gerekir.

Parametreleri yeterince sabit olmadıkları yerde kullanmak. Parametreler elaboration zamanında, herhangi bir sinyal var olmadan önce çözülür. Çalışma zamanı bir sinyali üzerinde parametre yapamazsın - değer simülasyon zamanında bir input'un yaptığına bağlıysa, o parametre değil, mantıktır.

Port listelerinde parameter ve localparam'ı karıştırmak. Yalnızca parameter üstteki #(...) bloğuna girer. localparam gövdenin içinde yaşar. Bunları takas ederken derleyici sana söyleyecektir.

Sırada Ne Var

Artık boyutu derleme zamanında ayarlanan modüller yapabilirsin. Sonraki iki doc, literal sabitlerin (8'h1F, 4'b1010, 32'd100) yazma kurallarını ve sinyaller sürülmediğinde veya çekiştiğinde ortaya çıkan x ve z değerlerini kapsar. Ondan sonra operatörlere geçiyoruz - şimdiye kadar gördüğün vektörler ve parametrelerle yapabileceğin her şey.

Sıkça Sorulan Sorular

Verilog'da parameter nedir?

Bir parameter, modülün içinde tanımlanan bir derleme zamanı sabitidir. Bir sabitin izin verildiği herhangi bir yerde kullanılabilir - bus genişlikleri, memory derinlikleri, state encoding'leri, varsayılan değerler. Kritik olarak, modülün her instance'ı parameter'ı override edebilir, böylece aynı kaynak dosya bir yerde 8 bitlik bir counter, başka bir yerde 32 bitlik bir counter üretebilir.

Verilog'da parameter ile localparam arasındaki fark nedir?

parameter değerleri, modül instantiate edildiğinde dışarıdan override edilebilir. localparam değerleri override edilemez - yalnızca dahili sabitlerdir. Modül yazarının çağıranların müdahale etmesini istemediği state encoding'leri ve türetilmiş sabitler için localparam kullan.

Verilog'da bir parameter nasıl override edilir?

Modülü instantiate ettiğinde, instance adından önce bir parameter override bloğu ekle: counter #(.WIDTH(16)) my_inst (.clk(clk), .count(count));. .WIDTH(16) sözdizimi o belirli parametreyi ayarlar; listelemediğin parametreler varsayılanlarını korur. Birden çok override #(...) içinde virgüllerle ayrılır.

Parametrelenmiş bir modül nedir?

Çağıranların override edebileceği bir veya daha fazla parameter tanımlamasını açığa çıkaran bir modül. Parametrelenmiş bir FIFO, WIDTH ve DEPTH parametrelerine sahip olabilir, böylece aynı kaynak bir yerde 32 bit x 16 derinliğinde bir FIFO ve başka bir yerde 8 bit x 1024 derinliğinde bir FIFO üretir. Yeniden kullanılabilir IP blok kütüphaneleri böyle yazılır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA