Menguasai Parameter Verilog: Membangun Modul yang Dapat Digunakan Ulang dan Dapat Diskalakan
Parameter adalah konstruk Verilog yang memungkinkan modul untuk digunakan kembali dengan spesifikasi yang berbeda. Misalnya, penambal 4-bit dapat diparameterkan untuk menerima nilai untuk jumlah bit dan nilai parameter baru dapat diteruskan saat instantiasi modul. Jadi, penambal N-bit dapat menjadi penambal 4-bit, 8-bit atau 16-bit. Mereka seperti argumen ke fungsi yang diteruskan saat pemanggilan fungsi.
parameter MSB = 7; // MSB is a parameter with a constant value 7
parameter REAL = 4.5; // REAL holds a real number
parameter FIFO_DEPTH = 256, MAX_WIDTH = 32; // Declares two parameters
parameter [7:0] f_const = 2'b3; // 2 bit value is converted to 8 bits; 8'b3
Parameter pada dasarnya konstanta dan oleh karena itu ilegal untuk mengubah nilainya pada waktu proses. Ilegal untuk mendeklarasikan ulang nama yang sudah digunakan oleh jaringan, variabel atau parameter lain.
Terdapat dua jenis parameter utama, module dan specify dan keduanya menerima spesifikasi rentang. Namun, biasanya dibuat sebesar yang diperlukan untuk menyimpan nilai dan oleh karena itu spesifikasi rentang tidak diperlukan.
Parameter Modul
Parameter modul dapat digunakan untuk mengganti definisi parameter dalam sebuah modul dan ini membuat modul memiliki himpunan parameter yang berbeda pada waktu kompilasi. Parameter dapat dimodifikasi dengan pernyataan defparam atau dalam pernyataan instance modul. Ini adalah praktik umum untuk menggunakan huruf besar dalam nama untuk parameter agar segera terlihat.
Modul yang ditunjukkan di bawah ini menggunakan parameter untuk menentukan lebar bus, lebar data dan kedalaman FIFO dalam desain, dan dapat diganti dengan nilai baru saat modul diinstantiasi atau dengan menggunakan pernyataan defparam.
Dalam gaya baru ANSI deklarasi port Verilog, Anda dapat mendeklarasikan parameter seperti yang ditunjukkan di bawah ini.
module design_ip #(parameter BUS_WIDTH=32, parameter DATA_WIDTH=64) (
input [BUS_WIDTH-1:0] addr,
// Other port declarations
);
Mengganti Parameter
Parameter dapat diganti dengan nilai baru saat instantiasi modul. Bagian pertama membuat instance modul bernama design_ip dengan nama d0 di mana parameter baru diteruskan dalam #( ). Bagian kedua menggunakan konstruk Verilog yang disebut defparam untuk menetapkan nilai parameter baru. Metode pertama adalah cara paling umum untuk meneruskan parameter baru dalam desain RTL. Metode kedua biasanya digunakan dalam simulasi testbench untuk segera memperbarui parameter desain tanpa harus membuat instance ulang modul.
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
Contoh
Modul counter memiliki dua parameter N dan DOWN yang dideklarasikan dengan nilai default 2 dan 0 masing-masing. N mengontrol jumlah bit dalam output yang secara efektif mengontrol lebar counter. Secara default ini adalah counter 2-bit. Parameter DOWN mengontrol apakah counter harus bertambah atau berkurang. Secara default, counter akan berkurang karena parameter diatur ke 0.
Counter 2-bit naik
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)
if (DOWN) out <= out - 1;
else out <= out + 1;
else out <= out;
end
end
endmodule
Modul counter diinstantiasi dengan N sebagai 2 meskipun tidak diperlukan karena nilai default sudah 2. DOWN tidak diteruskan saat instantiasi modul dan oleh karena itu mengambil nilai default 0 sehingga menjadi counter naik.
Lihat bahwa parameter default digunakan untuk mengimplementasikan counter di mana N sama dengan dua sehingga menjadi counter 2-bit dan DOWN sama dengan nol sehingga menjadi counter naik. Output dari counter tidak terhubung di level atas.
Counter 4-bit turun
Dalam hal ini, modul counter diinstantiasi dengan N sebagai 4 sehingga menjadi counter 4-bit. DOWN diberikan nilai 1 saat instantiasi modul dan oleh karena itu counter turun diimplementasikan.
Ini terutama digunakan untuk menyediakan nilai waktu dan penundaan dan dideklarasikan menggunakan kata kunci specparam. Diizinkan untuk digunakan baik dalam blok specify dan badan modul utama.