QxA: การพัฒนา CPU เขาใช้ภาษาอะไรกันครับ พวก Intel/AMD
ผมตั้งคำถามนี้ เพราะพยายามเข้าใจ CPU architecture ที่มันซับซ่อน และมันทำให้ผมสงสัยว่า ทั้งหมดเนี้ยทำขึ้นมาจาก แผงวงจรอิเล็กทรอนิกส์ อย่างเดี่ยวเลยหรือ อย่าง Memory Controller กะ Queue แผงวงจร ทำได้หรือ ถ้าทำได้ ทำอย่างไร แล้วถ้าทำได้แล้วเค้าอะไร เลยลองตั้งคำถามดู
A:
การพัฒนา CPU มันมีหลายขั้นตอนมากครับ เรื่องแรกเลยก็คือพัฒนา Instruction Set Architecture (ISA) ก่อนว่า CPU ของเราจะรองรับคำสั่งอะไรบ้าง (Load, store, jump, jump if, +, -, *, /, etc. etc) ทีนี้พอมี ISA เป็นมาตรฐานแล้วเราก็จะออกแบบ CPU ที่สามารถทำงานตามคำสั่ง (Instruction) เหล่านั้นได้
ซึ่งการออกแบบ CPU นี้เราจะใช้สิ่งที่เรียกว่า Field-programmable gate array (FPGA) ซึ่งทำหน้าที่คล้ายกับ CPU ที่เราสามารถแก้ไขการทำงานผ่าน code ได้ (ไม่ต้องผลิตใหม่)
ภาษาที่เราใช้ในที่นี้เรียกว่า Hardware Design Language (HDL) เช่น Verilog หรือ VHDL ซึ่งใช้บรรยายการทำงานของ Hardware เช่น มี module อะไร สายไฟเส้นนี้ต่อไปที่ไหนบ้าง ฯลฯ
ทีนี้พอเราโปรแกรม HDL ลงบน FPGA และทดสอบจนได้ประสิทธิภาพที่พอใจแล้ว เราก็สามารถนำไปผลิตเป็น chip จริง ๆ ที่จะมีราคาต่อหน่วยถูกกว่าและมีประสิทธิภาพที่ดีกว่า FPGA ได้ แต่ในส่วนนี้เกินความรู้ผมแล้ว ต้องพึ่งท่านอื่นมาอธิบาย
ทั้งนี้ ไม่ใช่แค่ CPU ที่ถูกออกแบบอย่างนี้ Application Specific Integrated Circuit (ASIC) ที่หลายคนเอาไปขุด cryptocurrency กันก็ถูกพัฒนาแบบนี้เช่นกัน
ถ้าใครสนใจศึกษาละเอียด ผมขอแนะนำหนังสือ สถาปัตยกรรมคอมพิวเตอร์ การออกแบบและวิเคราะห์ ของอ.เกริก ภิรมย์โสภา (ISBN 9786164681156)
เพิ่มเติมครับ ผู้ผลิตอย่าง intel หรือ amd มีภาษาของตัวเองที่มักจะเป็นvariation ของ verilogหรือ vhdl ครับ และก็ไม่ได้ใช้แต่ภาษาพวกนี้ เพราะการออกแบบก็มีหลาย level หากอยากลงรายละเอียด จะลองถามพี่พี่คนไทยที่เคยทำงานที่ intel ก็ได้ครับ มี อยู่หลายคน
Papon Chaisrisookumporn ได้อธิบายไว้มากพอสมควร ผมจะขอเสริมเพราะคิดว่าผู้ถามน่าจะมองในมุมของ software มากกว่า hardware ผมจึงขออธิบายในมุมที่โปรแกรมเมอร์น่าจะเข้าใจได้ง่าย
สำหรับโปรแกรมเมอร์อาจเคยเรียนกลไกการทำงานภายใน CPU มาบ้างเช่น การนำ (Fetch) รหัสคำสั่งจากหน่วยความจำเข้าไปเก็บไว้ใน Instruction Register ของ CPU หลังจากนั้น Control Unit จะมาถอดรหัสคำสั่ง (decode) แล้วทำงานตามคำสั่ง (execute) ซึ่ง control unit จะไปควบคุม Arithmetic Logic Unit (ALU) ให้ทำงานตามลำดับขั้นตอนของแต่ละคำสั่ง เมื่อทำเสร็จก็ไป fetch คำสั่งใหม่เข้ามาทำงานในรอบต่อไป กลไกนี้เรียกว่า Instruction Cycle ซึ่งคนที่เขียนโปรแกรมภาษาเครื่องและ Assembly จะเข้าใจดี แต่สำหรับคนที่ออกแบบ CPU ต้องมีความรู้เรื่อง digital electronic รู้วงจรทางตรรกะ เช่น AND, OR, Comparator และวงจรคำนวณเช่น Adder ซึ่งใช้ใน ALU รู้วงจร encoder decoder ซึ่งใช้ใน control unit
control unit เปรียบเสมือนคอมพิวเตอร์ขนาดจิ๋วซ้อนลงไปใน cpu อีกชั้นหนึ่งซึ่งสามารถโปรแกรมได้เรียกว่า microprogramming ตัวโปรแกรมเรียกว่า microcode แต่ละคำสั่งเรียก microinstruction ผู้ออกแบบ CPU จะเขียนโปรแกรมด้วยภาษา microassembly แล้วแปลด้วย microassembler ตอนออกแบบ CPU คนออกแบบต้องคิดว่า CPU ควรมีคำสั่งอะไรบ้างก็มาสร้าง microcode เพื่อควบคุมให้ CPU ทำงานตามลำดับขั้นตอนของคำสั่งนั้น CPU บางรุ่นมีคำสั่งที่ทำงานซับซ้อนรองรับการเขียนโปรแกรมภาษาขั้นสูง (High Level Language) เพื่อลดจำนวนคำสั่งในภาษาเครื่องเมื่อมีการแปลภาษาขึ้นสูงด้วย compiler วิธีการนี้ใช้มานานใน CPU ของเครื่อง mainframe ที่เห็นนำมาใช้ในปัจจุบันเช่นออกแบบ CPU ให้เข้าใจ byte code ของภาษาจาวา
microcode ช่วยให้การออกแบบ CPU มีความยืดหยุ่น ลดความซับซ้อนของวงจรใน CPU (แต่มาเพิ่มความซับซ้อนใน microcode แทน) ปรับเปลี่ยนหรือเพิ่มคำสั่งภาษาเครื่องได้ง่าย และแก้ bug ใน CPU ด้วยการแก้ microcode โดยไม่ต้องออกแบบวงจรทางตรรกะใหม่
ที่พูดมาเป็นเรื่องของ Software บางคนเรืยก firmware ของ CPU ทำนองเดียวกับ Firmware ของ Embedded system ส่วน Hardware หรือวงจรทางตรรกะของระบบดิจิทัลนั้นปัจจุบันสามารถออกโดยใช้ Software ได้ง่ายเพราะมี library ของวงจรประเภทต่างๆ ให้เรียกใช้โดยไม่ต้องออกแบบวงจรในรายละเอียดเองทำให้ออกแบบวงจรระบบดิทัลได้ง่ายและเร็วขึ้นมาก มีภาษาที่ช่วยในการออกแบบเรียกเป็นการทั่วไปว่า Hardware Description Language (HDL) ซึ่งก็มีภาษาให้ใช้หลายภาษาเช่น Verilog, VHDL และมี IDE ให้เขียนและ simulate การทำงาน เมื่อออกแบบเสร็จแล้วสามารถส่งไฟล์ให้โรงงานผลิต chip ไปผลิตได้ หรือซื้อพวก FPGA มาโปรแกรมเองก็ได้
ส่วนคำถามของ จขพ. ผมว่าบริษัทแนวหน้าระดับ Intel และ AMD เขาน่ามีภาษาของเขาเองที่เป็น proprietary และเก็บไว้เป็นความลับ
ถ้าอย่างนั้นแสดงว่า logic gate ใน CPU จะเป็นการออกแบบให้ support กับ microinstructions ทั้งหมดที่เป็นไปได้ใช่ไหมครับ ไม่ใช่ support ตาม instructions ที่มีตาม CPU's datasheet
นวพล อิสระธนาชัยกุล ใช่ครับ ยกตัวอย่างเช่น ใน CPU ยุคแรก ๆ มีแต่วงจรบวกเลข (adder) ยังไม่มีวงจรสำหรับคูณ แต่มีคำสั่งคูณซึ่งเป็น instruction ให้ใช้ การทำงานของคำสั่งคูณ control unit จะไปเรียกใช้วงจรบวกเลขวนลูบซ้ำหลายครั้ง เช่น 5x4 ก็จะนำเลข 5 มาบวกกัน 4 ครั้ง จะเห็นว่า hardware วงจรไม่ซับซ้อนแต่ใช้ microinstruction ทำงานแทน การลบเลขก็ทำนองเดียวกัน ไม่มีวงจรลบเลข แต่ใช้วิธีทำให้ตัวเลขมีค่าติดลบซึ่งวงจรทำง่ายมากแล้วจึงนำมาบวกกัน แต่การทำแบบนี้การทำงาน 1 instruction จะประกอบด้วยการทำงานระดับ microinstruction หลายรอบ ต้องใช้สัญญาณนาฬิกา (clock) หลายรอบจึงจะทำงานเสร็จ 1 instruction ยิ่งการคำนวณตัวเลขแบบมีทศนิยมจะต้องทำหลายรอบ การทำงานจะช้า เขาจึงออกแบบ CPU ให้มีวงจรที่ซับซ้อนทำงานได้หลายอย่างขึ้นเพื่อลดการทำงานของ microinstruction เมื่อก่อนจะมีตัวเร่งการคำนวณที่เรียกว่า Math coprocessor แยกออกมานอก CPU เป็น option ที่ต้องซื้อเพิ่มเติมเพื่อช่วยให้การคำนวณตัวเลขแบบมีทศนิยมทำได้เร็วขึ้น แต่ปัจุบันตัวเร่งการคำนวณพวกนี้ถูกใส่ลงไปใน CPU กันแล้วทั้งนั้น