Tutorial Array Verilog: Dari Asas hingga Teknik SystemVerilog Lanjutan

目次

1. Pengenalan

Verilog banyak digunakan sebagai bahasa penerangan perkakasan (HDL) dan tidak dapat dipisahkan dalam reka bentuk litar untuk pembangunan FPGA dan ASIC. Untuk mereka bentuk dengan cekap menggunakan Verilog, pemahaman yang kukuh tentang array adalah penting. Dengan memanfaatkan array, anda dapat mengurus koleksi data secara ringkas dan intuitif, yang meningkatkan kebolehbacaan serta kebolehselenggaraan penerangan litar anda. Array amat berkesan apabila mengelompokkan pelbagai isyarat atau mewakili struktur memori seperti RAM. Artikel ini memfokuskan pada kata kunci “Verilog arrays” dan menyediakan penjelasan menyeluruh dari asas definisi array hingga teknik aplikasi praktikal. Kami akan membincangkan jenis-jenis array, penambahbaikan SystemVerilog, ralat biasa, dan Soalan Lazim untuk membantu memperdalam pemahaman anda. Walaupun pemula sekalipun akan mendapati panduan ini mudah diikuti, kerana kami menyertakan contoh kod praktikal di seluruh artikel. Teruskan membaca hingga akhir untuk gambaran keseluruhan yang lengkap.

2. Jenis Data Asas dalam Verilog

Sebelum bekerja dengan array dalam Verilog, penting untuk memahami jenis data asas. Verilog menyediakan beberapa jenis data utama untuk mengendalikan isyarat logik yang digunakan dalam reka bentuk litar.

Perbezaan Antara reg dan wire

Jenis data yang paling kerap digunakan dalam Verilog ialah “reg” (daftar) dan “wire”. Kedua‑duanya mesti digunakan dengan betul mengikut kelakuan isyarat logik.
  • jenis wire Wire digunakan sebagai garisan sambungan antara modul atau litar. Ia mesti sentiasa dipacu oleh isyarat lain, dan penetapan dibuat menggunakan pernyataan assign. Sesuai untuk output litar kombinasi. Contoh:
  wire a;
  assign a = b & c;
  • jenis reg Reg digunakan sebagai pembolehubah untuk menyimpan nilai sementara. Ia ditetapkan di dalam blok proses seperti always, dan biasanya digunakan untuk memodelkan elemen penyimpanan (latch atau flip‑flop). Contoh:
  reg q;
  always @(posedge clk) begin
      q <= d;
  end

Jenis Data yang Boleh Digunakan dalam Array

Dalam Verilog, array biasanya didefinisikan menggunakan jenis reg, walaupun array wire juga boleh digunakan dalam beberapa kes. Walau bagaimanapun, versi Verilog yang lebih lama tidak menyokong array berdimensi pelbagai. Kekangan ini telah diperbaiki secara signifikan dalam SystemVerilog. Berikut ialah contoh ringkas sintaks array:
reg [7:0] data_array [0:15];  // An array storing 16 elements, each 8 bits wide
Dengan memahami asas jenis data, anda dapat mengelakkan kekeliruan semasa mengisytiharkan dan menggunakan array. Penyalahgunaan reg dan wire boleh menyebabkan ralat simulasi atau sintesis, jadi berhati‑hatilah.

3. Konsep Asas Array

Dalam Verilog, array digunakan apabila anda ingin menguruskan pelbagai isyarat dengan jenis yang sama secara kolektif. Array memudahkan pengorganisasian isyarat, meningkatkan kebolehbacaan kod serta kebolehguna semula.

Mengisytiharkan Array

Verilog pada dasarnya menyokong array satu dimensi. Sintaksnya ialah seperti berikut:
reg [bit-width] array_name [index-range];
Contoh:
reg [7:0] data_array [0:15];  // An array of 16 elements, each storing 8-bit data
Dalam contoh ini, data_array mempunyai 16 elemen yang diindeks dari 0 hingga 15, dengan setiap elemen menyimpan nilai 8‑bit (1 bait).

Mengakses Elemen Array

Anda boleh mengakses setiap elemen array dengan menentukan nombor indeksnya. Seperti dalam C, indeks array bermula dari 0.
data_array[0] = 8'hFF;   // Assign hexadecimal FF to the first element
data_array[1] = 8'd12;   // Assign decimal 12 to the second element
Anda juga boleh menggunakan gelung di dalam blok always untuk memulakan atau memanipulasi array.
integer i;
always @(posedge clk) begin
    for (i = 0; i < 16; i = i + 1) begin
        data_array[i] <= 8'd0;
    end
end

Kelebihan Array

  • Pemprosesan kelompok : Dengan gelung for, anda boleh melaksanakan operasi yang sama ke atas pelbagai isyarat sekaligus.
  • Litar berstruktur : Tatasusunan membantu menyusun pelbagai daftar atau isyarat, menjadikan representasi litar lebih jelas.
  • Pemodelan memori : Anda boleh melaksanakan struktur memori mudah seperti RAM atau ROM (dijelaskan dalam bab seterusnya).

Perkara yang Perlu Diketahui

Dalam Verilog, anda tidak boleh menetapkan nilai kepada seluruh tatasusunan secara langsung (contohnya, data_array = value). Sebaliknya, operasi mesti dilakukan satu elemen pada satu masa. Juga, hanya tatasusunan satu dimensi yang disokong secara rasmi dalam Verilog awal, jadi untuk tatasusunan pelbagai dimensi anda memerlukan Verilog 2001 atau SystemVerilog.

4. Menggunakan Tatasusunan Pelbagai Dimensi

Tatasusunan dalam Verilog mempermudah reka bentuk dan membantu menyusun struktur litar. Dengan menggunakan tatasusunan pelbagai dimensi, anda dapat mengendalikan struktur data yang lebih kompleks dengan cekap. Walau bagaimanapun, perhatikan bahawa Verilog lama (IEEE 1364-1995) tidak menyokong tatasusunan pelbagai dimensi. Ia secara rasmi diperkenalkan dalam Verilog 2001. Untuk fleksibiliti yang lebih tinggi, SystemVerilog disarankan.

Mengisytiharkan Tatasusunan Pelbagai Dimensi

Sejak Verilog 2001, anda boleh mentakrifkan tatasusunan pelbagai dimensi dengan menentukan pelbagai indeks untuk satu pembolehubah. Sintaks asas ialah:
reg [7:0] matrix [0:3][0:3];  // Defines a 4×4 matrix of 8-bit elements
Pengisytiharan ini menghasilkan tatasusunan 2D bernama matrix, mengandungi 16 elemen, setiap satu lebar 8 bit.

Mengakses dan Menetapkan Elemen

Anda boleh mengakses dan menetapkan elemen tertentu dalam tatasusunan pelbagai dimensi menggunakan indeks:
matrix[0][0] = 8'hA5;
matrix[2][3] = 8'd255;

Menggunakan Gelung for

Tatasusunan pelbagai dimensi boleh dimanipulasi menggunakan gelung for bersarang. Contoh inisialisasi:
integer i, j;
always @(posedge clk) begin
    for (i = 0; i < 4; i = i + 1) begin
        for (j = 0; j < 4; j = j + 1) begin
            matrix[i][j] <= 8'd0;
        end
    end
end

Aplikasi Tatasusunan Pelbagai Dimensi

  • Berguna dalam reka bentuk yang memerlukan operasi matriks atau pemprosesan penapis.
  • Boleh digunakan dalam pemprosesan imej atau pemprosesan isyarat digital (DSP), untuk pengendalian data pada tahap piksel.
  • Digunakan dalam struktur blok ROM/RAM dan untuk menyusun pasangan alamat-data.

Sekatan dan Pertimbangan

  • Periksa keserasian alat sintesis, kerana sesetengah alat mungkin tidak menyokong tatasusunan pelbagai dimensi sepenuhnya.
  • Sekatan mungkin dikenakan apabila digabungkan dengan instansiasi atau antara muka.
  • Fahami perbezaan daripada SystemVerilog untuk mengelakkan isu keserasian (dijelaskan kemudian).

5. Memodelkan Memori dengan Tatasusunan

Dalam Verilog, anda boleh memodelkan struktur memori mudah menggunakan tatasusunan. Ini membolehkan anda menggambarkan dan mensimulasikan litar penyimpanan seperti RAM dan ROM secara ringkas dan fleksibel. Secara khusus, model memori berasaskan tatasusunan satu dimensi kerap digunakan dalam reka bentuk CPU dan sistem komunikasi.

Sintaks Asas untuk Model Memori

Contoh berikut mewakili RAM mudah dengan perkataan 32-bit dan 1024 alamat (0–1023):
reg [31:0] memory [0:1023];  // 32-bit × 1024-word memory
Pengisytiharan ini menghasilkan tatasusunan bernama memory, di mana setiap indeks (alamat) menyimpan perkataan 32-bit.

Menulis ke dan Membaca dari Memori

Operasi baca/tulis memori menggunakan tatasusunan boleh diterangkan seperti berikut:
// Write operation
always @(posedge clk) begin
    if (we) begin
        memory[addr] <= data_in;
    end
end

// Read operation
assign data_out = memory[addr];
Poin penting:
  • Operasi menulis bersifat serentak dengan posedge clk dan bersyarat (dikawal oleh we, enable menulis).
  • Operasi membaca biasanya dilaksanakan menggunakan assign untuk bacaan kombinasi (asinkron).

Inisialisasi Memori

Untuk testbench atau penetapan keadaan awal, anda boleh menginisialisasi tatasusunan di dalam blok initial:
integer i;
initial begin
    for (i = 0; i < 1024; i = i + 1) begin
        memory[i] = 32'd0;
    end
end
Anda juga boleh memuat nilai awal daripada fail luaran menggunakan $readmemh atau $readmemb:
initial begin
    $readmemh("rom_init.hex", memory);  // Initialize from a hex file
end

Kes Penggunaan Praktikal

  • Fail daftar dalam CPU atau mikrokontroler
  • Simulasi tingkah laku Block RAM (BRAM) dalam FPGA
  • Pengesahan tingkah laku memori cache
  • Simulasi bacaan data ROM

Perkara yang Perlu Diperhatikan

  • Apabila saiz tatasusunan meningkat, masa simulasi dan sumber sintesis juga meningkat.
  • Pilih masa bacaan ( sinkron vs. tak sinkron ) dengan teliti berdasarkan spesifikasi reka bentuk dan alat.
  • Apabila menyasarkan sintesis, ikuti peraturan inferens memori khusus yang disarankan oleh vendor alat.

6. Penambahbaikan Tatasusunan dalam SystemVerilog

Hingga Verilog 2001, fungsi tatasusunan terhad, sering menjadikan reka bentuk sukar. Untuk mengatasinya, SystemVerilog memperkenalkan penambahbaikan ketara, membolehkan pengendalian tatasusunan yang lebih fleksibel dan berkuasa. Bahagian ini menerangkan tiga jenis utama tatasusunan yang tersedia dalam SystemVerilog: tatasusunan dinamik, tatasusunan asosiatif, dan barisan. Kami akan membincangkan ciri‑ciri dan kes penggunaannya.

Tatasusunan Dinamik

Ciri‑ciri

  • Saiz tatasusunan boleh diubah semasa runtime.
  • Berguna apabila saiz tidak diketahui terlebih dahulu atau berubah‑ubah semasa pelaksanaan.

Pengisytiharan dan Contoh

int dyn_array[];             // Declare a dynamic array
dyn_array = new[10];         // Initialize with 10 elements
dyn_array[0] = 100;

Kes Penggunaan

  • Penyimpanan data sementara dalam testbench
  • Mengurus penampan bersaiz berubah

Tatasusunan Asosiatif

Ciri‑ciri

  • Indeks boleh menjadi nilai sewenang‑wenangnya (integer, string, dll).
  • Berfungsi seperti jadual hash.

Pengisytiharan dan Contoh

int assoc_array[string];     // Associative array using strings as keys
assoc_array["id_001"] = 42;

Kes Penggunaan

  • Menyimpan nilai konfigurasi untuk parameter
  • Mencari nilai mengikut ID atau nama

Barisan

Ciri‑ciri

  • Berfungsi seperti struktur FIFO (First‑In, First‑Out).
  • Menyokong penyisipan dan pembuangan yang mudah, ideal untuk aliran data dinamik.

Pengisytiharan dan Contoh

int queue_array[$];          // Declare a queue array

queue_array.push_back(10);   // Add element at the end
queue_array.push_front(5);   // Add element at the front
int val = queue_array.pop_front();  // Remove element from the front

Kes Penggunaan

  • Penyimpanan data sementara (penampan FIFO)
  • Pengurusan acara dan transaksi

Perbandingan dan Penggunaan

Jenis ArrayResizableJenis IndeksTerbaik Untuk
Array DinamikYaIntegerApabila saiz tidak diketahui atau berubah-ubah
Array AsosiatifYaApa saja (int, string, dll.)Pencarian menyerupai jadual hash
QueueYaAutomatik (hadapan/belakang)Pemasukan/pengeluaran kerap

Perkara yang Perlu Diperhatikan

  • Tatasusunan yang dipertingkatkan ini adalah ciri khusus SystemVerilog dan tidak tersedia dalam Verilog.
  • Tahap sokongan sintesis bergantung pada alat, dan ia kebanyakannya digunakan untuk testbench.
  • Jika menyasarkan FPGA atau ASIC, sentiasa periksa sama ada ciri ini disokong sebelum pelaksanaan.

7. Amalan Terbaik untuk Operasi Tatasusunan

Apabila bekerja dengan tatasusunan dalam Verilog atau SystemVerilog, memberi tumpuan kepada pengekodan yang cekap dan mudah dibaca secara langsung menghasilkan reka bentuk perkakasan yang lebih berkualiti. Bab ini menyoroti amalan terbaik untuk mengendalikan tatasusunan dengan selamat dan berkesan.

Jelasni Tujuan dengan Komen dan Penamaan

Meskipun tatasusunan berskala dan mudah, tidak selalu jelas apa yang diwakili oleh setiap elemen. Untuk mengelakkan kekeliruan, ikuti panduan berikut:
  • Gunakan nama yang bermakna untuk tatasusunan: reg [7:0] sensor_data [0:7];
  • Tambah komen untuk menerangkan tujuan atau unit:
// Stores 8-bit data from 8 sensors
reg [7:0] sensor_data [0:7];

Berhati-hati dengan Sempadan Gelung

Apabila menggunakan gelung for untuk memanipulasi tatasusunan, adalah penting untuk menentukan sempadan indeks dengan betul:
  • Had atas yang tidak betul → akses di luar julat (ralat logik atau amaran simulator)
  • Tentukan dengan teliti sama ada menggunakan < atau <= untuk penamatan gelung
Contoh:
integer i;
always @(posedge clk) begin
    for (i = 0; i < 8; i = i + 1) begin
        sensor_data[i] <= 8'd0;
    end
end

Sentiasa Inisialisasi Secara Eksplisit

Meninggalkan array tidak diinisialisasi boleh mempengaruhi hasil simulasi. Ini amat kritikal untuk array yang memodelkan RAM atau bank pendaftar. Sentiasa inisialisasi secara eksplisit:
initial begin
    for (i = 0; i < 256; i = i + 1)
        mem[i] = 32'd0;
end
Dalam SystemVerilog, pembina atau gelung foreach membolehkan inisialisasi yang lebih mudah.

Reka Bentuk Modul yang Boleh Digunakan Semula

Reka bentuk berasaskan array boleh menyesuaikan secara fleksibel dengan perubahan dalam bilangan contoh atau lebar bit. Untuk memaksimumkan kebolehgunaan semula, pertimbangkan:
  • Menggunakan parameter untuk menjadikan saiz array boleh dikonfigurasi:
parameter DEPTH = 16;
reg [7:0] buffer [0:DEPTH-1];
  • Membolehkan pemindahan parameter luaran meningkatkan kebolehgunaan semula modul.

Pertimbangkan Kebolehsintesis

Apabila menggunakan array, sentiasa ambil kira keserasian alat sintesis:
  • Array reg satu dimensi Verilog: umumnya boleh disintesis
  • Array dinamik/assosiatif/antrian SystemVerilog: tidak boleh disintesis (untuk simulasi sahaja)
Oleh itu, untuk litar yang boleh disintesis, kekal dengan array reg tradisional.

Gunakan Array vs. Modul dengan Sesuai

Walaupun array boleh mengurangkan saiz kod, reka bentuk yang terlalu kompleks mungkin mendapat manfaat lebih daripada memisahkan fungsi ke dalam modul berasingan untuk penyelenggaraan.
  • Operasi kecil dan sama → array dengan gelung for
  • Fungsi berbeza atau reka bentuk berskala besar → reka bentuk modular dan hierarki

8. Soalan Lazim (FAQ)

Apabila menggunakan array dalam Verilog atau SystemVerilog, pengguna pemula hingga pertengahan sering menghadapi halangan yang sama. Di sini kami menjawab tiga soalan biasa tentang “Verilog arrays,” menyediakan jawapan praktikal dan pandangan daripada pengalaman reka bentuk dunia sebenar.

Q1. Saya mendapat ralat apabila menggunakan array pelbagai dimensi dalam Verilog. Mengapa?

A1.

Ini berlaku kerana Verilog 1995 dan versi awal Verilog 2001 sama sekali tidak menyokong array pelbagai dimensi atau hanya menyokongnya secara terhad. Sebagai contoh, kod berikut akan menyebabkan ralat kompilasi dalam Verilog 1995:
reg [7:0] matrix [0:3][0:3];  // Supported only in Verilog 2001 or later
Penyelesaian:
  • Pastikan persekitaran pembangunan anda mematuhi Verilog 2001 atau kemudian .
  • Jika had masih wujud, tulis semula menggunakan array satu dimensi dengan indeks yang dikira.
reg [7:0] matrix_1d [0:15];  // Flattened 4x4 array, accessed with (i*4 + j)

Q2. Jika saya menggambarkan RAM menggunakan array dalam Verilog, adakah ia akan berfungsi pada perkakasan?

A2.

Ya. RAM yang digambarkan menggunakan array dalam Verilog disokong oleh kebanyakan alat sintesis. Contoh biasa:
reg [31:0] mem [0:255];  // 32-bit × 256-word RAM
Perkara yang perlu diperhatikan:
  • Alat sintesis mesti mengenali gambaran ini sebagai inferens block RAM .
  • Masa baca/tulis (synchronous vs. asynchronous) dan gaya akses mesti mengikuti templat khusus atau alat mungkin tidak menyimpulkan ingatan dengan betul.
Penyelesaian:
  • Ikuti panduan sintesis yang disediakan oleh pembekal FPGA/ASIC anda.
  • Jika tingkah laku berbeza antara simulasi dan perkakasan, semak log dan debug langkah demi langkah.

Q3. Bolehkah saya menggunakan array dinamik SystemVerilog, array assosiatif, atau antrian dalam perkakasan sebenar?

A3.

Secara umum, array dinamik, array assosiatif, dan antrian tidak boleh disintesis (simulasi sahaja). Walaupun ia menyediakan kod yang fleksibel, ia tidak boleh dipetakan secara langsung ke logik perkakasan. Oleh itu, array ini terutamanya digunakan untuk:
  • Penyimpanan data sementara dalam testbench
  • Pelaksanaan rawak atau scoreboard dalam persekitaran pengesahan
  • Gambaran transaksi kompleks
Nota Pelaksanaan:
  • Sebarang kod reka bentuk yang menggunakan jenis array ini akan diabaikan atau menyebabkan ralat dalam alat sintesis.
  • Jika pelaksanaan perkakasan diperlukan, tukar mereka menjadi array reg atau array satu dimensi panjang tetap.

9. Kesimpulan

Dalam artikel ini, kami menumpukan pada kata kunci “Verilog arrays” dan menerangkan penggunaannya dari asas hingga aplikasi lanjutan. Menguasai array dalam reka bentuk litar secara langsung menyumbang kepada kecekapan, kebolehbacaan, dan kebolehselenggaraan.

Ringkasan Utama

  • Dengan memahami jenis data asas Verilog (reg dan wire), anda dapat mengelakkan ralat apabila bekerja dengan array.
  • Array satu dimensi merupakan struktur penting untuk mengumpulkan data dan memodelkan memori.
  • Array berbilang dimensi disokong dalam Verilog 2001 dan versi seterusnya, membolehkan reka bentuk gaya matriks.
  • SystemVerilog memperkenalkan struktur fleksibel seperti array dinamik, array berasosiasi, dan queue (terutamanya untuk simulasi dan pengesahan).
  • Dengan mengikuti amalan terbaik pengendalian array (inisialisasi, penamaan, kebolehguna semula, pertimbangan sintesis), anda dapat menulis kod yang lebih berkualiti.

Tip Praktikal

Array sangat berkuasa, tetapi tidak seharusnya digunakan secara membuta tuli untuk semua perkara. Apabila menulis kod yang boleh disintesis atau bekerjasama dalam pasukan, sentiasa ikuti sekatan dan panduan gaya. Ciri-ciri lanjutan SystemVerilog harus digunakan dengan simulasi dalam fikiran, untuk memaksimumkan manfaatnya. Pereka yang baik tahu cara memilih struktur yang tepat untuk tujuan yang tepat.

Topik Seterusnya yang Disyorkan

Jika anda kini memahami asas-asas array, kami mengesyorkan anda meneroka topik berkaitan berikut:
  • Menggunakan pernyataan generate untuk penjanaan litar dinamik dengan array
  • Menggabungkan interface dengan array untuk reka bentuk bas
  • Melaksanakan FIFO, penimbal cincin, dan pengoptimuman ROM menggunakan array
Menguasai array adalah langkah pertama yang penting bagi pereka Verilog. Dengan memperdalam pemahaman anda, anda akan dapat mengendalikan reka bentuk litar yang semakin kompleks dengan keyakinan.