วิธีการออกแบบ opcode สำหรับ CPU อย่างมีประสิทธิภาพ


12

ฉันกำลังสร้างซีพียู 16 บิตที่เรียบง่ายใน Logisim และเตรียม ALU และ opcodes ที่ฉันต้องการ ตอนนี้ฉันพบว่ามันยากที่จะหารหัสที่ถูกต้องสำหรับคำสั่งเพื่อให้ subcircuits ต่าง ๆ (เช่นตรรกะเลขคณิต) ไม่ต้องการสายควบคุมทั้งหมด (ที่สร้างการเข้ารหัส) เป็นอินพุต แต่น้อยที่สุดเท่าที่จะทำได้ มีกลยุทธ์หรือวิธีการใดที่ช่วยในการออกแบบ opcode ที่มีประสิทธิภาพหรือไม่?

ขอบคุณล่วงหน้า


1
สร้าง ALU ของคุณก่อนและดูว่าสายควบคุมนั้นต้องการอะไร จากนั้นต่อสายโดยตรงกับ "คำสั่งปัจจุบัน" ลงทะเบียน เหมือนกันสำหรับตรรกะการควบคุมการเข้าถึงหน่วยความจำและคลาสอื่น ๆ ที่สำคัญของ opcodes จากนั้นใช้สิ่งที่เหลืออยู่เพื่อเลือกว่าจะเปิดใช้งานวงจรย่อยใด
253751

1
นอกจากนี้ยังมีกระดาษต้นฉบับจาก Ken Chapman ของ statemachine ที่สามารถตั้งโปรแกรมได้ 8 บิต KCPSM หรือที่เรียกว่า PicoBlaze มันอธิบายถึงวิธีการที่เขาเลือกคำแนะนำและออกแบบ ISA dc.uba.ar/materias/disfpga/2010/c2/descargas/ …
Paebbels

คำตอบ:


9

ฉันคิดว่ามันเป็นวิธีการที่ดีในการศึกษาชุดคำสั่งอื่น ๆ

อันเล็ก ๆ น่าจะเป็น MSP430 จาก TI เป็นตัวประมวลผล 16 บิตพร้อมคำแนะนำประมาณ 22 ข้อ

http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf

คุณสามารถดู Atmel AVRs ที่พวกเขายังมีชุดคำสั่งที่ค่อนข้างเล็ก

ในโครงการเล็ก ๆ ของฉันฉันพยายามพัฒนาตัวประมวลผล 32 บิตอย่างง่ายใน VHDL ด้วยชุดคำสั่งขนาดเล็ก (14 คำสั่ง):

http://www.blog-tm.de/?p=80

เนื่องจากเวลาว่างปัจจุบันของฉันยังไม่เสร็จสมบูรณ์ คำแนะนำถูกนำไปใช้ แต่มีสองคำสั่งที่ไม่ผ่านการทดสอบและอาจมีบางสถานะหาย


แต่ฉันไม่พบสิ่งที่ฉันสามารถดูได้ว่าการเข้ารหัสที่แท้จริงคืออะไรและทำไมจึงเลือกให้เป็นเช่นนี้
Benjoyo

คุณสามารถค้นหา actuall เข้ารหัสใน repo นี้: github.com/TM90/MISC_Processor/raw/master/Documentation/... เหตุผลที่ฉันเลือกการเข้ารหัสเหล่านี้ในแบบที่ตรรกะในตัวถอดรหัสคำสั่งมีน้อยที่สุด
TM90

7

ศึกษา (แต่ไม่ทำซ้ำ) แนวทาง ARM ในการเขียนโค้ดการสอน มันเน้นคำนำหน้าอย่างมาก (เช่นวิธี Huffman tree ที่แนะนำโดย Dzarda) และมีความสม่ำเสมอสูงในแง่ของการเลือกลงทะเบียนส่วนหนึ่งของการเรียนการสอน

วิธีการที่ไม่น่าเชื่อ แต่น่าเชื่อถือคือการแจกแจงสัญญาณควบคุมทั้งหมดที่คุณมีซึ่งอาจจะมากกว่า 16 บิตจากนั้นพยายามลดการใช้ตรรกะแบบแผนที่ Karnaugh ให้น้อยที่สุด


ฉันไม่เข้าใจความหมายของสัญญาณควบคุม
Benjoyo

สิ่งที่ฉันพบและชอบเกี่ยวกับ ARM คือฟิลด์เงื่อนไขฉันจะรวมมันไว้ด้วย
Benjoyo

สัญญาณควบคุมเป็นอินพุตสำหรับมัลติเพล็กเซอร์ต่างๆและช่วยให้สามารถควบคุมข้อมูลโดยตรงระหว่างส่วนต่าง ๆ ของ CPU
pjc50

สำหรับสถาปัตยกรรมแบบ 16 บิตฉันไม่คิดว่าการเข้ารหัสคำสั่งของ ARM นั้นเหมาะสม Mayby thumb2 ดีกว่า แต่ฉันชอบวิธีการเข้ารหัสของ MIPS ง่ายและเข้าใจง่ายแม้ว่าจะสิ้นเปลืองบ้าง
phuclv

4

เมื่อฉันลองทำซีพียู 4 บิตพร้อมคอร์ความยาวคำสั่ง 8 บิตใน Logisim ลงเอยด้วยเครื่องสถานะเรียบง่ายมากกว่าซีพียูจริงๆ

สิ่งสุ่มที่จะมองหา

  • ต้นไม้ Huffman
  • ความยาวคงที่หรือการเข้ารหัสตัวแปร?
  • มันเป็นการออกแบบของ von Neumann ที่มีพื้นที่ที่อยู่เดียวหรือ Harvard-style พร้อม data / program แยกต่างหาก

วิดีโอที่ยอดเยี่ยมเกี่ยวกับ Computerphile เกี่ยวกับต้นไม้ Huffman:

https://www.youtube.com/watch?v=umTbivyJoiI


การเข้ารหัส Huffman จะไม่ทำงานสำหรับการเข้ารหัสความยาวคงที่ใช่ไหม?
Benjoyo

@Benjoyo ฉันสามารถจินตนาการถึงสถานการณ์ด้วยบิตอะไหล่ที่ใช้สำหรับรูปแบบของคำแนะนำที่ใช้มากที่สุดดังนั้นจึงมีฟังก์ชั่นเพิ่มเติม
Dzarda

แต่ฉันไม่ได้รับการเพิ่มประสิทธิภาพแบบนี้ มันไม่ได้ช่วยฉันในการออกแบบวงจร เป้าหมายเมื่อใช้การเข้ารหัส Huffman สำหรับ opcode คืออะไร
Benjoyo

4

ISA ที่ฉันเขียนสำหรับชั้นเรียนมีรหัส op 4 บิตเช่นนั้น: 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

แทนที่จะเป็นสิ่งที่ดีที่สุดนี่เป็นหนึ่งในรูปแบบที่ง่ายกว่าในการสร้าง / ออกแบบประตูเพราะสัญญาณอินพุตของบิตเดียวสามารถควบคุมได้อย่างสมบูรณ์ว่าพา ธ แบบลอจิกนั้นมีอะไรบ้าง อีกวิธีหนึ่งคุณสามารถHuffman Codeสัญลักษณ์ที่ใช้มากที่สุดของคุณและ zero pad พวกเขาเพื่อรับรหัส op ความยาวคงที่


การเพิ่มประสิทธิภาพแบบนี้เป็นสิ่งที่ฉันกำลังมองหาในขณะนี้ แต่ฉันมี opcode 5 บิตและฉันต่อสู้กับการรวมกลุ่มคำสั่งเข้าด้วยกันเพื่อให้เข้าใจได้ง่ายในวงจร
Benjoyo

@ Benjoyo คุณสามารถมีคำแนะนำ ALU มากกว่าหนึ่งชุดพร้อมชุดบิตบน นอกจากนี้การครอบคลุมเงื่อนไขการกระโดดของฉันก็ค่อนข้างอ่อนแอและสาขาปกติส่วนใหญ่ต้องการคำแนะนำสองคำ โดยทั่วไปฉันคิดว่าหมวดหมู่เป็น: คณิตศาสตร์ / การควบคุม / หน่วยความจำ

3

สิ่งหนึ่งที่คุณต้องพิจารณาคือว่าจะอนุญาตให้มีการสอนหลายคำหรืออะไรก็ตามที่ "ทำหน้าที่" เหมือนการสอนหลายคำ หากคุณเป็นเช่นนั้นคุณอาจต้องการพิจารณาว่าจะใช้คำแนะนำเพิ่มเติมตามคำแนะนำหลักหรือคำนำหน้าก่อนหน้านั้นหรือไม่ การอนุญาตให้ส่วนนำหน้าและคำที่ตามมาสามารถเพิ่มความซับซ้อนของการจัดการขัดจังหวะได้ แต่สามารถหลีกเลี่ยงความต้องการที่จะพอดีกับคำแนะนำที่ไม่ค่อยได้ใช้ในพื้นที่ opcode เดียวกันกับที่ใช้กันทั่วไป

หากมีการดึงคำแนะนำในวัฏจักรก่อนที่พวกเขาจะดำเนินการอย่างใดอย่างหนึ่งอาจมีคำสั่ง "สาขาตามเงื่อนไข" ซึ่งอาจทำให้คำคำสั่งถัดไปถูกข้ามหรือมิฉะนั้นจะมีการถ่ายโอนเนื้อหาลงในโปรแกรมเคาน์เตอร์โดยตรง การออกแบบดังกล่าวอาจเพิ่มความซับซ้อนพิเศษบางอย่างในการจัดลำดับการขัดจังหวะ แต่สามารถบรรเทาความต้องการในการใช้พื้นที่ opcode สำหรับคำสั่ง "branch", "jump" และ "call" ส่วนใหญ่ในขณะที่ช่วยให้เงื่อนไขสาขาได้กว้างขึ้น กว่าจะเป็นไปได้ เนื่องจากสาขาที่ใช้โดยทั่วไปจะต้องมีรอบการตายหลังจากการดำเนินการตามคำสั่งเองโดยไม่คำนึงถึงที่อยู่มาจากการมีที่อยู่มาจากคำต่อไปนี้ซึ่งได้รับการดึง แต่จะไม่ถูกดำเนินการไม่มีค่าใช้จ่ายเพิ่มเติมใด ๆ เวลา.

แม้ว่าการย้ายที่อยู่เป้าหมายออกจากคำสั่งสาขาจะช่วยลดจำนวนพื้นที่ opcode ที่พวกเขาฮุบได้ แต่รูปแบบ opcode แบบ 16 บิตยังค่อนข้างแน่น การใช้คำแนะนำคำนำหน้าสามารถช่วยได้ ตัวอย่างเช่นหากต้องการให้มีการลงทะเบียน 32 ครั้งการอนุญาตให้ลงทะเบียนใด ๆ ที่ระบุอย่างอิสระเช่น source1, source2 และปลายทางจะต้องมี 15 บิตใน opcode ซึ่งอนุญาตให้มีคำสั่งทั้งหมดสองคำ ไม่มีประโยชน์มาก ในทางกลับกันความสามารถในการใช้ตัวลงทะเบียน 32 ตัวสำหรับตัวถูกดำเนินการสามตัวแต่ละตัวน่าจะดี หนึ่งสามารถสร้างความสมดุลสองเป้าหมายโดยมีการดำเนินการ ALU ใด ๆ ซึ่งไม่ได้นำหน้าด้วยคำนำหน้าใช้แปดบิตเพื่อให้สองตัวเลือกการลงทะเบียนหนึ่งในสิบหก แต่มีการดำเนินการ ALU ซึ่งทันทีตามคำนำหน้าใช้บิตบางส่วนในคำนำหน้า ด้วยแปดจากคำแนะนำต่อไปนี้ เพื่อให้สามารถเลือกแหล่งที่มาและปลายทางได้อย่างอิสระจากชุดเต็ม 32 คำแนะนำที่ใช้ในการลงทะเบียนอาจใช้คำสองคำ / รอบมากกว่าหนึ่งคำ แต่ในบางกรณีการแลกเปลี่ยนอาจคุ้มค่า ปัญหาที่ใหญ่ที่สุดในการใช้คำนำหน้าคือต้องป้องกันไม่ให้อินเตอร์รัปต์เกิดขึ้นระหว่างคำนำหน้าและคำสั่งถัดไปหรือให้แน่ใจว่าหากการขัดจังหวะเกิดขึ้นที่นั่นคำแนะนำหลังจากคำนำหน้าจะยังคงใช้รีจิสเตอร์ที่ถูกต้อง -counter บันทึกตรรกะเก็บที่อยู่ของคำสั่งที่ไม่ใช่คำนำหน้าดำเนินการล่าสุด] แต่ในบางกรณีการแลกเปลี่ยนอาจคุ้มค่า ปัญหาที่ใหญ่ที่สุดในการใช้คำนำหน้าคือต้องป้องกันไม่ให้อินเตอร์รัปต์เกิดขึ้นระหว่างคำนำหน้าและคำสั่งถัดไปหรือให้แน่ใจว่าหากการขัดจังหวะเกิดขึ้นที่นั่นคำแนะนำหลังจากคำนำหน้าจะยังคงใช้รีจิสเตอร์ที่ถูกต้อง -counter บันทึกตรรกะเก็บที่อยู่ของคำสั่งที่ไม่ใช่คำนำหน้าดำเนินการล่าสุด] แต่ในบางกรณีการแลกเปลี่ยนอาจคุ้มค่า ปัญหาที่ใหญ่ที่สุดในการใช้คำนำหน้าคือต้องป้องกันไม่ให้อินเตอร์รัปต์เกิดขึ้นระหว่างคำนำหน้าและคำสั่งถัดไปหรือให้แน่ใจว่าหากการขัดจังหวะเกิดขึ้นที่นั่นคำแนะนำหลังจากคำนำหน้าจะยังคงใช้รีจิสเตอร์ที่ถูกต้อง -counter บันทึกตรรกะเก็บที่อยู่ของคำสั่งที่ไม่ใช่คำนำหน้าดำเนินการล่าสุด]

การใช้คำแนะนำแบบหลายคำจะทำให้แง่มุมบางอย่างของการออกแบบยากขึ้น แต่อาจลดความจำเป็นในการตัดสินใจเรื่องยากอื่น ๆ


0

ผู้ชายคนนี้มีรายละเอียดที่ดีที่สุดในการทำความเข้าใจการเดินสายอย่างหนักในส่วนของฮาร์ดโค้ดที่ถอดรหัสซึ่งจะอธิบายบรรทัดควบคุมสำหรับซีพียูฮาร์ดโค้ด: http://minnie.tuhs.org/CompArch/Tutes/week03.html อย่างที่คุณเห็น ตัวเลือกใน Opcodes ส่งผลกระทบต่อความซับซ้อนของการถอดรหัสแบบลอจิก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.