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ı:
- Parameter bloğu: modül adı ile port listesi arasında
#( parameter WIDTH = 8 ). Varsayılan değer8, kimse override etmediğinde modülün kullandığıdır. - 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. - 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.