1. บทนำ
Verilog (เวริลอก) เป็นภาษาบรรยายฮาร์ดแวร์ (HDL) ที่ถูกใช้อย่างแพร่หลาย และมีความสำคัญอย่างยิ่งในการออกแบบวงจร FPGA และ ASIC การทำความเข้าใจเรื่องอาร์เรย์ (Array) ถือว่าเป็นพื้นฐานสำคัญในการออกแบบที่มีประสิทธิภาพด้วย Verilog
การใช้อาร์เรย์ช่วยให้จัดการกับชุดข้อมูลได้อย่างกระชับและเข้าใจง่าย ส่งผลให้โค้ดมีความอ่านง่ายและบำรุงรักษาได้สะดวก โดยเฉพาะในกรณีที่ต้องจัดกลุ่มสัญญาณหลายตัว หรือแสดงโครงสร้างหน่วยความจำ เช่น RAM อาร์เรย์ถือว่ามีประสิทธิภาพสูงมาก
บทความนี้จะมุ่งเน้นไปที่คีย์เวิร์ด “Verilog อาร์เรย์” โดยจะอธิบายตั้งแต่วิธีการกำหนดอาร์เรย์พื้นฐาน ไปจนถึงเทคนิคการประยุกต์ใช้ในงานจริง ครอบคลุมประเภทของอาร์เรย์ ฟีเจอร์ขยายของ SystemVerilog รวมถึงข้อผิดพลาดที่พบบ่อยและคำถามที่พบบ่อย (FAQ) เพื่อช่วยให้ผู้อ่านเข้าใจได้ลึกซึ้งยิ่งขึ้น
บทความนี้เขียนให้เข้าใจง่ายแม้สำหรับผู้เริ่มต้น พร้อมมีตัวอย่างโค้ดจริงประกอบ แนะนำให้อ่านจนจบเพื่อความเข้าใจที่สมบูรณ์
2. ประเภทข้อมูลพื้นฐานใน Verilog
ก่อนที่จะใช้อาร์เรย์ใน Verilog จำเป็นต้องเข้าใจประเภทข้อมูลพื้นฐานเสียก่อน เนื่องจาก Verilog มีประเภทข้อมูลหลักที่ใช้จัดการกับสัญญาณลอจิกในการออกแบบวงจร
ความแตกต่างระหว่าง reg และ wire
ใน Verilog ประเภทข้อมูลที่ใช้บ่อยที่สุดคือ “reg (เรจิสเตอร์)” และ “wire (ไวร์)” ซึ่งต้องเลือกใช้ให้เหมาะสมตามพฤติกรรมของสัญญาณลอจิก
- wire
ใช้เป็นเส้นเชื่อมสัญญาณจากโมดูลหรือตัววงจรอื่น ๆ ต้องถูกขับเคลื่อนด้วยสัญญาณอื่นเสมอ การกำหนดค่าใช้คำสั่งassign
เหมาะสำหรับการต่อออกของวงจรคอมบิเนชัน ตัวอย่าง:
wire a;
assign a = b & c;
- reg
ใช้เป็นตัวแปรที่เก็บค่าแบบชั่วคราว โดยถูกกำหนดค่าในโปรเซสบล็อก (always
เป็นต้น) ใช้แทนลอจิกที่มีการจดจำเช่น latch หรือ flip-flop ตัวอย่าง:
reg q;
always @(posedge clk) begin
q <= d;
end
ประเภทข้อมูลที่ใช้กับอาร์เรย์ได้
โดยทั่วไป อาร์เรย์ใน Verilog มักถูกกำหนดด้วย reg
แต่ในบางกรณีก็สามารถใช้ wire
ได้ อย่างไรก็ตาม Verilog รุ่นแรก ๆ ยังไม่รองรับอาร์เรย์หลายมิติ ซึ่งได้รับการปรับปรุงอย่างมากใน SystemVerilog
ตัวอย่างโครงสร้างอาร์เรย์พื้นฐาน:
reg [7:0] data_array [0:15]; // อาร์เรย์เก็บข้อมูล 8 บิต จำนวน 16 ค่า
การเข้าใจประเภทข้อมูลพื้นฐานจะช่วยลดความสับสนเมื่อต้องประกาศและใช้อาร์เรย์ หากใช้ reg/wire ผิดประเภทอาจทำให้เกิด simulation error หรือ synthesis error ได้
3. แนวคิดพื้นฐานของอาร์เรย์
ใน Verilog หากต้องการจัดการสัญญาณประเภทเดียวกันหลายค่า สามารถใช้อาร์เรย์ (array) เพื่อทำให้โค้ดอ่านง่ายและนำกลับมาใช้ซ้ำได้สะดวก
วิธีประกาศอาร์เรย์
Verilog รองรับอาร์เรย์ 1 มิติเป็นหลัก โดยมีรูปแบบดังนี้:
reg [ขนาดบิต] ชื่ออาร์เรย์ [ช่วงของดัชนี];
ตัวอย่าง:
reg [7:0] data_array [0:15]; // อาร์เรย์เก็บข้อมูล 8 บิต จำนวน 16 ค่า
ในตัวอย่างนี้ data_array
มี16 องค์ประกอบ ตั้งแต่ 0 ถึง 15 โดยแต่ละองค์ประกอบเก็บข้อมูลกว้าง 8 บิต (1 ไบต์)
การเข้าถึงองค์ประกอบของอาร์เรย์
แต่ละองค์ประกอบของอาร์เรย์สามารถเข้าถึงได้โดยการระบุหมายเลขดัชนี (index) เช่นเดียวกับภาษา C โดยเริ่มจาก 0
data_array[0] = 8'hFF; // กำหนดค่า 16-ฐานเป็น FF ให้กับองค์ประกอบแรก
data_array[1] = 8'd12; // กำหนดค่า 10-ฐานเป็น 12 ให้กับองค์ประกอบที่สอง
นอกจากนี้ยังสามารถใช้ลูปภายใน always
block เพื่อกำหนดค่าเริ่มต้นหรือทำงานกับอาร์เรย์ได้
integer i;
always @(posedge clk) begin
for (i = 0; i < 16; i = i + 1) begin
data_array[i] <= 8'd0;
end
end
ข้อดีของการใช้อาร์เรย์
- ประมวลผลเป็นกลุ่มได้: ใช้คู่กับ for-loop เพื่อประยุกต์การทำงานกับสัญญาณหลายตัวพร้อมกัน
- โครงสร้างวงจรชัดเจน: ช่วยจัดระเบียบเรจิสเตอร์หรือสัญญาณหลายตัว ทำให้โครงสร้างโค้ดเข้าใจง่าย
- สร้างโมเดลหน่วยความจำ: ใช้จำลอง RAM หรือ ROM ได้อย่างง่ายดาย (อธิบายเพิ่มเติมในบทถัดไป)
ข้อควรระวัง
ใน Verilog ไม่สามารถกำหนดค่าให้อาร์เรย์ทั้งก้อนพร้อมกัน เช่น data_array = ค่า
ได้ แต่ต้องจัดการทีละองค์ประกอบ อีกทั้ง Verilog รุ่นเก่าอย่าง Verilog 1995 รองรับเพียงอาร์เรย์ 1 มิติ หากต้องการใช้อาร์เรย์หลายมิติ จำเป็นต้องใช้ Verilog 2001 ขึ้นไป หรือ SystemVerilog
4. การใช้อาร์เรย์หลายมิติ
อาร์เรย์ใน Verilog ช่วยให้การออกแบบวงจรง่ายขึ้น แต่หากใช้อาร์เรย์หลายมิติ จะสามารถจัดการข้อมูลที่ซับซ้อนได้อย่างมีประสิทธิภาพ
อย่างไรก็ตาม ต้องทราบว่าVerilog รุ่นเก่า (IEEE 1364-1995) ไม่รองรับอาร์เรย์หลายมิติ โดยฟีเจอร์นี้ถูกเพิ่มเข้ามาอย่างเป็นทางการใน Verilog 2001 หากต้องการความยืดหยุ่นสูง แนะนำให้ใช้ SystemVerilog
การประกาศอาร์เรย์หลายมิติ
ตั้งแต่ Verilog 2001 เป็นต้นมา สามารถกำหนดตัวแปรที่มีหลายดัชนีได้ ตัวอย่างโครงสร้าง:
reg [7:0] matrix [0:3][0:3]; // อาร์เรย์ 2 มิติ 4×4 แต่ละค่าเป็นข้อมูล 8 บิต
คำสั่งนี้ทำให้ matrix
เป็นอาร์เรย์ 2 มิติที่มีทั้งหมด 16 องค์ประกอบ
การเข้าถึงและกำหนดค่า
สามารถเข้าถึงองค์ประกอบเฉพาะของอาร์เรย์หลายมิติได้โดยใช้ดัชนี เช่น
matrix[0][0] = 8'hA5;
matrix[2][3] = 8'd255;
การใช้งานร่วมกับ for-loop
หากต้องการกำหนดค่าเริ่มต้นหรือทำงานกับอาร์เรย์หลายมิติ สามารถใช้ลูปซ้อนกันได้ ตัวอย่าง:
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
ตัวอย่างการใช้อาร์เรย์หลายมิติ
- การคำนวณเมทริกซ์หรือฟิลเตอร์ ในการออกแบบวงจรที่ต้องใช้ข้อมูลซับซ้อน
- การประมวลผลภาพหรือสัญญาณดิจิทัล (DSP) เช่น การจัดการข้อมูลระดับพิกเซล
- การจัดกลุ่ม ROM/RAM หรือการจัดคู่ระหว่าง address และ data
ข้อควรระวังและข้อจำกัด
- ต้องตรวจสอบว่าเครื่องมือสังเคราะห์ (synthesis tool) ที่ใช้รองรับอาร์เรย์หลายมิติหรือไม่
- การใช้งานร่วมกับ instantiation หรือ interface อาจมีข้อจำกัด
- ควรทำความเข้าใจความแตกต่างกับ SystemVerilog เพื่อหลีกเลี่ยงปัญหาความเข้ากันได้
5. การจำลองหน่วยความจำด้วยอาร์เรย์
ใน Verilog สามารถใช้อาร์เรย์เพื่อจำลองโครงสร้างหน่วยความจำ ได้อย่างง่ายดาย ไม่ว่าจะเป็น RAM หรือ ROM ซึ่งช่วยให้การออกแบบและการจำลองทำได้กระชับและยืดหยุ่น
โดยเฉพาะอย่างยิ่ง โมเดลหน่วยความจำที่ใช้อาร์เรย์ 1 มิติ มักถูกนำไปใช้บ่อยในการออกแบบ CPU หรือระบบสื่อสาร
โครงสร้างพื้นฐานของโมเดลหน่วยความจำ
ตัวอย่าง RAM ที่กว้าง 32 บิต จำนวน 1024 คำสั่ง (address 0–1023):
reg [31:0] memory [0:1023]; // หน่วยความจำ 32 บิต × 1024 คำ
คำสั่งนี้สร้างอาร์เรย์ชื่อ memory
ซึ่งแต่ละ index (address) เก็บข้อมูล 32 บิต
การเขียนและอ่านข้อมูลในหน่วยความจำ
การอ่าน/เขียนข้อมูลในอาร์เรย์สามารถเขียนได้ดังนี้:
// การเขียน
always @(posedge clk) begin
if (we) begin
memory[addr] <= data_in;
end
end
// การอ่าน
assign data_out = memory[addr];
จุดสำคัญ:
- การเขียนทำในขอบสัญญาณ
posedge clk
และมักใช้we
(write enable) - การอ่านนิยมใช้
assign
เพื่อทำเป็นวงจรคอมบิเนชัน (asynchronous read)
วิธีการกำหนดค่าเริ่มต้นของหน่วยความจำ
สามารถใช้งาน initial
block เพื่อกำหนดค่าเริ่มต้นของอาร์เรย์ได้ ตัวอย่าง:
integer i;
initial begin
for (i = 0; i < 1024; i = i + 1) begin
memory[i] = 32'd0;
end
end
หรือใช้ $readmemh
และ $readmemb
เพื่อโหลดค่าจากไฟล์ภายนอก:
initial begin
$readmemh("rom_init.hex", memory); // โหลดค่าเริ่มต้นแบบเลขฐาน 16
end
ตัวอย่างการใช้งานในงานจริง
- Register file ของ CPU หรือ Microcontroller
- การจำลอง Block RAM (BRAM) ภายใน FPGA
- การทดสอบการทำงานของ Cache memory
- การอ่านข้อมูลจาก ROM
ข้อควรระวัง
- ขนาดของอาร์เรย์ที่ใหญ่เกินไปอาจทำให้เวลา simulation ช้าลง และใช้ resource synthesis มากขึ้น
- ต้องเลือกวิธีอ่าน (synchronous หรือ asynchronous) ให้เหมาะสมกับสเปกการออกแบบ
- หากตั้งใจให้สังเคราะห์เป็นวงจรจริง ควรปฏิบัติตามกฎ inference ของเครื่องมือ
6. การขยายความสามารถของอาร์เรย์ใน SystemVerilog
ใน Verilog 2001 ฟังก์ชันอาร์เรย์ยังมีข้อจำกัด ทำให้การออกแบบซับซ้อน แต่ในSystemVerilog ได้เพิ่มความสามารถของอาร์เรย์ให้มีความยืดหยุ่นและทรงพลังยิ่งขึ้น
SystemVerilog มีอาร์เรย์หลัก 3 ประเภทที่ใช้บ่อย ได้แก่ อาร์เรย์แบบไดนามิก (Dynamic Arrays) อาร์เรย์เชิงสัมพันธ์ (Associative Arrays) และ อาร์เรย์แบบคิว (Queues)
อาร์เรย์แบบไดนามิก (Dynamic Arrays)
คุณสมบัติ
- สามารถเปลี่ยนขนาดได้ในระหว่างรันไทม์
- เหมาะสำหรับกรณีที่ขนาดอาร์เรย์ไม่แน่นอนหรือแปรผัน
ตัวอย่าง
int dyn_array[]; // ประกาศอาร์เรย์ไดนามิก
dyn_array = new[10]; // กำหนดขนาด 10
dyn_array[0] = 100;
อาร์เรย์เชิงสัมพันธ์ (Associative Arrays)
คุณสมบัติ
- ใช้ค่าดัชนีเป็นค่าที่กำหนดเองได้ (เช่น int, string)
- ทำงานคล้าย hash table
ตัวอย่าง
int assoc_array[string]; // ใช้ string เป็น key
assoc_array["id_001"] = 42;
อาร์เรย์แบบคิว (Queues)
คุณสมบัติ
- ทำงานแบบ FIFO (First-In First-Out)
- เพิ่ม/ลบองค์ประกอบได้สะดวก เหมาะกับข้อมูลที่เปลี่ยนแปลงตลอดเวลา
ตัวอย่าง
int queue_array[$]; // ประกาศอาร์เรย์แบบคิว
queue_array.push_back(10); // เพิ่มท้าย
queue_array.push_front(5); // เพิ่มหัว
int val = queue_array.pop_front(); // ดึงออกจากหัว
การเลือกใช้งาน
ประเภทอาร์เรย์ | เปลี่ยนขนาดได้ | ชนิด index | กรณีใช้งาน |
---|---|---|---|
Dynamic | ได้ | จำนวนเต็ม | เมื่อขนาดไม่แน่นอน |
Associative | ได้ | กำหนดเอง (int, string) | ใช้แบบ hash |
Queue | ได้ | จัดการอัตโนมัติ | ข้อมูลเข้าออกบ่อย |
ข้อควรระวัง
- อาร์เรย์ขยายเหล่านี้เป็นฟีเจอร์ของSystemVerilog และใช้ไม่ได้ใน Verilog
- โดยทั่วไปจะใช้เฉพาะใน Testbench ไม่สามารถสังเคราะห์เป็นฮาร์ดแวร์จริงได้
- หากออกแบบให้ FPGA/ASIC ต้องตรวจสอบว่าเครื่องมือรองรับหรือไม่
7. แนวทางปฏิบัติที่ดีที่สุดในการใช้อาร์เรย์
เมื่อใช้อาร์เรย์ใน Verilog หรือ SystemVerilog ควรเน้นการเขียนโค้ดที่มีประสิทธิภาพและอ่านง่าย ซึ่งจะช่วยให้การออกแบบฮาร์ดแวร์มีคุณภาพสูงขึ้น ส่วนนี้จะแนะนำแนวทางปฏิบัติที่ดีเพื่อใช้อาร์เรย์ได้อย่างปลอดภัยและมีประสิทธิผล
ใช้คอมเมนต์และการตั้งชื่อที่ชัดเจน
แม้อาร์เรย์จะสะดวกและยืดหยุ่น แต่บางครั้งอาจทำให้ไม่เข้าใจว่าแต่ละองค์ประกอบหมายถึงอะไร ดังนั้นควรปฏิบัติตามนี้:
- ตั้งชื่อตัวแปรให้อธิบายความหมาย เช่น
reg [7:0] sensor_data [0:7];
- ใส่คอมเมนต์อธิบายจุดประสงค์หรือหน่วย
// เก็บข้อมูล 8 บิตจากเซนเซอร์ 8 ตัว
reg [7:0] sensor_data [0:7];
ระวังขอบเขตของลูป
เมื่อใช้ for
loop เพื่อประมวลผลอาร์เรย์ ต้องตรวจสอบช่วงของดัชนี อย่างถูกต้อง
- หากขอบเขตผิด → จะเข้าถึงนอกอาร์เรย์ ทำให้เกิดข้อผิดพลาด
- ควรเลือกใช้
<
หรือ<=
ให้เหมาะสม
integer i;
always @(posedge clk) begin
for (i = 0; i < 8; i = i + 1) begin
sensor_data[i] <= 8'd0;
end
end
กำหนดค่าเริ่มต้นอย่างชัดเจน
หากใช้อาร์เรย์โดยไม่มีค่าเริ่มต้น อาจทำให้ผลลัพธ์ simulation ผิดพลาด โดยเฉพาะเมื่อจำลอง RAM หรือ register bank ดังนั้นควรใช้การกำหนดค่าเริ่มต้นเสมอ
initial begin
for (i = 0; i < 256; i = i + 1)
mem[i] = 32'd0;
end
ใน SystemVerilog สามารถใช้ constructor หรือ foreach
เพื่อทำให้ง่ายขึ้น
ออกแบบโมดูลที่นำกลับมาใช้ได้
การใช้อาร์เรย์ช่วยให้โมดูลมีความยืดหยุ่น สามารถเปลี่ยนจำนวน instance หรือความกว้างบิตได้ง่าย ตัวอย่าง:
parameter DEPTH = 16;
reg [7:0] buffer [0:DEPTH-1];
การใช้ parameter
ทำให้ปรับขนาดอาร์เรย์จากภายนอกได้ เพิ่มความสามารถในการนำกลับมาใช้
คำนึงถึงการสังเคราะห์ (Synthesis)
ต้องระวังว่าอาร์เรย์แบบใดสามารถสังเคราะห์เป็นวงจรจริงได้
- อาร์เรย์
reg
1 มิติ → รองรับได้ทั่วไป - อาร์เรย์ Dynamic / Associative / Queue ใน SystemVerilog → ไม่สามารถสังเคราะห์ได้ ใช้เฉพาะ simulation
เลือกใช้อาร์เรย์หรือการแยกโมดูล
การใช้อาร์เรย์ช่วยลดโค้ด แต่หากซับซ้อนเกินไป ควรแบ่งเป็นโมดูลย่อย เพื่อความเข้าใจง่ายและบำรุงรักษาได้ดีขึ้น
- งานเล็ก ๆ ที่ซ้ำกัน → ใช้อาร์เรย์ + for-loop
- งานใหญ่หรือซับซ้อน → แยกเป็นโมดูลย่อย
8. คำถามที่พบบ่อย (FAQ)
เมื่อใช้อาร์เรย์ใน Verilog หรือ SystemVerilog มักพบคำถามซ้ำ ๆ ตั้งแต่ผู้เริ่มต้นจนถึงระดับกลาง ที่นี่จะตอบ 3 คำถามหลักที่เกี่ยวข้องกับ “Verilog อาร์เรย์” พร้อมคำอธิบาย
Q1. ทำไมใช้ Verilog แล้วอาร์เรย์หลายมิติถึงเกิด error?
A1.
เพราะ Verilog 1995 และบางเวอร์ชันก่อน Verilog 2001 ไม่รองรับอาร์เรย์หลายมิติ หรือรองรับแบบจำกัด
reg [7:0] matrix [0:3][0:3]; // รองรับตั้งแต่ Verilog 2001
วิธีแก้:
- ตรวจสอบว่าใช้ Compiler ที่รองรับ Verilog 2001 หรือใหม่กว่า
- หากยังไม่ได้ผล ให้ปรับเป็นอาร์เรย์ 1 มิติ และเข้าถึงโดยคำนวณ index เอง
reg [7:0] matrix_1d [0:15]; // เข้าถึงด้วย (i*4 + j)
Q2. ถ้าใช้อาร์เรย์เขียน RAM ใน Verilog จะทำงานบน FPGA จริงหรือไม่?
A2.
ใช่ การเขียน RAM ด้วยอาร์เรย์ รองรับโดยเครื่องมือสังเคราะห์ส่วนใหญ่ ตัวอย่าง:
reg [31:0] mem [0:255]; // RAM 32 บิต × 256 คำ
แต่ต้องระวัง:
- โค้ดต้องตรงตาม template ที่เครื่องมือจะสังเคราะห์เป็น Block RAM
- การอ่าน/เขียนต้องเป็นไปตามรูปแบบที่เครื่องมือรองรับ ไม่เช่นนั้นอาจไม่ถูกมองว่าเป็น memory จริง
Q3. อาร์เรย์ Dynamic / Associative / Queue ใน SystemVerilog ใช้บน FPGA ได้ไหม?
A3.
โดยทั่วไป ไม่สามารถสังเคราะห์ได้ ใช้เฉพาะการจำลอง (simulation) เท่านั้น เพราะโครงสร้างเหล่านี้ไม่สามารถแมปตรงสู่ฮาร์ดแวร์ได้
เหมาะกับการใช้งานเช่น:
- Testbench ที่ต้องเก็บข้อมูลชั่วคราว
- การสุ่มค่า หรือ Scoreboard ใน Verification
- การจัดการ Transaction ซับซ้อน
หากต้องใช้งานจริงบน FPGA/ASIC จำเป็นต้องเขียนใหม่เป็น reg
หรืออาร์เรย์ขนาดคงที่
9. สรุป
บทความนี้มุ่งเน้นคีย์เวิร์ด “Verilog อาร์เรย์” โดยได้อธิบายตั้งแต่พื้นฐานจนถึงการประยุกต์ใช้งานจริง การใช้อาร์เรย์อย่างถูกต้องในงานออกแบบวงจรช่วยเพิ่มประสิทธิภาพ ปรับปรุงความอ่านง่าย และเพิ่มความสามารถในการบำรุงรักษา
ประเด็นสำคัญที่ควรจำ
- การเข้าใจประเภทข้อมูลพื้นฐาน (reg และ wire) ช่วยหลีกเลี่ยงความผิดพลาดเมื่อใช้อาร์เรย์
- อาร์เรย์ 1 มิติ มีความสำคัญต่อการจัดการข้อมูลและสร้างโมเดลหน่วยความจำ
- อาร์เรย์หลายมิติ รองรับตั้งแต่ Verilog 2001 สามารถใช้งานโครงสร้างซับซ้อน เช่น matrix
- SystemVerilog มีอาร์เรย์แบบ Dynamic, Associative และ Queue ที่ยืดหยุ่น แต่ใช้ได้ใน simulation เท่านั้น
- การปฏิบัติตามแนวทางที่ดี (Best Practices) เช่น การตั้งชื่อ การกำหนดค่าเริ่มต้น และการคำนึงถึงการสังเคราะห์ จะช่วยให้โค้ดมีคุณภาพสูงขึ้น
คำแนะนำในการใช้งานจริง
แม้อาร์เรย์จะมีความสะดวก แต่ไม่ควรใช้อาร์เรย์กับทุกอย่าง หากต้องการเขียนโค้ดที่สังเคราะห์ได้หรือทำงานร่วมกับทีม ควรพิจารณาข้อจำกัดและแนวทางมาตรฐานของโปรเจกต์
ฟีเจอร์ขั้นสูงของ SystemVerilog เช่น อาร์เรย์ Dynamic/Associative/Queue ควรจำกัดใช้สำหรับ simulation เพื่อการตรวจสอบและการทดสอบเท่านั้น
การเลือกใช้อาร์เรย์ได้อย่างเหมาะสม ถือเป็นคุณสมบัติที่สำคัญของนักออกแบบวงจรที่ดี
หัวข้อที่ควรศึกษาเพิ่มเติม
หากเข้าใจพื้นฐานของอาร์เรย์แล้ว แนะนำให้ศึกษาต่อในหัวข้อดังนี้:
- การใช้คำสั่ง
generate
เพื่อสร้างวงจรแบบไดนามิกด้วยอาร์เรย์ - การออกแบบ Bus ด้วย
interface
และอาร์เรย์ - การใช้อาร์เรย์ใน FIFO, Ring Buffer และ ROM
การใช้อาร์เรย์อย่างเชี่ยวชาญถือเป็นก้าวแรกที่สำคัญของนักออกแบบ Verilog ศึกษาและฝึกฝนอย่างต่อเนื่องเพื่อให้พร้อมรับมือกับงานออกแบบวงจรที่ซับซ้อนมากขึ้น