อ่าน 5 นาที
ตัวถอดรหัสที่อยู่ผลรวม
ใน การออกแบบ CPU การใช้ ตัวถอดรหัสแอดเดรสแบบผลรวม (SAD) หรือ ตัวถอดรหัสหน่วยความจำแอดเดรสแบบผลรวม (SAM) เป็นวิธีการลดความหน่วงใน การเข้าถึง แคชของ CPU และการคำนวณแอดเดรส (ฐาน +...
ตัวถอดรหัสที่อยู่ผลรวม
ในการออกแบบ CPUการใช้ตัวถอดรหัสแอดเดรสแบบผลรวม (SAD)หรือตัวถอดรหัสหน่วยความจำแอดเดรสแบบผลรวม (SAM)เป็นวิธีการลดความหน่วงใน การเข้าถึง แคชของ CPUและการคำนวณแอดเดรส (ฐาน + ออฟเซ็ต) ซึ่งทำได้โดยการรวมการดำเนินการสร้างแอดเดรสแบบผลรวมเข้ากับการดำเนินการถอดรหัสในแคช SRAM
ภาพรวม
โดยปกติแล้ว แคชข้อมูล L1 ควรอยู่ในส่วนที่สำคัญที่สุดของ CPU เนื่องจากมีไม่กี่สิ่งที่จะช่วยเพิ่มจำนวนคำสั่งต่อรอบการทำงาน (IPC) ได้โดยตรงเท่ากับแคชข้อมูลที่ใหญ่ขึ้น อย่างไรก็ตาม แคชข้อมูลที่ใหญ่ขึ้นก็ใช้เวลาในการเข้าถึงนานขึ้น และการใช้เทคนิคไปป์ไลน์กับแคชข้อมูลจะทำให้ IPC แย่ลง วิธีหนึ่งในการลดความหน่วงในการเข้าถึงแคชข้อมูล L1 คือการรวมการสร้างแอดเดรสและการดำเนินการถอดรหัสในแคช SRAM เข้าด้วยกัน
การดำเนินการบวกเพื่อสร้างที่อยู่ยังคงต้องดำเนินการต่อไป เนื่องจากหน่วยอื่นๆ ในท่อหน่วยความจำจะใช้ที่อยู่เสมือนที่ได้ การบวกนั้นจะดำเนินการควบคู่ไปกับการบวก/ถอดรหัสแบบรวมที่อธิบายไว้ในที่นี้
การเกิดซ้ำที่ให้ผลกำไรมากที่สุดในการเร่งความเร็วคือ การโหลดข้อมูล ตามด้วยการใช้ข้อมูลที่โหลดนั้นในชุดของการดำเนินการจำนวนเต็มที่นำไปสู่การโหลดอีกครั้ง สมมติว่าผลลัพธ์ของการโหลดได้รับการข้ามด้วยลำดับความสำคัญเดียวกันกับผลลัพธ์ของจำนวนเต็ม ดังนั้นจึงสามารถสรุปการเกิดซ้ำนี้ได้เป็นการโหลดข้อมูลตามด้วยการโหลดอีกครั้ง ราวกับว่าโปรแกรมกำลังทำงานตามรายการเชื่อมโยง
ส่วนที่เหลือของหน้านี้สมมติว่าสถาปัตยกรรมชุดคำสั่ง (ISA) มีโหมดการกำหนดแอดเดรส แบบเดียว (รีจิสเตอร์+ออฟเซ็ต) แคชข้อมูลแบบดัชนีเสมือน และการโหลดแบบขยายเครื่องหมายซึ่งอาจมีความกว้างแปรผันได้ ISA RISC ส่วนใหญ่ ตรงกับคำอธิบายนี้ ใน ISA เช่นIntel x86อินพุตสามหรือสี่ตัวจะถูกบวกกันเพื่อสร้างแอดเดรสเสมือน การบวกแบบหลายอินพุตสามารถลดลงเหลือการบวกแบบสองอินพุตได้ด้วยตัวบวกแบบบันทึกตัวทด และปัญหาที่เหลือจะอธิบายไว้ด้านล่าง ดังนั้น การเกิดซ้ำที่สำคัญคือตัวบวกตัวถอดรหัสสายคำของ SRAM สายบิตของ SRAM ตัวขยายสัญญาณ ตัวมัลติเพล็กเซอร์ สำหรับควบคุมไบต์ และตัวมัลติเพล็กเซอร์บายพาส
สำหรับตัวอย่างนี้ สมมติว่าใช้แคชข้อมูลแบบ direct-mapped ขนาด 16 KBซึ่งส่งค่าที่จัดเรียงแบบ doubleword (8 ไบต์) กลับมา แต่ละบรรทัดของ SRAM มีขนาด 8 ไบต์ และมีทั้งหมด 2048 บรรทัด โดยระบุแอดเดรสด้วย Addr[13:3] แนวคิดของ SRAM ที่ระบุแอดเดรสแบบผลรวมนั้นใช้ได้ดีกับแคชแบบ set associative เช่นกัน
แคชแบบระบุผลรวม: ยุบรวมตัวบวกและตัวถอดรหัส
ตัวถอดรหัส SRAM สำหรับตัวอย่างนี้มีอินพุต 11 บิต Addr[13:3] และเอาต์พุต 2048 ตัว ซึ่งเป็นสายคำที่ถอดรหัสแล้ว โดยแต่ละสายคำจะถูกขับให้มีระดับสูงเพื่อตอบสนองต่อค่า Addr[13:3] ที่ไม่ซ้ำกัน
ในรูปแบบที่ง่ายที่สุดของตัวถอดรหัส แต่ละบรรทัดจากทั้งหมด 2048 บรรทัดนั้นเปรียบเสมือนเกต AND บิต 11 บิต (เรียกว่า A[13:3]) และบิตผกผันของบิตเหล่านั้น (เรียกว่า B[13:3]) จะถูกส่งขึ้นไปยังตัวถอดรหัส สำหรับแต่ละบรรทัด บิต 11 บิตหรือบิตผกผันจะถูกป้อนเข้าไปในเกต AND ที่มีอินพุต 11 ตัว ตัวอย่างเช่น เลขฐานสิบ 1026 เท่ากับเลขฐานสอง 10000000010 ฟังก์ชันสำหรับบรรทัดที่ 1026 จะเป็นดังนี้:
wordline[1026] = A[13] & B[12] & B[11] & B[10] & B[9] & B[8] & B[7] & B[6] & B[5] & A[4] & B[3]
ทั้งวงจรทด (carry chain) ของตัวบวกและตัวถอดรหัสจะรวมข้อมูลจากความกว้างทั้งหมดของส่วนดัชนีของแอดเดรส การรวมข้อมูลจากความกว้างทั้งหมดสองครั้งนั้นซ้ำซ้อน หน่วยความจำ SRAM ที่ใช้แอดเดรสแบบผลรวมจะรวมข้อมูลเพียงครั้งเดียวโดยการรวมตัวบวกและตัวถอดรหัสไว้ในโครงสร้างเดียวกัน
โปรดจำไว้ว่า SRAM นั้นถูกกำหนดดัชนีด้วยผลลัพธ์ของการบวก เรียกตัวบวกว่า R (สำหรับรีจิสเตอร์) และ O (สำหรับค่าออฟเซ็ตไปยังรีจิสเตอร์นั้น) ตัวถอดรหัสที่กำหนดดัชนีด้วยผลรวมจะถอดรหัส R+O สำหรับแต่ละบรรทัดของตัวถอดรหัส ให้เรียกหมายเลขบรรทัดว่า L
สมมติว่าตัวถอดรหัสของเราส่งสัญญาณทั้ง R และ O ผ่านแต่ละสายถอดรหัส และแต่ละสายถอดรหัสมีการทำงานดังนี้:
เวิร์ดไลน์[L] = (R+O)==L
(R+O)==L <=> R+OL==0 <=> R+O+~L+1==0 <=> R+O+~L==-1==11..1.
ชุดวงจรบวกเต็ม (full adder) สามารถใช้ลดรูป R+O+~L ให้เป็น S+C ได้ (นี่คือการบวกแบบไม่มีตัวทด) S+C==11..1 <=> S==~C จะไม่มีตัวทดในการบวกครั้งสุดท้าย สังเกตว่าเนื่องจาก C เป็นแถวของตัวทด จึงถูกเลื่อนขึ้นหนึ่งบิต ดังนั้น R[13:3]+O[13:3]+~L[13:3] == {0,S[13:3]} + {C[14:4],0}
ด้วยโครงสร้างนี้ แต่ละแถวในวงจรดีโคเดอร์จะเป็นชุดของตัวบวกเต็ม (full adder) ซึ่งลดค่าในรีจิสเตอร์ฐาน (base register) ค่าออฟเซ็ต (offset) และหมายเลขแถวให้เป็นรูปแบบที่บันทึกค่าทด (carry-save format) และตัวเปรียบเทียบ (comparator ) ฮาร์ดแวร์ส่วนใหญ่จะถูกพิสูจน์ว่าซ้ำซ้อนในภายหลัง แต่สำหรับตอนนี้ การคิดว่าฮาร์ดแวร์ทั้งหมดมีอยู่ในแต่ละแถวจะง่ายกว่า
ไม่สนใจ LSBs: เลือกช้าๆ บน carry
สูตรข้างต้นตรวจสอบผลลัพธ์ทั้งหมดของการบวก อย่างไรก็ตาม ในตัวถอดรหัสแคชของ CPU ผลลัพธ์ทั้งหมดของการบวกคือที่อยู่ไบต์ และแคชมักจะถูกจัดทำดัชนีด้วยที่อยู่ที่มีขนาดใหญ่กว่า ในตัวอย่างของเราคือบล็อก 8 ไบต์ การละเว้นบิตที่มีค่าต่ำสุด (LSB) บางส่วนของที่อยู่เป็นสิ่งที่ควรทำ แต่ไม่สามารถละเว้น LSB ของตัวเลขทั้งสองที่นำมาบวกกันได้ เพราะอาจทำให้เกิดตัวทด (carry-out) ซึ่งจะเปลี่ยนที่อยู่ดับเบิลเวิร์ด (doubleword address)
ถ้า R[13:3] และ O[13:3] ถูกบวกกันเพื่อให้ได้ดัชนี I[13:3] ที่อยู่จริง Addr[13:3] จะเท่ากับ I[13:3] หรือ I[13:3] + 1 ขึ้นอยู่กับว่า R[2:0]+O[2:0] สร้างค่า carry-out หรือไม่ ทั้ง I และ I+1 สามารถดึงมาได้ถ้ามี SRAM สองแบงค์ แบงค์หนึ่งมีที่อยู่เป็นเลขคู่ และอีกแบงค์หนึ่งมีที่อยู่เป็นเลขคี่ แบงค์เลขคู่เก็บที่อยู่ 000xxx, 010xxx, 100xxx, 110xxx เป็นต้น และแบงค์เลขคี่เก็บที่อยู่ 001xxx, 011xxx, 101xxx, 111xxx เป็นต้น จากนั้นสามารถใช้ค่า carry-out จาก R[2:0]+O[2:0] เพื่อเลือก doubleword เลขคู่หรือเลขคี่ที่จะดึงมาในภายหลังได้
โปรดทราบว่าการดึงข้อมูลจาก SRAM สองชุดขนาดครึ่งหนึ่งจะใช้พลังงานมากกว่าการดึงข้อมูลจาก SRAM ชุดขนาดเต็มชุดเดียว เนื่องจากทำให้เกิดการสลับการทำงานในวงจรขยายสัญญาณและวงจรควบคุมข้อมูลมากขึ้น
การสร้างการจับคู่
| I[13:3] | แม้แต่ธนาคารก็ยังต้องต่อสาย | ธนาคารแปลกๆดึงเส้น |
| 100 | 100 | 101 |
| 101 | 110 | 101 |
| 110 | 110 | 111 |
เมื่อพิจารณาจากแผนภาพด้านข้าง ธนาคารคู่จะดึงบรรทัดที่ 110 เมื่อ I[13:3]==101 หรือ I[13:3]==110 ธนาคารคี่จะดึงบรรทัดที่ 101 เมื่อ I[13:3]==100 หรือ I[13:3]==101
โดยทั่วไป ธนาคาร SRAM ที่เป็นเลขคี่ควรดึงค่าบรรทัด Lo==2N+1 เมื่อ I[13:3]==2N หรือ I[13:3]==2N+1 เงื่อนไขทั้งสองสามารถเขียนได้ดังนี้:
ผม[13:3] = Lo-1 => R[13:3] + O[13:3] + ~Lo+1 = 11..11 => ร[13:3] + โอ[13:3] + ~ต่ำ = 11..10 ผม[13:3] = แท้จริง => R[13:3] + O[13:3] + ~ต่ำ = 11..11
ละเว้นตัวเลขหลักสุดท้ายของการเปรียบเทียบ: (S+C)[13:4]==11..1
ในทำนองเดียวกัน ธนาคาร SRAM คู่จะดึงบรรทัด Le==2N เมื่อ I[13:3]==2N หรือ I[13:3]==2N-1 เงื่อนไขเขียนไว้ดังนี้ และอีกครั้งหนึ่ง ให้ละเว้นตัวเลขหลักสุดท้ายของการเปรียบเทียบ
ผม[13:3] = เลอ-1 => ร[13:3] + โอ[13:3] + ~เลอ = 11..10 ผม[13:3] = เลอ => ร[13:3] + โอ[13:3] + ~เลอ = 11..11
การดำเนินการระดับเกต
R 13 ... R 6 R 5 R 4 R 3 O 13 ... O 6 O 5 O 4 O 3 L 13 ... L 6 L 5 L 4 L 3 -------------------------- S 13 ... S 6 S 5 S 4 S 3 C 14 C 13 ... C 6 C 5 C 4
ก่อนที่จะยุบรวมข้อมูลที่ซ้ำซ้อนระหว่างแถว โปรดตรวจสอบ:
แต่ละแถวของตัวถอดรหัสแต่ละตัวสำหรับแต่ละธนาคารสองธนาคารจะใช้ชุดตัวบวกเต็มซึ่งลดตัวเลขสามตัวที่จะบวกกัน (R[13:3], O[13:3] และ L) ให้เหลือตัวเลขสองตัว (S[14:4] และ C[13:3]) บิตต่ำสุด (==S[3]) จะถูกทิ้งไป ตัวทดออก (==C[14]) ก็จะถูกทิ้งไปเช่นกัน แถวจะตรงกันก็ต่อเมื่อ S[13:4] == ~C[13:4] ซึ่งก็คือ &( xor(S[13:4], C[13:4]))
เป็นไปได้ที่จะปรับแต่งวงจรบวกเต็ม (full adder) บางส่วนให้เป็นวงจร AND, OR, XOR และ XNOR แบบ 2 อินพุต เนื่องจากอินพุต L มีค่าคงที่ นิพจน์ที่ได้จะเหมือนกันในทุกสายของวงจรดีโคเดอร์ และสามารถรวบรวมไว้ที่ส่วนล่างได้
S 0;i = S(R i , O i , 0) = R i xor O i S 1;i = S(R i , O i , 1) = R i xnor O i C 0;i+1 = C(R i , O i , 0) = R i and O i C 1;i+1 = C(R i , O i , 1) = R i or O i .
ในแต่ละตำแหน่งตัวเลข จะมีค่า Si ที่เป็นไปได้เพียงสองค่าค่าCiที่เป็นไปได้เพียงสองค่าและค่า XOR ที่เป็นไปได้ระหว่างค่าเหล่านั้นเพียงสี่ค่า:
L i =0 และ L i-1 =0: X 0;0;i = S 0;i xor C 0;i = R i xor O i xor (R i-1และ O i-1 ) L i =0 และ L i-1 =1: X 0;1;i = S 0;i xor C 1;i = R i xor O i xor (R i-1หรือ O i-1 ) L i =1 และ L i-1 =0: X 1;0;i = S 1;i xor C 0;i = R i xnor O i xor (R i-1และ O i-1 ) = !X 0;0;i L i =1 และ L i-1 =1: X 1;1;i = S 1;i xor C 1;i = R i xnor O i xor (R i-1หรือ O i-1 ) = !X 0;1;i
ตัวถอดรหัสที่เป็นไปได้ตัวหนึ่งสำหรับตัวอย่างนี้ อาจคำนวณนิพจน์ทั้งสี่นี้สำหรับแต่ละบิต 4..13 และส่งผ่านสายไฟทั้ง 40 เส้นไปยังตัวถอดรหัส แต่ละบรรทัดของตัวถอดรหัสจะเลือกสายไฟหนึ่งในสี่เส้นสำหรับแต่ละบิต และประกอบด้วยวงจร AND ที่มีอินพุต 10 ตัว
อะไรถูกบันทึกไว้บ้าง?
เส้นทางแคชข้อมูลที่เรียบง่ายกว่านั้นจะประกอบด้วยตัวบวกตามด้วยตัวถอดรหัสแบบดั้งเดิม สำหรับระบบย่อยแคชในตัวอย่างของเรา เส้นทางที่สำคัญคือตัวบวก 14 บิต ซึ่งสร้างค่าจริงและค่าผกผัน ตามด้วยเกต AND 11 บิตสำหรับแต่ละแถวของตัวถอดรหัส
ในการออกแบบที่ใช้การกำหนดแอดเดรสแบบผลรวมนั้น เกต AND ตัวสุดท้ายในดีโคเดอร์ยังคงอยู่ แม้ว่าจะมีความกว้าง 10 บิตแทนที่จะเป็น 11 บิตก็ตาม ส่วนวงจรบวกได้ถูกแทนที่ด้วยนิพจน์ตรรกะสี่อินพุตที่แต่ละบิต การประหยัดเวลาแฝงมาจากความแตกต่างของความเร็วระหว่างวงจรบวกและนิพจน์สี่อินพุตนั้น ซึ่งอาจประหยัดเกต CMOS แบบง่ายๆ ได้ประมาณสามตัว
หากผู้อ่านรู้สึกว่านี่เป็นงานที่ต้องใช้ความคิดอย่างหนักมากเกินไปสำหรับการปรับปรุงเพียงสามขั้นตอนในเส้นทางวิกฤตหลายรอบ ผู้อ่านก็จะเข้าใจถึงระดับการเพิ่มประสิทธิภาพของซีพียูสมัยใหม่ได้ดียิ่งขึ้น
การปรับปรุงเพิ่มเติม: การถอดรหัสล่วงหน้า
การออกแบบตัวถอดรหัสจำนวนมากหลีกเลี่ยง การใช้เกต AND ที่ มีอินพุต จำนวนมาก ในสายถอดรหัสเอง โดยใช้ขั้นตอนการถอดรหัสล่วงหน้าแทน ตัวอย่างเช่น ตัวถอดรหัส 11 บิตอาจถูกถอดรหัสล่วงหน้าเป็นสามกลุ่ม กลุ่มละ 4, 4 และ 3 บิต แต่ละกลุ่ม 3 บิตจะขับสาย 8 เส้นขึ้นไปยังอาร์เรย์ถอดรหัสหลัก และแต่ละกลุ่ม 4 บิตจะขับสาย 16 เส้น จากนั้นสายถอดรหัสจะกลายเป็นเกต AND ที่มีอินพุต 3 ตัว การจัดระเบียบใหม่นี้สามารถประหยัดพื้นที่ในการใช้งานและพลังงานได้อย่างมาก
การจัดระเบียบใหม่แบบเดียวกันนี้สามารถนำไปใช้กับตัวถอดรหัสแบบระบุผลรวมได้เช่นกัน แต่ละบิตในสูตรที่ไม่มีการถอดรหัสล่วงหน้าข้างต้นสามารถมองได้ว่าเป็นการบวกสองบิตในระดับท้องถิ่น เมื่อมีการถอดรหัสล่วงหน้า กลุ่มการถอดรหัสล่วงหน้าแต่ละกลุ่มจะเป็นการบวกสาม สี่ หรือแม้แต่ห้าบิตในระดับท้องถิ่น โดยกลุ่มการถอดรหัสล่วงหน้าจะซ้อนทับกันหนึ่งบิต
โดยทั่วไป การถอดรหัสล่วงหน้าจะเพิ่มจำนวนสายไฟที่วิ่งผ่านตัวถอดรหัส และตัวถอดรหัสแบบระบุแอดเดรสรวมมักจะมีสายไฟมากกว่าตัวถอดรหัสแบบธรรมดาที่เทียบเท่ากันประมาณสองเท่า สายไฟเหล่านี้อาจเป็นปัจจัยจำกัดปริมาณการถอดรหัสล่วงหน้าที่ทำได้