מבנה מחשבים סיכום מעגלים לוגיים מושגים בסיסיים: VDD/POWER זרם גבוה, "1"; VSS/GROUND זרם נמוך, "0". טרניזסטורים pmos nmos כאשר השער מקבל זרם גבוה, הטרנזיסטור מופעל ומעביר nmos זרם מהמקור למטרה. שער זה מעביר היטב זרם נמוך ("1") כאשר הוא סגור. pmos עובד בצורה הפוכה מnMOS, כלומר מופעל כאשר הזרם נמוך, ופתוח (כלומר לא מעביר מהמקור למטרה) כאשר הזרם גבוה. שער זה מעביר היטב זרם גבוה ("0") כאשר הוא סגור. ייצוג מספרים מעבר בין בסיסים: נניח ונתון מספר. המיוצג בבסיס r. היצוג העשרוני שלו הוא: + = מעבר ממספר בבסיס עשרוני לבסיס אחר: Xהוא מספר לפי בסיס עשרוני. רוצים למצוא את הייצוג של Xלפי בסיס r. נגדיר, = ואילו היא השארית של חישוב זה. באותו אופן ואילו = היא השארית של חישוב זה. כך ממשיכים עד שמקבלים 0 = עבור iכלשהו. בשיטה זו Xלפי בסיס rהוא:. מעבר משבר עשרוני לשבר בבסיס אחר: בדומה למקרה הקודם הפעם מוגדר כמספר השלם של החישוב, ואילו הוא השבר של החישוב, והאיבר הבא מחושב כך. לבסוף המספר שמתקבל הוא:. 0. חישוב מספר בינרי משלים תוצאת חיבור של מספר עם המשלים שלו נותנת תוצאה של 0. קיימות שני שיטות: משלים ל- 1 : כל "1" הופך ל-" 0 " וכל "0" הופך ל-" 1 ". משלים ל- 2 : תחילה מתבצע חישוב משלים ל- 1. לאחר מכן מחברים לתוצאה "1". כדי לגלות מה מייצג מספר שלילי, מחשבים את המשלים ל- 2 שלו. ניתן לבצע חיסור שני מספרים באמצעות משלים ל- 2. מחברים את המספר הראשון עם המשלים ל- 2 של המספר השני. (נתעלם מהקרי הנוצר מחיבור ה- MSBבשני המספרים). :Sign Extend נתון מספר בן 8 ביטים ורוצים להציג אותו באמצעות 16 ביטים. אז לוקחים את MSB (הספרה של הסימן) ומורחים אותה על כל הביטים החדשים (מצד שמאל לביטים הישנים). Overflows נשא (carry) מצביע על תופעה תקינה ומשמש לקביעת הסימן בפעולת חיבור. overflowמצביע על תופעה לא תקינה כתוצאה מחיבור של שני מספרים גדולים (או קטנים).כאשר ישנו מספר זוגי של,overflows אז תוצאת החישוב תקינה. אחרת התוצאה לא תקינה. דרך אחרת להסתכל על כך היא ש- overflow מתרחש כאשר מתקיים 1 = הוא ) הקרי האחרון). 1
אלגברה בוליאנית האופרטור "+" מבטא את,OR ואילו " " מבטא את.AND " ` " או " " מבטא.NOT משפטים יסודיים באלגברה בוליאנית: +0= 1= + =1 =0 +1=1 0=0 + = = = + = + = + + = + + = + = + + + = + + = = + + = + = + = + + = + = + + = + = + + + = + פונקציות בוליאניות כל פונקציה ניתן לבטא בשני שיטות שקולות לחלוטין כסכום מכפלות ( ), ומכפלת סכומים ( ). למשל: x y z f1 f2 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 1 2 f1= m2+ m5 = x ' yz ' + xy ' z f1 = ( 2,5) 0 1 1 0 1 3 f2 = M1 M 7 = ( x+ y+ z ') ( x ' + y ' + z ') f2 = ( 1,7) 1 0 0 0 1 4 1 0 1 1 1 5 1 1 0 0 1 6 1 1 1 0 0 7 הרחבה לצורה סטנדרטית נניח ונתונה לנו פונקציה (למשל (,, = + ורוצים להרחיבה לצורה הסטנדרטית (למשל כסכום מכפלות). לוקחים כל מכפלה שלא כוללת את כל המשתנים ומנפחים אותה. למשל = + = + מערכות שלמות כל פונקציה ניתן לבטא ע"י האופרטורים.AND,OR,NOT מערכת שלמה \ אוניברסלית היא קבוצה של אופטרטורים שניתן לממש בעזרתם (ע"י הפעלות חוזרות) כל פונקציה בוליאנית. דוגמאות למערכות שלמות:,,,,, 2
מפות קרנו פונקצייה בוליאנית. זוהי שיטה לפישוט גדולים ככל האפשר אשר מכסים רק "1" (או רק מנסים לסמן ריבועים "0") כדי לקבל פונקציה פשוטה ככל הניתן. אל ניתן להתייחס כאל "1" או "0", איך שנוח. מספור מפת הקרנו (מספר התא מייצג את השורה בטבלת האמת) : 0 4 12 8 1 5 13 9 3 7 15 11 2 6 14 10 צעדים למציאת מקבצים: הקף את התאים אשר מכילים אחדות מובדדות. אחד הניתן לשילוב במקבץ זיהוי תאים המכילים באופן יחיד. סימון זוג זה. בגודל 2 עם תא שכן מתעלמים מתאים שניתן לשלבם בזוג ביותר מאופן אחד. זיהוי תאים שניתן לשלבם ברביעייה עם שלושה תאים אחרים באופן יחיד. אם הם אינם מופיעים הרביעייה. מתעלמים בזוג שסומן כבר, נסמן ניתן לשלבם ברביעייה ביותר מתאים אשר מאופן אחד. חוזרים על התהליך עבור שמיניות. אם נותרו אחדות אשר לא כוסו, מכסים אותם באופן כלשהו זה עם זה או עם מקבצים שנמצאו בשלבים הקודמים תוך שימוש במספר מינימלי של מקבצים. לוגיקה צרופית ומחזיר את סכומן ואת חצי מחבר: מקבל 2 סיביות הנשא. מקבל 2 סיביות ונשא מהמחבר הקודם מחבר מלא: סכומם ואת הנשא. ומחזיר את מספר בינארי בין 0 ל 2. 1 מפענח: nכניסות המייצגות ערך i. 2 יציאות כאשר יציאה iהינה "1" אמ"מ בכניסה יש פלט קלט A1 A0 D3 D2 D1 D0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 2 מקודד: כניסות המייצגות מספרים אונאריים. nיציאות המייצגות מספר בינארי. קלט לא אונרי מביא לשגיאה או לא מוגדר. 3
קלט פלט D3 D2 D1 D0 A1 A0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 0 2 1 0 0 0 1 1 3 מקודד עדיפות: מוגדר כמקודד רגיל, אך בנוסף ליציאות הרגילות קיימת יציאת validdהמחזירה 0 אם הקלט לא תקין ו- 1 אחרת. 2 קווי :MUX כניסה, nקווי ברירה, 1 קו יציאה. היחידה בוררת קו כניסה אחד מבין כל קווי הכניסה (באמצעות אותו לקו היציאה. ניתן גם לברור בין קבוצות של קווים. קווי הברירה) ומכוונת ניתן לממש פונציה בעלת nnמשתנים באמצעות MUX כותבים את הפונקציה ככסכום מכפלות, מכניסים "1" הן משתני הפונקציה. למכפלה אשר מופיעה בסכום ו-" 0 " אחרת. כניסות הבורר לכניסה המתאימה Flip Flops אוגרים ומונים אוגר מורכב מאוסף תאי אחסון בינאריים אשר ממומשים ע"י.FF מספר התאים קובע את אורך האוגר. אוגר מקבילי: הקריאה והכתיבה נעשית בו זמנית לכל התאים. דוגמא למימוש אפשרי: 4
אוגר הזזה: באוגר זה ה- FFמחוברים באופן שפלט של אחד הוא הקלט של האחר. מונה: מורכב מאוסף של תאי איחסון בינאריים הממומשים ע"י.FF מונה סופר תמיד מודולו 2 כאשר nהוא מספר היציאות שלו. במונה סינכרוני כל ה- FFמתוזמנים ע"י אותו שעון, כל פולס של השעון מוסיף אחד למונה. MIPS הערה: כתובת קוד מקודדת במילים. כתובת זיכרון מקודדת בביטים. MIPS operands Name Example Comments $s0-$s7, $t0-$t9, $zero, Fast locations for data. In MIPS, data must be in registers to perform 32 registers $a0-$a3, $v0-$v1, $gp, arithmetic. MIPS register $zero alw ays equals 0. Register $at is $fp, $sp, $ra, $at reserved for the assembler to handle large constants. Memory[0], Accessed only by data transfer instructions. MIPS uses byte addresses, so 2 30 memory Memory[4],..., sequential w ords differ by 4. Memory holds data structures, such as arrays, words Memory[4294967292] and spilled registers, such as those saved on procedure calls. MIPS assembly language Category Instruction Example Meaning Comments add add $s1, $s2, $s3 $s1 = $s2 + $s3 Three operands; data in registers Arithmetic subtract sub $s1, $s2, $s3 $s1 = $s2 - $s3 Three operands; data in registers add immediate addi $s1, $s2, 100 $s1 = $s2 + 100 Used to add constants load w ord lw $s1, 100($s2) $s1 = Memory[$s2 + 100]Word from memory to register store w ord sw $s1, 100($s2) Memory[$s2 + 100] = $s1 Word from register to memory Data transfer load byte lb $s1, 100($s2) $s1 = Memory[$s2 + 100]Byte from memory to register store byte sb $s1, 100($s2) Memory[$s2 + 100] = $s1 Byte from register to memory load upper immediate lui $s1, 100 $s1 = 100 * 2 16 Loads constant in upper 16 bits branch on equal beq $s1, $s2, 25 if ($s1 == $s2) go to PC + 4 + 100 branch on not equal bne $s1, $s2, 25 if ($s1!= $s2) go to Conditional PC + 4 + 100 branch set on less than slt $s1, $s2, $s3 if ($s2 < $s3) $s1 = 1; else $s1 = 0 set less than immediate slti $s1, $s2, 100 if ($s2 < 100) $s1 = 1; else $s1 = 0 Equal test; PC-relative branch Not equal test; PC-relative Compare less than; for beq, bne Compare less than constant jump j 2500 go to 10000 Jump to target address Uncondi- jump register jr $ra go to $ra For sw itch, procedure return tional jump jump and link jal 2500 $ra = PC + 4; go to 10000 For procedure call הקצאת מקום על המחסנית נניח ונרצה להשתמש בתוכנית ב 5 אוגרים. אז תחילה מקצים מקום במחסנית ע"י $sp,$sp,-20.addi לאחר מכן נותנים לכל אוגר כתובת: $s0,0($sp).sw $ra,16($sp), sw $s3,12($sp),, sw בסיום ריצת התוכנית נחזיר את המחסנית לקדמותה ע"י $sp,$sp, 20.addi 5
שימוש ב- jalו- jr בתוך תוכנית, אך בסיום השיגרה רוצים לחזור לתוכנית המקורית, בדיוק למקום כאשר רוצים לקרוא לשיגרה משתמשים בפקודות אלה. שממנו הפסקנו ע"י jal swap ונחזור לאותו מקום בדיוק ע"י הוספת הפקודה jrכפקודה $ra האחרונה למשל נעבור לשיגרה swap ב- swap. חשוב להקצות מקום במחסנית ל- jr $. גיבוי אוגרים בשיגרה: כאשר כותבים שיגרה באסמבלי, צריך לגבות את האוגרים שבהם נשתמש (כי ממשתמשים בהם בתוכנית שקראה לשיגרה), ובסוף ריצת השיגרה צריך לשחזר אותם. שלבי ביצוע הוראת מכונה: קרא הוראה מהזיכרון ע"פ הכתובת שמכיל ה- PC. FETCH 1. את הפקודה וקרא את האוגרים הנחוצים..2 DECODE פענח 3. EXECUTE בעזרת ה- ALUחשב את התוצאה, או כתובת רצויה. קריאה ממנו. 4. MEMORY השתמש בתוצאה לבצע במידת הצורך טעינה לזיכרון או 5. BACK WRITE ב בצע במידת הצורך טעינה לאוגר. קווי בקרה: ה- rdשל הפקודה. RegDst אם הפקודה היא r-typeאז ל- wsב- RegFileמגיע addיעביר 0, ואילו במקרה של שהפקודה היא l-typeאז wsמקבל את.rt דוגמא: במקרה של במקרה addiיעביר 1. שהפקודה הבאה תגיע כתוצאה מחליט האם PCיקבל כרגיל את הפקודה הבאה (PC+4) או Branch פעיל כאשר הפקודה הבאה הינה פעיל במקרה שנדרשת קפיצה ב- PCכמו ב- beq. לא מה- ALU. כמובן.PC+4.lw מאפשר קריאה מהזיכרון. פעיל במקרה של MemRead של.lw לא פעיל ב- r-type. MemtoReg מאפשר העברת מידע מהזיכרון לרגיסטר. פעיל במקרה הקו מכיל 2 ביטים. הוא מתחבר ל- ALUControl קו בקרה הקובע את הפעולה שה- ALUיבצע. ALUop את שדה ה- functמהפקודה. כתוצאה מכך יוצאים 3 ביטים המציינים ל- ALUאיזה פעולה אשר מקבל גם בהמשך) לבצע. (ראה טבלה.sw מאפשר כתיבה לזיכרון. פעיל במקרה של MemWrite ALUSrc קו בקרה הקובע האם ה- ALUיקבל ערך immediateאו ערך מרגיסטר. למשל במקרה של addערכו יהיה 0 ואילו במקרה של addiערכו יהיה 1. RegWrite מאפשר כתיבה לרגיסטר. ZERO זהו קו בקרה היוצא מה- ALU. שווה ל- 1 כאשר התוצאה ב- ALUשווה ל- 0. 1 אחרת. משתמשים בקו בקרה זה בפעולות ה- Branchכדי להחליט האם לבצע קפיצה ב- PCבמידה וההשוואה יצאה כמו שרצינו. הקובע האם לקפוץ לפקודה בכתובת מסויימת או שלהמשיך לכתובת הבאה כרגיל. JUMP קו ALUOp Funct field Operation ALUOp1 ALUOp0 F5 F4 F3 F2 F1 F0 0 0 X X X X X X 010 0 1 X X X X X X 110 1 0 X X 0 0 0 0 010 1 0 X X 0 0 1 0 110 1 0 X X 0 1 0 0 000 1 0 X X 0 1 0 1 001 1 0 X X 1 0 1 0 111 Single Cycle Architecture 6
דגשים למימוש פקודות חדשות סקירת כל הפעולות והשלבים שהפקודה מבצעת. בדיקה האם הקווים הקיימים מספיקים למימוש הפעולה. אם לא, צריך להוסיף. קביעת ערכי קווי הבקרה ביחידות בקרה קיימות. הוספת MUXחדשים במידת הצורך והגדרת קווי הבקרה החדשים. עדכון פונקציות קווי הבקרה הקיימים. Pipelining :Hazards מצב שבו פקודה לא יכולה להתבצע בפעימת השעון הנוכחית. ישנם 3 סוגים שונים של :Hazards Hazard Structural החומרה לא תומכת בפעולה. Hazard Control פעולת branchאו פעולה אחרת ב- pipeineמעכבת את הפעולות הנמצאות ב- pipelineעד אשר ה- hazardחולף. Hazard Data הפעולה תלויה בתוצאת פעולה אחרת שעדיין נמצאת ב- pipeline וטרם סיימה את עבודתה. למשל מתבצעות שני הפקודות sub $2,$1,$3; and $12,$2,$5 אחת אחרי השניה. כאשר הפקודה הראשונה נמצאת בשלב החמישי,ערכו החדש של האוגר $2 טרם התעדכן ואילו הפקודה השניה מנסה לקרוא אותו כשהיא נמצאת בשלב השלישי. פתרונות אפשריים ל- DataHazards : מוסיפים 3 פעולות nop שלא עושות כלום אך מבזבזות,cp 3 כך שכל המידע מתעדכן לפני שהפעולה הבאה מתרחשת. זוהי שיטה מאוד לא יעילה ובזבזנית בזמן. כדי לחסוך nopאחד, נגרום ש- write data תחילה יבדוק האם הרגיסטר שה- read dataקורא ברגע זה הוא הרגיסטר שאותו אנחנו רוצים לשמור. במקרה כזה ילקח הרגיסטר המעודכן, ורק לאחר מכן הוא ישמר בזיכרון. יחידת :Forwarding יחידה זו בודקת האם הפקודות הנמצאות בשלב הרביעי והחמישי מתכוונות לכתוב למאגר הרגיסטרים והאם הרגיסטר שייכתב משמש כקלט ל- ALU מהפקודה בשלב השלישי. במקרה וכן, יחידה זו תעביר את הערך המעודן ל- ALU במקום הערך הישן. במקרה והתנאי מתקיים עבור השלב הרביעי והחמישי בו זמנית, אז ה- forwardingתעביר unit את המידע הנמצא בשלב הרביעי, מאחר והוא עדכני יותר. :lw של Hazardבמקרה הפתרונות שהוצעו קודם לכן לא עובדים במקרה של רצף הפקודות $4,$2,$5 lw $2,20($1); and מאחר ובשלב השלישי של הפקודה השניה קוראים רגיסטר שערכו טרם ניקרא מהזיכרון בפקודה הראשונה. הפתרון לא עובד מאחר ואנחנו לא יכולים לנחש האם נרצה לקרוא לרגיסטר כלשהו בזמן הקרוב. פתרון אפשרי לבעיה הוא הוספת (bubble) nop ע"י החומרה כאשר מתרחש מצב כמתואר לעיל. :Branch Hazard מתרחש כאשר יש לנו פקודת branchשנמצאת בשלב הרביעי ב- pipeline ומתקבלת תוצאה שאמורה להקפיץ את התוכנית לפקדוה אחרת, אך יש כבר מספר פקודות ב- pipelineשאנחנו לא רוצים שהן תתבצענה. שוב ניתן לפתור את הבעיה ע"י,nop 3 אך יש פיתרון יותר אלגנטי. אם זוהתה פעולת branchב- opcodeבשלב השני, נבצע את ההשואה הנחוצה ל- branchכבר בשלב זה, ובמקרה והתנאי יתקיים נשנה את ערך ה- PC. ונכניס nopאחד ל- pipeline. כמו כן נבצע flush (פעולה המוציאה את הפקודה שנמצאת בשלב הראשון מתוך ה- pipeline. פיתרון אפילו טוב יותר הוא :branch delay slot הפקודה הבאה מיד אחרי פקודת branchתמיד תתבצע, לא משנה אם נכנסו ל- branchאו לא. ניתן למצוא פקודה שלא תשפיע על זרימת התוכנית. 7
Cache לוקאליות בזמן: אם ניגשנו למידע כלשהו בזמן האחרון, אז יש סיכוי גדול שניגש אליו שוב. לוקאליות במרחב: אם ניגשנו למידע כלשהו, אז יש סבירות גבוה שניגש לשכנים שלו. כאשר ניגשים למקום ב- cacheמשווים את ערך הTAGשל המקום לערך ה- TAGשל הבלוק שרוצים לדלות מה-.miss במידה והערכים תואמים אזי אין.cache סוגי :Miss סיבה שלא נפסס כי אין דבר טעון ב- cache. אין למשל פניה ראשונה ל- cache. Compulsory Capacity ה - cacheלא יכול להכיל את כל הבלוקים בשל בעיית מקום. זיכרונות שונים ממופים לאותו מקום ב- cache. Conflict פעולה אחרת מטפלת ב- cache. Coherence :Direct Mapped Cache לכל בלוק יש מקום אחד בלבד ב- cacheשאליו הוא יכול להיות ממופה (כמה בלוקים יכולים להתמפות לאותו מקום ב- cache ). :N-way Associative Cache לכל בלוק ישNמקומות שאליהם הוא יכול להתמפות. במידה ומתרחש missאז ניתן לפנות לו מקום ע"י שיחרור תא אקראי RANDOM) או) זה שהשתמשו בו לאחרונה לפני הכי הרבה זמן.(LRU) כל בלוק יכול להתמפות לכל מקום ב- chache. :Fully Associative Cache 8