ค้นพบว่า High-Level Synthesis ช่วยให้คุณออกแบบฮาร์ดแวร์โดยใช้ภาษา C/C++ ได้อย่างไร
High-Level Synthesis (HLS) คือเทคโนโลยีที่แปลงโค้ด C/C++ ให้เป็น RTL สำหรับ FPGA และ ASIC อัตโนมัติ มันช่วยลดความซับซ้อนในการออกแบบฮาร์ดแวร์ ทำให้นักพัฒนาสามารถโฟกัสไปที่อัลกอริทึมมากกว่าการเขียนวงจรระดับล่าง โดย HLS ใช้เทคนิคอย่าง Scheduling และ Resource Allocation เพื่อเพิ่มประสิทธิภาพวงจร จึงช่วยลดเวลาในการพัฒนาและเชื่อมโลกของซอฟต์แวร์กับฮาร์ดแวร์เข้าด้วยกันได้อย่างมีประสิทธิภาพ
ลองนึกภาพว่าคุณเป็นโปรแกรมเมอร์คนหนึ่งที่เขียนภาษา C หรือ C++ มาหลายปี คุณสามารถสร้างโปรแกรมคำนวณข้อมูล จัดการไฟล์ หรือแม้แต่พัฒนา AI ขนาดเล็กได้อย่างคล่องแคล่ว แล้วถ้าวันหนึ่งมีคนบอกคุณว่า ช่วยเอาอัลกอริทึมนี้ไปใส่ใน FPGA ให้หน่อย มันอาจจะฟังดูเหมือนไม่ยาก แต่ปัญหาก็คือ FPGA ไม่เข้าใจภาษา C หรือ C++ โดยตรง มันเข้าใจภาษาที่ใช้บรรยายวงจรอิเล็กทรอนิกส์ เช่น Verilog หรือ VHDL ตรงนี้เองที่หลายคนเริ่มเกาหัว เพราะการเขียนโปรแกรมทั่วไปคือ การบอกคอมพิวเตอร์ว่าให้ทำอะไรทีละขั้นตอน แต่การเขียน RTL หรือ Register Transfer Level คือ การบอกว่าในวงจรมีอะไรอยู่บ้าง สัญญาณเดินทางแบบไหน และในแต่ละจังหวะข้อมูลจะถูกส่งต่อระหว่างรีจิสเตอร์ได้อย่างไร พูดง่าย ๆ คือ จากเดิมที่เราคิดตามลำดับการทำงาน เราต้องเปลี่ยนมาคิดในแบบโครงสร้างของฮาร์ดแวร์ ต้องบอกเลยว่าสำหรับวิศวกรซอฟต์แวร์หลายคน นี่คงเป็นกำแพงใหญ่ยักษ์ที่ทำให้การพัฒนา FPGA ดูเป็นเรื่องยากที่ไกลตัว และด้วยเหตุผลนี้เอง High-Level Synthesis หรือ HLS จึงถือกำเนิดขึ้น
High-Level Synthesis หรือ HLS คือเทคโนโลยีที่ช่วยแปลงโค้ดระดับสูง เช่น C, C++ หรือ SystemC ให้กลายเป็น RTL ได้อัตโนมัติ เลือกได้ว่าแทนที่จะนั่งเขียน Verilog หลายพันบรรทัด วิศวกรสามารถเขียนอัลกอริทึมในภาษาที่คุ้นเคย แล้วปล่อยให้ซอฟต์แวร์ HLS สร้าง RTL ออกมา เช่น ถ้า Compiler ทั่วไปจะเปลี่ยน C ให้กลายเป็น Machine Code สำหรับ CPU ส่วนเจ้า HLS จะเปลี่ยน C ให้กลายเป็นวงจรดิจิทัลสำหรับ FPGA หรือ ASIC นั่นเอง ซึ่งแนวคิดแบบนี้ทำให้การพัฒนาฮาร์ดแวร์ใกล้เคียงกับการพัฒนาซอฟต์แวร์มากขึ้น ทำให้นักพัฒนาไม่จำเป็นต้องคิดถึง Flip-Flop ทุกตัว หรือเขียน State Machine ทุกสถานะเอง แต่สามารถไปโฟกัสกับอัลกอริทึมและตรรกะของระบบแทนได้เลย
ใครหลาย ๆ คนอาจจะเกิดคำถามขึ้นในหัวว่า แล้วโปรแกรม HLS รู้ได้อย่างไรว่าโค้ด C ควรถูกเปลี่ยนเป็นวงจรแบบไหน คำตอบก็คือ HLS จะวิเคราะห์โค้ดทีละส่วน ตัวอย่างเช่น
y = a + b
ในสายตาของโปรแกรมเมอร์ นี่คือการบวกเลขธรรมดา แต่ในมุมมองของ HLS มันคือการสร้างวงจร Adder หนึ่งตัว หรือถ้าเราเขียน
y = a * b
HLS จะมองว่าเราต้องการ Multiplier หนึ่งตัว และเมื่อโค้ดมีการคำนวณมากขึ้น HLS ก็จะสร้างวงจรที่ซับซ้อนขึ้นตามไปด้วย แต่สิ่งที่สุดยอดก็คือ HLS ไม่ได้แค่แปลโค้ดตรง ๆ เท่านั้น แต่มันยังพยายามปรับแต่งวงจรให้มีประสิทธิภาพมากขึ้นด้วย เหมือนกับ Compiler ที่พยายามทำให้โปรแกรมทำงานเร็วขึ้นนั่นเอง
Scheduling หรือการจัดตารางการทำงานของวงจร
บอกได้เลยว่าหนึ่งในขั้นตอนสำคัญที่สุดของ HLS คือ Scheduling นั่นเอง คุณลองนึกภาพว่าคุณมีงานที่ต้องทำ 10 อย่าง แต่มีพนักงานแค่ 2 คน คุณจำเป็นต้องวางแผนก่อนว่าจะให้ใครจะทำอะไรก่อนหรือหลัง เจ้า HLS ก็ต้องทำงานแบบนั้น แต่กล่าวคือ มันต้องตัดสินใจว่าการคำนวณแต่ละอย่างจะเกิดขึ้นใน Clock Cycle ไหน ยกตัวอย่างเช่น
a = b + c
d = a + e
บรรทัดที่สองต้องรอผลจากบรรทัดแรกก่อน ดังนั้น HLS อาจจัดให้การบวกครั้งแรกเกิดใน Cycle ที่ 1 และการบวกครั้งที่สองเกิดใน Cycle ที่ 2 ขั้นนี้เองที่เรียกว่า Scheduling ที่จะมีผลโดยตรงกับความเร็วของวงจร
เมื่อ HLS รู้แล้วว่าต้องทำอะไรตอนไหน ขั้นตอนต่อไปก็คือการตัดสินใจว่าจะใช้ฮาร์ดแวร์กี่อัน สมมติว่ามีการคูณเลขเกิดขึ้น 20 ครั้ง คำถามก็คือ มันควรสร้าง Multiplier 20 ตัวเลยหรือไม่ ถ้าสร้างทั้งหมด วงจรจะเร็วมาก แต่ก็ต้องใช้พื้นที่บน FPGA จำนวนมากเหมือนกัน แต่ในทางกลับกัน ถ้าใช้ Multiplier เพียงตัวเดียวแล้ววนใช้งานซ้ำ พื้นที่ก็จะน้อยลง แต่ความเร็วก็จะลดลงด้วย เจ้า HLS จะช่วยหาจุดสมดุลระหว่างความเร็วและทรัพยากรให้ได้ นี่คือเหตุผลว่าทำไมโค้ดเดียวกันจะสามารถสร้างฮาร์ดแวร์ได้หลายรูปแบบเลยทีเดียว ขึ้นอยู่กับการตั้งค่าของนักออกแบบนั่นเอง
ไม่กี่ปีที่ผ่านมา HLS ได้รับความนิยมอย่างมากในงาน AI ต่าง ๆ เพราะอัลกอริทึมของ Machine Learning มักจะประกอบไปด้วยการคูณและบวกจำนวนมหาศาล ตัวอย่างเช่น Neural Network การจะคำนวณแต่ละ Layer อาจจะมีการดำเนินการเป็นล้าน ๆ ครั้ง เพราะอย่างนั้นการจะเขียน RTL ด้วยมือคงแทบจะเป็นไปไม่ได้เลย แต่ถ้าเรามีโมเดลที่เขียนใน C++ อยู่แล้ว เราก็จะสามารถเอามันมาผ่าน HLS เพื่อสร้าง Accelerator บน FPGA ได้รวดเร็วกว่าเดิมมาก บริษัทเทคโนโลยีหลาย ๆ ที่เลยเริ่มใช้ HLS มาเป็นเสมือนกาวที่ช่วยเชื่อมระหว่างโลกของ Software และ Hardware
แน่นอนว่าสิ่งที่ทำให้ HLS ได้รับความนิยมอย่างมากเลยก็คือการที่มันช่วยลดเวลาในการพัฒนางาน เพราะจากที่งานเคยใช้เวลาหลายเดือนในการเขียน RTL มันอาจจะทำให้งานเสร็จได้ภายในไม่กี่อาทิตย์ และมันยังช่วยให้คนที่ไม่ใช่วิศวกรฮาร์ดแวร์สามารถเข้ามาพัฒนา FPGA ได้ง่ายขึ้น เรียกได้ว่า นักวิจัยด้าน AI พวกนักวิทยาศาสตร์ข้อมูล หรือโปรแกรมเมอร์ทั่วไป ก็จะสามารถใช้ความรู้ C/C++ ที่มีอยู่ได้เลย และอีกหนึ่งข้อดีที่ไม่พูดถึงลยไม่ได้คือ การทดลองไอเดียใหม่ๆ สามารถทำได้เร็วมากยิ่งขึ้น เพราะในกรณี ถ้าอัลกอริทึมเปลี่ยน เราแค่เข้าไปแก้ไขโค้ดต้นฉบับแล้วแปลงออกมาใหม่ ไม่ต้องลำบากไปแก้ RTL จำนวนมากเองให้เหนื่อยอีกต่อไป
แม้ HLS จะช่วยเราได้มาก แต่ก็ใช่ว่ามันจะเป็นเวทมนตร์ที่แก้ปัญหาได้ทุกอย่าง เราต้องเข้าใจก่อนว่าโค้ด C ทุกแบบไม่ได้เหมาะกับการสร้างฮาร์ดแวร์ บางฟังก์ชันที่ใช้ได้บน CPU และอาจจะไม่สามารถแปลงเป็นวงจรได้ง่ายขนาดนั้น อีกทั้งในบางครั้ง RTL ที่สร้างขึ้นมาอัตโนมัติอาจจะมีประสิทธิภาพต่ำกว่าการออกแบบด้วยมือคน โดยเฉพาะกับงานที่ต้องการประสิทธิภาพสูง วิศวกรระดับมืออาชีพต้องมีการปรับแต่ง RTL ในส่วนสำคัญ ๆ ด้วยตนเองบ้าง และในการจะกระทำนั้น ผู้ใช้งานเองก็ยังต้องเข้าใจฮาร์ดแวร์อยู่ดี เพราะเนื่องจาก ถึงแม้จะเขียน C ได้ แต่ถ้าไม่เข้าใจแนวคิดเรื่อง Clock, Latency, Pipeline หรือ Memory Architecture ผลที่ออกมาก็อาจจะได้วงจรที่ทำงานช้ากว่าที่คิดไว้ สรุปก็คือ HLS ไม่ได้ทำให้ความรู้ฮาร์ดแวร์หมดความสำคัญไป แต่ช่วยลดความซับซ้อนของการลงรายละเอียดต่างหาก
ทางเดินของเจ้า HLS ในอนาคตดูจะโรยไปด้วยกลีบกุหลาบ ตอนนี้ FPGA ถูกนำไปใช้ในศูนย์ข้อมูล ระบบ AI รถยนต์อัตโนมัติ ระบบสื่อสาร 5G และอุปกรณ์ IoT จำนวนมาก และความต้องการนักพัฒนาฮาร์ดแวร์เองก็เพิ่มขึ้นเรื่อย ๆ ในขณะที่จำนวนคนที่เชี่ยวชาญ RTL มีอยู่น้อย HLS เลยกลายเป็นเครื่องมือสำคัญในการลดช่องว่างตรงนี้ หลาย ๆ คนเลยมองว่าอนาคตของการออกแบบฮาร์ดแวร์จะค่อย ๆ เปลี่ยนจากการเขียน RTL ด้วยมือ ไปสู่การออกแบบในระดับอัลกอริทึมมากขึ้นแทน เหมือนกับในอดีตที่โปรแกรมเมอร์เคยเขียนภาษา Assembly มาก่อนแล้วเปลี่ยนมาใช้ภาษา C นั่นเอง
High-Level Synthesis หรือ HLS คือเทคโนโลยีที่ช่วยเปลี่ยนโค้ด C/C++ ให้กลายเป็น RTL สำหรับ FPGA และ ASIC มันเข้ามาเป็นเหมือนสะพานเชื่อมระหว่างโลกของซอฟต์แวร์และฮาร์ดแวร์ ทำให้นักพัฒนาสามารถโฟกัสกับอัลกอริทึมแทนการเขียนวงจรระดับล่างที่ซับซ้อนได้และเบื้องหลังของ HLS ก็มีทั้งการวางตารางการทำงาน การจัดสรรทรัพยากร และการปรับแต่งลูปเพื่อดึงศักยภาพของฮาร์ดแวร์ออกมาให้มากที่สุด แต่ถึงอย่างนั้นมันก็ยังมีข้อจำกัดอยู่บ้าง และยังไม่สามารถแทนที่การออกแบบ RTL ด้วยมือได้ทั้งหมด แต่มันก็ช่วยลดเวลาในการพัฒนา เพิ่มความยืดหยุ่น และเปิดประตูให้คนจำนวนมากเข้ามาสู่โลกของ FPGA ได้ง่ายกว่าเดิม