บทที่ 4 บทความแนะนำขั้นตอน Simulation และ Debug ด้วย ILA สำหรับ FPGA
Last updated
Last updated
บทความนี้นำเสนอวิธีการจำลองการทำงาน (Simulation) เพื่อจำลองการทำงานของวงจรหรือโค้ดลอจิก (Source Code) ที่ออกแบบไว้ ก่อนนำไปใช้งานจริงบนบอร์ด FPGA รวมถึงการใช้ ILA (Integrated Logic Analyzer) ในการ Debug สัญญาณขณะกำลังทำงานบนบอร์ด ร่วมกับโปรแกรม Vivado เวอร์ชัน 2023.1
เพื่อตรวจเทียบการทำงานของวงจรหรือโค้ดลอจิกที่ถูกออกแบบไว้ เราต้องออกแบบไฟล์ทดสอบหรือไฟล์แบบจำลองเพิ่มเติม มีชื่อเรียกโดยทั่วไปว่า Testbench ไฟล์ทดสอบดังกล่าวทำหน้าที่จำลองสัญญาณขาเข้า (Input) และตรวจสอบสัญญาณขาออก (Output) ของวงจรที่ถูกทดสอบว่าตรงตามที่ต้องการหรือไม่
การทำแบบจำลองมีความสำคัญเนื่องจากช่วยให้เราสามารถตรวจสอบการทำงานของวงจรได้อย่างละเอียดก่อนนำไปใช้งานจริงบนบอร์ด FPGA การ Debug โดยตรงบนบอร์ดจริงนั้นมักมีความซับซ้อน ใช้เวลามาก และมีข้อจำกัดด้านทรัพยากร Simulation จึงเป็นขั้นตอนสำคัญที่จะช่วยลดข้อผิดพลาดและตรวจสอบคุณภาพของวงจร ผู้ออกแบบทุกคนจึงควรจำลองการทำงานของวงจร (Simulate) ก่อนนำวงจรไปใช้งานจริงบนฮาร์ดแวร์
มีขั้นตอนดังนี้
เข้าไปที่โฟลเดอร์ของโปรเจกต์ที่ต้องการทดสอบโดยตัวอย่างในที่นี้จะใช้โปรเจกต์ Key_test (ต่อเนื่องมาจากบทที่ 3 เรื่อง บทความแนะนำขั้นตอนการสร้างโปรเจกต์และรันโปรเจกต์ลงบอร์ด ALINX AX7010) ดับเบิลคลิกที่ key_test.xpr เพื่อเข้าไปหน้าโปรเจกต์นี้ในโปรแกรม Vivado
คลิกขวาที่ SIMULATION เลือก Simulation Settings… เพื่อตั้งค่าการซิม
เลือก Simulation จากนั้นเลือกเครื่องมือที่จะใช้จำลองการทำงานเป็น Vivado Simulator และคลิกที่ Simulation ตั้งค่าเวลาที่ต้องการให้ผลการจำลองทำงานเป็น 50 ms (สามารถตั้งได้ตามต้องการ) แล้วกด OK
เพิ่ม/สร้าง ไฟล์ Testbench สำหรับการทดสอบ โดยคลิก Add Source เลือก Add or create simulation sources จากนั้นกด Next
สามารถเลือกเพิ่มหรือสร้างไฟล์ Testbench ก็ได้ แต่เนื่องจากการเพิ่มไฟล์ Source Code และไฟล์ Testbench นั้นมีขั้นตอนเหมือนกัน จึงสามารถดูตัวอย่างการเพิ่มไฟล์ได้ที่บทที่ 3 เรื่อง บทความแนะนำขั้นตอนการสร้างโปรเจกต์และรันโปรเจกต์ลงบอร์ด ALINX AX7010 ดังนั้นตัวอย่างในที่นี้จะอธิบายถึงขั้นตอนการสร้างไฟล์เท่านั้น โดยคลิกที่ Create File จากนั้นตั้งชื่อไฟล์ แล้วคลิก OK
คลิก Finish จากนั้นหน้าต่างนี้จะขึ้นมาเพื่อให้เพิ่มขา Input หรือ Output ให้คลิก OK เนื่องจากยังไม่ต้องการเพิ่มขา IO แล้วเลือก Yes
ไปที่ Project Manager > Simulation Sources > sim_1 แล้วดับเบิลคลิกที่ Tb_key เพื่อเปิดไฟล์โค้ดของแบบจำลอง (Testbench)
ตัวอย่างนี้จะใช้ไฟล์ Testbench สำเร็จของโปรเจกต์ตัวอย่างที่มาพร้อมกับบอร์ดโดยไม่มีการปรับเปลี่ยน ดังนั้นให้คัดลอกไฟล์ Testbench สำหรับวงจรนี้ โดยไปที่โฟลเดอร์ที่เก็บ course_s1_fpga ไว้จากนั้นเลือก 06_key > auto_create_project > src > testbench แล้วเปิดไฟล์ key_test_tb.v
จากนั้นคัดลอกโค้ดจากไฟล์ key_test_tb.v ใส่ในโปรเจกต์ที่สร้างไว้ใน Vivado และบันทึกให้เรียบร้อย
เมื่อบันทึกแล้ว ไฟล์ Tb_key จะเรียกใช้ไฟล์ key.v โดยอัตโนมัติ เนื่องจากโค้ดทดสอบในไฟล์ Tb_key มีการเรียกใช้วงจรลอจิกในไฟล์ key.v มาเป็นส่วนหนึ่งของการจำลอง (Component Calling)
คลิก Run Simulation เลือก Run Behavioral Simulation หากไม่มีข้อผิดพลาด โปรแกรม Vivado จะแสดงการจำลองการทำงานของโค้ดลอจิก Key.v ออกมาในรูปแบบของแผนภาพเวลา (Timing Diagram)
จะได้หน้า SIMULATION ขึ้นมา ซึ่งจะแสดงผลการทดสอบของโค้ด Key.v โดยเวลาที่ใช้ในการรันโค้ด จะมีค่าเท่ากับ 50 ms (ตามที่เราเคยตั้งไว้ก่อนหน้านี้) หรือน้อยกว่า 50 ms เมื่อการทำงานของโค้ดใช้เวลาไม่ถึง 50 ms
หากต้องการดูการเปลี่ยนแปลงของสัญญาณ (Waveform) อื่นๆ เพิ่มเติม สามารถคลิกไฟล์ที่มีสัญญาณที่ต้องการ แล้วคลิกขวาที่สัญญาณที่ต้องการเพิ่ม แล้วเลือก Add to Wave Window
แต่เมื่อเพิ่มสัญญาณมาจะไม่แสดง Waveform ของสัญญาณทันที จำเป็นต้องกด Restart แล้วกด Run All จึงจะแสดง Waveform
หากต้องการตั้งค่ารายละเอียดสัญญาณ เช่น ชื่อสัญญาณ, สี, รูปแบบตัวเลข หรืออื่นๆ สามารถทำได้โดยคลิกขวาที่สัญญาณที่ต้องการตั้งค่า และสามารถเปลี่ยนได้ตามต้องการ
การจำลองการทำงานของวงจร (Simulation) คือการทดสอบการทำงานของโค้ดลอจิกด้วยการป้อนค่า Input จำลอง เพื่อตรวจสอบว่าโค้ดทำงานได้ถูกต้องตามที่ออกแบบไว้ อย่างไรก็ตาม การจำลองนี้ไม่ได้ครอบคลุมการตรวจสอบสัญญาณขณะวงจรทำงานจริงบนบอร์ด FPGA และสัญญาณที่ได้จากการ Simulation มักเป็น สัญญาณอุดมคติ ซึ่งแตกต่างจากการทำงานจริงที่มักมีปัจจัยแทรก เช่น ความหน่วงเวลา (Latency) ที่อาจส่งผลต่อประสิทธิภาพและการตอบสนองของระบบ
สำหรับหัวข้อนี้ เราจะมุ่งเน้นที่การ ดีบักสัญญาณจริง ระหว่างการทำงานของวงจรบนบอร์ด FPGA โดยใช้เครื่องมือบนโปรแกรม Vivado ที่มีชื่อว่า ILA (Integrated Logic Analyzer) ช่วยให้ผู้ใช้งานสามารถเรียกดูรูปลักษณ์จริงของสัญญาณลอจิกที่กำลังทำงานอยู่บนบอร์ด ณ ช่วงเวลาหนึ่งๆ เพื่อวิเคราะห์และแก้ไขปัญหาการทำงานของวงจรได้อย่างมีประสิทธิภาพ
มีขั้นตอนดังนี้
คลิก IP Catalog จากนั้นค้นหาคำว่า “ILA” แล้วเลือก ILA (Integrated Logic Analyzer)
เปลี่ยนชื่อ ILA จากนั้นกำหนดจำนวนสัญญาณที่ต้องการตรวจจับที่ Number of Probes และตั้งค่า Sample Data Depth ที่ต้องการ (จำนวนตัวอย่างข้อมูลสูงสุดที่ ILA สามารถตรวจจับและแสดงได้ในการทำงาน 1 ครั้ง) หาก Sample Data Depth ยิ่งสูงจะสามารถบันทึกข้อมูลได้นานขึ้น แต่ก็เปลืองทรัพยากรมากขึ้นเช่นกัน เนื่องจาก ILA จะถูกสร้างจากลอจิกและทรัพยากรหน่วยความจำ (Memory) บนบอร์ด FPGA
ไปที่หน้า Probe_Ports ให้ตั้งค่าบิตตามสัญญาณที่เราต้องการจะดู เช่น ในตัวอย่างนี้ต้องการจับสัญญาณ key ที่มีขนาด 4 บิต และสัญญาณ led ที่มีขนาด 4 บิต กำหนดให้ Probe0 คือ key และ Probe1 คือ led ดังนั้นต้องตั้งค่า Probe0 เป็น 4 บิต และ Probe1 เป็น 4 บิต จากนั้นคลิก OK
เลือก Generate
เรียกใช้ ila ในไฟล์ Source Code จากนั้นเชื่อมต่อสัญญาณที่ต้องการตรวจจับเข้ากับขาของ Probe ซึ่งเป็น Input ของ ILA ขั้นตอนนี้เรียกว่า Component Mapping จากนั้นกด Save
สร้าง Bit file โดยเลือก Generate Bitstream จากนั้นโปรแกรมลงบอร์ด ซึ่งสามารถอ่านขั้นตอนต่างๆ ได้ที่บทที่ 2 เรื่อง บทความสอนการติดตั้งและการรันโปรเจกต์ตัวอย่าง ในหัวข้อ สอนการรันโปรเจกต์ตัวอย่าง
เมื่อโปรแกรม Bit File ลงบอร์ดจะได้หน้า hw_ila_1 ขึ้นมา
**ในขั้นตอนนี้ต้องเสียบสาย USB เชื่อมคอมพิวเตอร์ที่ใช้ในการโปรแกรมกับบอร์ดไว้เสมอ หากไม่เสียบสาย จะไม่สามารถเปิดหน้า hw_ila_1 ได้
เงื่อนไขการจับสัญญาณ
เงื่อนไขการจับสัญญาณ (Trigger) คือการบันทึกและแสดงข้อมูลขณะใดขณะหนึ่งของสัญญาณเป้าหมายโดยเริ่มบันทึก ณ จุดเงื่อนไข (Trigger) ที่ผู้ใช้งานกำหนด ดังนั้น การจับสัญญาณผ่าน ILA จึงไม่ได้แสดงรูปลักษณ์สัญญาณตลอดเวลาของวงจร แต่เป็นการตรวจจับสัญญาณนับจากจุด Trigger เป็นต้นไป
โดยเงื่อนไขในการเริ่มจับสัญญาณสามารถเลือกได้หลากหลายรูปแบบ ยกตัวอย่างเช่น
ค่า Logic (ตั้งที่ Value) เช่น 0 หรือ 1 สำหรับสัญญาณ 1 บิต
การเปลี่ยนแปลงสถานะ (ตั้งที่ Value) เช่น จาก 0 เป็น 1 หรือจาก 1 เป็น 0 สำหรับสัญญาณ 1 บิต
จับสัญญาณทั้งหมดกี่ครั้ง (Number of windows)
เลือกค่า Value ที่ต้องการตรวจจับการทำงานของสัญญาณที่เป็น Trigger ซึ่งเมื่อวงจรพบค่านั้น ILA จะเริ่มตรวจจับและแสดงสัญญาณดังกล่าวเป็นรูปคลื่น (Waveform) นอกเหนือจากสัญญาณที่ใช้เป็นเงื่อนไข สัญญาณอื่นๆ ที่ถูกเพิ่มเข้าสู่หน้าต่างจะถูกตรวจจับและแสดงผล Waveform ออกมาเช่นกัน ในตัวอย่างนี้กำหนดให้วงจรจับการทำงานในขณะที่สัญญาณ key_IBUF เป็น 1110 ซึ่งหมายถึงการกดปุ่ม PL Key1
**ในบอร์ดนี้สัญญาณ Key และ LED จะทำงานแบบ Active low หรือก็คือ เมื่อป้อนค่า ‘0’ ให้ Key ที่บิตใดจะหมายถึงการกดปุ่มที่บิตนั้นๆ หรือค่า ‘0’ แสดงที่ LED ดวงใด หมายถึง LED ดวงนั้นสว่างอยู่
สามารถตั้งค่าสำหรับการ Trigger ได้โดยเข้าไปที่หน้า Settings – hw_ila_1 ซึ่งมีรายละเอียดดังนี้
Number of windows
การบอกจำนวนว่าจะให้จับสัญญาณที่สนใจกี่ครั้ง เช่น ในการทดลองนี้จับสัญญาณ key_IBUF ที่ค่า 1110 ถ้าตั้ง Number of windows เป็น 1 ก็จะตรวจจับค่า 1110 ของสัญญาณ key_IBUF ทั้งหมด 1 ครั้ง
Window data depth
จำนวนตัวอย่างข้อมูลที่ ILA จะบันทึกและแสดงบนหน้าต่าง (ความกว้างของช่วง) เช่น ถ้าตั้งค่า Window data depth เป็น 1024 ก็จะบันทึกข้อมูลทั้งหมด 1024 คาบของสัญญาณนาฬิกา (Clock)
Trigger position in window
จุดที่กำหนดตำแหน่งของการ Trigger ซึ่งจะบอกว่าการ Trigger อยู่ช่วงไหนเมื่อเทียบกับขนาดข้อมูลทั้งหมดที่บันทึกและแสดง เช่น หากตั้ง Window data depth เป็น 1024 และ Trigger position in window เป็น 512 หมายความว่า ILA จะบันทึกข้อมูลก่อนเกิด Trigger จำนวน 512 clock และหลัง Trigger อีก 512 clock ซึ่งการตั้งค่านี้ทำให้ Trigger อยู่ตรงกลางของหน้าต่างข้อมูลทั้งหมดที่บันทึก
เมื่อตั้งค่าสัญญาณที่จะใช้ในการตรวจจับแล้ว จากนั้นกด Run แล้วกดปุ่ม PL Key1 ที่อยู่ภายในบอร์ด ALINX AX7010 เพื่อจับการทำงานของสัญญาณ จะได้ค่าดังนี้
สังเกตเห็นว่า ในขณะที่ยังไม่กดปุ่ม (สัญญาณ key_IBUF เป็น “1111”) จะทำให้ไฟ PL LED ไม่สว่างทุกดวง (สัญญาณ led เป็น “1111”) แต่เมื่อกดปุ่ม PL Key1 (สัญญาณ key_IBUF เป็น “1110”) จะทำให้ไฟ PL LED1 สว่างขึ้น (สัญญาณ led เป็น “1110”) ซึ่งเป็นไปตามการทำงานที่ต้องการ
จาก Waveform สังเกตว่า มีการ Trigger ทั้งหมด 1 ครั้งตามที่ได้ตั้งค่าไว้ใน Number of windows มีความกว้างของช่วงทั้งหมด 1024 ตามที่ตั้งใน Window data depth และการ Trigger อยู่ช่วงตรงกลางของการบันทึกข้อมูลตามที่ตั้งใน Trigger position in window
หัวข้อที่กล่าวมาทั้งหมดนี้ เพียงพอให้ผู้ใช้สามารถตรวจสอบการทำงานของวงจรที่ออกแบบทั้งก่อนรันบนบอร์ดจริง และในขณะรันบนบอร์ดจริง ซึ่งจะทำให้ผู้ใช้สามารถแก้ไขปัญหาต่างๆ จากการออกแบบผิดพลาดที่อาจเกิดขึ้นได้
จากเนื้อหาทั้ง 4 บทความที่ผ่านมา เราได้ครอบคลุมข้อมูลสำคัญที่จำเป็นสำหรับการเริ่มต้นใช้งานบอร์ด ALINX AX7010 ตั้งแต่พื้นฐานการใช้งานไปจนถึงเทคนิคที่ช่วยพัฒนาโครงการด้วยตัวคุณเองได้อย่างมั่นใจ หวังว่าบทความเหล่านี้จะเป็นคู่มือที่มีประโยชน์ และช่วยให้คุณสามารถต่อยอดสู่การพัฒนาโครงการที่ท้าทายยิ่งขึ้นในอนาคต
กดปุ่ม ที่อยู่ในหน้าต่าง Trigger Setup – hw_ila_1 เพื่อเลือกสัญญาณที่ต้องการตรวจจับการทำงาน(Trigger) ในการทดลองนี้เลือกสัญญาณ key_IBUF[3:0] โดยสาเหตุที่เลือก key_IBUF[3:0] เนื่องจากการทำงานของโค้ดคือ การกดปุ่ม Key แล้วไฟ LED สว่างขึ้น ดังนั้นตรวจจับการทำงานของ Key เพื่อดูว่า เมื่อกดปุ่ม Key บนบอร์ดแล้วสัญญาณของไฟ LED จะทำงานถูกต้องหรือไม่