Verilog'da parametreler sabittir ve kayıt veya net veri türleri gibi başka herhangi bir veri türüne ait değildir.
Sabit bir ifade, sabit bir sayıyı veya önceden tanımlanmış bir parametreyi ifade eder. Çalışma zamanında parametre değerlerini değiştiremeyiz ancak parametre değerini aşağıdaki komutu kullanarak değiştirebiliriz: Defparam ifade.
Defparam ifadesi parametreleri yalnızca derleme zamanında değiştirebilir. Parametre değerleri, modül örneklemesi ile # gecikme spesifikasyonu kullanılarak değiştirilebilir.
İçinde Veri günlüğü Bir modül örneği oluşturma sırasında bir modül parametre değerini geçersiz kılmanın iki yöntemi vardır.
- Defparam anahtar sözcüğünü kullanarak.
- Ve modül örneği parametre değeri ataması.
Defparam anahtar sözcüğünden sonra parametreye ve parametrenin yeni değerine giden hiyerarşik yol belirtilir. Bu yeni değer sabit bir ifade olmalıdır. Sağ taraftaki ifade herhangi bir parametreye başvuruyorsa, defparam'ın çağrıldığı modül içinde bildirilmelidir.
Modül örneği parametre değeri atama yöntemi, geçit örneğine bir gecikme ataması gibi görünür. Bu yöntem, örneklenmiş modüllerin içindeki parametreleri, modülde göründükleri şekliyle geçersiz kılar. Bu format kullanıldığında parametreler atlanamaz.
Sabit ifadeler önceden bildirilmiş parametreleri içerebilir. Daha önce bildirilen parametrelerde değişiklik tespit edildiğinde bu değere bağlı olan tüm parametreler otomatik olarak güncellenir.
4 bitlik bir toplayıcının, bit sayısı için bir değer kabul edecek şekilde parametrelendirilebileceğini ve modül örneklemesi sırasında yeni parametre değerlerinin aktarılabileceğini düşünün. Yani, N bitlik bir toplayıcı, 4 bitlik, 8 bitlik veya 16 bitlik bir toplayıcıya dönüşür. Bunlar, bir işlev çağrısı sırasında iletilen bir işleve yönelik argümanlar gibidir.
parameter MSB = 7; // MSB is a parameter with the constant value 7 parameter REAL = 4.5; // REAL holds the real number parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters parameter [7:0] f_const = 2'b3; // 2 bit value is converted into 8 bits; 8'b3
İki tür parametre vardır; modül Ve belirtmek ve her ikisi de bir aralık spesifikasyonunu kabul eder. Ancak depolanacak değer kadar geniş yapılırlar ve dolayısıyla bir aralık spesifikasyonuna gerek yoktur.
Modül parametreleri
Bir modül içindeki parametre tanımlarını geçersiz kılmak için kullanılabilir ve derleme zamanında modülün farklı bir parametre kümesine sahip olmasını sağlar. Bir parametre şu şekilde değiştirilebilir: Defparam ifade. Parametrelerin anında fark edilmesi için adlarda büyük harf kullanılması yaygındır.
Aşağıdaki modül, tasarım içindeki veri yolu genişliğini, veri genişliğini ve FIFO derinliğini belirlemek için parametreler kullanır ve modül başlatıldığında veya defparam ifadeleri kullanılarak yeni değerlerle geçersiz kılınabilir.
module design_ip ( addr, wdata, write, sel, rdata); parameter BUS_WIDTH = 32, DATA_WIDTH = 64, FIFO_DEPTH = 512; input addr; input wdata; input write; input sel; output rdata; wire [BUS_WIDTH-1:0] addr; wire [DATA_WIDTH-1:0] wdata; reg [DATA_WIDTH-1:0] rdata; reg [7:0] fifo [FIFO_DEPTH]; endmodule
Verilog port bildiriminin yeni ANSI stilinde aşağıdaki gibi parametreleri bildirebiliriz:
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (input [BUS_WIDTH-1:0] addr, // other port declarations );
Geçersiz kılma parametreleri
Modül örneklemesi sırasında parametreler yeni değerlerle geçersiz kılınabilir. İlk bölüm adı verilen modüldür. tasarım_ip # ( ) içerisinde yeni parametrelerin iletildiği d0 adıyla.
İkinci kısım, adı verilen bir Verilog yapısını kullanmaktır. Defparam Yeni parametre değerlerini ayarlamak için. İlk yöntem, RTL tasarımlarında yeni parametreleri geçirmek için yaygın olarak kullanılır. İkinci yöntem ise test tezgahı simülasyonlarında, modülü yeniden başlatmaya gerek kalmadan tasarım parametrelerini hızlı bir şekilde güncellemek için kullanılır.
module tb; // Module instantiation override design_ip #(BUS_WIDTH = 64, DATA_WIDTH = 128) d0 ( [port list]); // Use of defparam to override defparam d0.FIFO_DEPTH = 128; endmodule
Modül sayacının iki parametresi vardır N Ve AŞAĞI 2 ve 0 varsayılan değerine sahip olduğu bildirildi.
N çıktıdaki bit sayısını kontrol ederek sayacın genişliğini etkili bir şekilde kontrol eder. Varsayılan olarak 2 bitlik bir sayaçtır.
Parametre AŞAĞI sayacın artması mı yoksa azalması mı gerektiğini kontrol eder. Parametre 0'a ayarlandığından sayaç azalacaktır.
2 bitlik yukarı sayaç
Java'daki dizelerle karşılaştırın
module counter # ( parameter N = 2, parameter DOWN = 0) (input clk, input rstn, input en, output reg [N-1:0] out); always @ (posedge clk) begin if (!rstn) begin out <= 0; end else begin if (en) (down) out <="out" - 1; + endmodule pre> <p>The module counter is instantiated with <strong> <em>N</em> </strong> as 2 even though it is not required because the default value is anyway 2.</p> <p> <strong> <em>DOWN</em> </strong> is not passed during module instantiation. And it takes the default value of 0 making it an up-counter.</p> <pre> module design_top (input clk, input rstn, input en, output [1:0] out); counter #(.N(2)) u0 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <p>The default parameters are used to implement the counter where <strong> <em>N</em> </strong> equals two, making it a 2-bit counter, and <strong> <em>DOWN</em> </strong> equals zero, making it an up-counter. The output from the counter is left unconnected at the top level.</p> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters.webp" alt="Verilog Parameters"> <p> <strong>4-bit down Counter</strong> </p> <p>In this case, the module counter is instantiated with N as 4 making it a 4-bit counter. DOWN is passed a value of 1 during the module instantiation and hence a down-counter is implemented.</p> <pre> module design_top (input clk, input rstn, input en, output [3:0] out); counter #(.N(4), .DOWN(1)) u1 (.clk(clk), .rstn(rstn), .en(en)); endmodule </pre> <br> <img src="//techcodeview.com/img/verilog-tutorial/47/verilog-parameters-2.webp" alt="Verilog Parameters"> <h3>Specify Parameters</h3> <p>These parameters are used to provide time and delay values and declared using the <strong> <em>specparam</em> </strong> keyword. It is allowed to use both within the specified block and the main module body.</p> <pre> // Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule </pre> <h3>Difference between Specify and Module Parameters</h3> <table class="table"> <tr> <th>Specify parameter</th> <th>Module parameter</th> </tr> <tr> <td>Specify the specparam keyword declares parameter.</td> <td>The module parameter is declared by parameter.</td> </tr> <tr> <td>It can be declared inside a specific block or within the main module.</td> <td>It can only be declared within the main module.</td> </tr> <tr> <td>This parameter may be assigned specparams and parameters.</td> <td>This may not be assigned specparams.</td> </tr> <tr> <td>SDF can be used to override values.</td> <td>Instance declaration parameter values or defparam can be used to override.</td> </tr> </table> <p> <strong>Notes</strong> </p> <p>Here are some important notes for the Verilog parameters, such as:</p> <ul> <li>If we are using the <strong> <em>defparam</em> </strong> statement, we must specify a hierarchical path to the parameter.</li> <li>We cannot skip over a parameter in a <strong> <em>module instance parameter value assignment</em> </strong> . If we need to do this, use the initial value for a not overwritten parameter.</li> <li>When one parameter depends on the other, then the second will automatically be updated if we change the first one.</li> </ul> <hr></=>
Varsayılan parametreler sayacı uygulamak için kullanılır; N ikiye eşittir, bu da onu 2 bitlik bir sayaç yapar ve AŞAĞI sıfıra eşittir, bu da onu bir yukarı sayaç yapar. Sayacın çıkışı üst seviyede bağlantısız bırakılır.
4-bit aşağı sayıcı
Bu durumda modül sayacı N ile 4 olarak başlatılır ve bu onu 4 bitlik bir sayaç yapar. DOWN'a modül başlatma sırasında 1 değeri iletilir ve dolayısıyla bir aşağı sayaç uygulanır.
module design_top (input clk, input rstn, input en, output [3:0] out); counter #(.N(4), .DOWN(1)) u1 (.clk(clk), .rstn(rstn), .en(en)); endmodule
Parametreleri Belirtin
Bu parametreler zaman ve gecikme değerlerini sağlamak için kullanılır ve Spesifikasyon parametresi anahtar kelime. Hem belirtilen blok içerisinde hem de ana modül gövdesi içerisinde kullanılmasına izin verilmektedir.
// Use of specify block Specify specparam t_rise = 200, t_fall = 150; specparam clk_to_q = 70, d_to_q = 100; endspecify // Within main module module my_block ( ); specparam dhold = 2.0; specparam ddly = 1.5; parameter WIDTH = 32; endmodule
Belirleme ve Modül Parametreleri Arasındaki Fark
Parametreyi belirtin | Modül parametresi |
---|---|
Specparam anahtar sözcüğünün bildirdiği parametreyi belirtin. | Modül parametresi parametre tarafından bildirilir. |
Belirli bir bloğun içinde veya ana modül içinde bildirilebilir. | Yalnızca ana modül içerisinde bildirilebilir. |
Bu parametreye spesifik parametreler ve parametreler atanabilir. | Buna spesifik parametreler atanmayabilir. |
SDF, değerleri geçersiz kılmak için kullanılabilir. | Örnek bildirimi parametre değerleri veya defparam geçersiz kılmak için kullanılabilir. |
Notlar
Aşağıda Verilog parametrelerine ilişkin bazı önemli notlar yer almaktadır:
- Eğer kullanıyorsak Defparam ifadesinde, parametreye hiyerarşik bir yol belirtmeliyiz.
- Bir parametreyi atlayamayız modül örneği parametre değeri ataması . Bunu yapmamız gerekirse, üzerine yazılmayan bir parametrenin başlangıç değerini kullanın.
- Bir parametre diğerine bağlı olduğunda, ilkini değiştirirsek ikincisi otomatik olarak güncellenecektir.
=>