Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

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.

// Verilog 1995 style port declaration
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];
  // Design code goes here ...
endmodule

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.

module design_top (
  input clk,
  input rstn,
  input en,
  output [1:0] out
);
  counter #(.N(2)) u0 (
    .clk(clk),
    .rstn(rstn),
    .en(en)
  );
endmodule

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.

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

Parameter Specify

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.

// 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

Perbedaan antara specify dan module parameters

Specify parameterModule parameter
Dideklarasikan oleh specparamDideklarasikan oleh parameter
Dapat dideklarasikan dalam blok specify atau dalam badan modul utamaDapat hanya dideklarasikan dalam badan modul utama
Dapat ditugaskan specparams dan parametersTidak dapat ditugaskan specparams
SDF dapat digunakan untuk mengganti nilaiNilai parameter deklarasi instance atau defparam dapat digunakan untuk mengganti

Verilog

  1. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  2. Menguasai Konkatenasi Verilog: Panduan Praktis
  3. Dasar-dasar Verilog: Ringkasan Ringkas
  4. Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
  5. Perbedaan Kunci Penugasan Blokir dan Non-Blokir Verilog
  6. Menguasai Fungsi Verilog untuk Desain RTL yang Efisien
  7. Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan
  8. Menguasai Ruang Lingkup Referensi Hierarkis Verilog: Hindari Tabrakan Nama dalam Modul dan Blok
  9. Generator Jam Verilog: Panduan Desain dan Implementasi
  10. Menguasai Fungsi Matematika Verilog untuk Desain Perangkat Keras yang Efisien