目次
- 1 1. Pengenalan
- 2 2. Jenis Data Asas dalam Verilog
- 3 3. Konsep Asas Array
- 4 4. Menggunakan Tatasusunan Pelbagai Dimensi
- 5 5. Memodelkan Memori dengan Tatasusunan
- 6 6. Penambahbaikan Tatasusunan dalam SystemVerilog
- 7 7. Amalan Terbaik untuk Operasi Tatasusunan
- 8 8. Soalan Lazim (FAQ)
- 8.1 Q1. Saya mendapat ralat apabila menggunakan array pelbagai dimensi dalam Verilog. Mengapa?
- 8.2 Q2. Jika saya menggambarkan RAM menggunakan array dalam Verilog, adakah ia akan berfungsi pada perkakasan?
- 8.3 Q3. Bolehkah saya menggunakan array dinamik SystemVerilog, array assosiatif, atau antrian dalam perkakasan sebenar?
- 9 9. Kesimpulan
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 jenisreg, 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 clkdan bersyarat (dikawal olehwe, enable menulis). - Operasi membaca biasanya dilaksanakan menggunakan
assignuntuk bacaan kombinasi (asinkron).
Inisialisasi Memori
Untuk testbench atau penetapan keadaan awal, anda boleh menginisialisasi tatasusunan di dalam blokinitial: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 Array | Resizable | Jenis Indeks | Terbaik Untuk |
|---|---|---|---|
| Array Dinamik | Ya | Integer | Apabila saiz tidak diketahui atau berubah-ubah |
| Array Asosiatif | Ya | Apa saja (int, string, dll.) | Pencarian menyerupai jadual hash |
| Queue | Ya | Automatik (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 gelungfor 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
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
parameteruntuk 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
regsatu dimensi Verilog: umumnya boleh disintesis - Array dinamik/assosiatif/antrian SystemVerilog: tidak boleh disintesis (untuk simulasi sahaja)
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.
- 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
- 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
regatau 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
generateuntuk penjanaan litar dinamik dengan array - Menggabungkan
interfacedengan array untuk reka bentuk bas - Melaksanakan FIFO, penimbal cincin, dan pengoptimuman ROM menggunakan array



