חזור לתיקייה: תרגול

11 - מעבד MultiCycle

חיפוש בתיקיה
Ctrl K
לחץ כאן או הקש Ctrl K כדי לחפש בכל התיקיה
  • הבקר

11 - מעבד MultiCycle

00440252

מערכות ספרתיות ומבנה המחשב

רשימות תרגול לקריאה בשבת

מעבד MultiCycle

הופק מתוך תקיית התואר של שקד

uni-folder.vercel.app

שבוע שעבר ראינו את ה-SingleCycleSingleCycleSingleCycle אשר בו הפקודה הכי ארוכה מכתיבה את הקצב של כל הפקודות ובנוסף, בו הרבה רכיבים שיושבים ומחכים למשך זמן רב.

כיום נראה מימוש ל-MultiCycleMultiCycleMultiCycle מאוד מופשט אשר יראה לנו את העקרון של מעבד מסוג זה.
אנו הולכים לחלק את ה-DatapathDatapathDatapath לחמישה שלבים והם: IF,ID,EX,M,WBIF,ID,EX,M,WBIF,ID,EX,M,WB כאשר:
​ספרתיות צנרור מחשב 1.png

הערה

זה לא pipelinepipelinepipeline שכן יש מידע שחוזר אחורה ואז לא ניתן להגיד דבר על ה-throuputthrouputthrouput.
בנוסף, בכל זמן נתון יש רק פקודה אחת המתבצעת בזמן נתון ← זה לא pipelinepipelinepipeline.

נשים לב כי מכונת המצבים לא תהיה כזו פשוטה, אך מה שכן, שלבי ה-if,idif,idif,id זהים לכל הפקודות שכן שם אנו מגלים מהי הפקודה.
​ספרתיות צנרור מחשב מערכת מצבים.png
נשים לב כי זוהי מכונת MooreMooreMoore.

נסתכל על ה-datapathdatapathdatapath החדש לו נוסיף אוגרים זמניים אשר יאפשרו לנו להחזיק ערכים מסויימים במשך כמה מחזורים:
​עוד אוגרים שהם רגיסטרים כי אין לי כוח לשמות.png
נשים לב כי יש כמה שינויים: אין לנו +4+4+4 ואין לנו Branch  ComperatorBranch\;ComperatorBranchComperator וה-muxmuxmux-ים שליד ה-ALUALUALU הורחבו לתמוך בשלוש כניסות.

אנו נרצה בחלק מהפקודות לבצע חישובים על ה-PCPCPC כדי להבין היכן הפקודה הבאה, אך בזמן שאנו עושים זאת אנו צריכים לשמור על הערך של PCPCPC של הפקודה הנוכחית בנוסף לשמירת הפקודה הנוכחית ולכן, אנו צריכים את שני האוגרים PCC,  IRPCC,\;IRPCC,IR.
שאר הרגיסטרים(הכחולים) מתעדכנים כל עליית שעון.

בשלב ה-FetchFetchFetch אנו שולפים את הפקודה מ-IMEMIMEMIMEM לפי PCPCPC ובנוסף עושים PC=PC+4PC=PC+4PC=PC+4 כאשר הערך של PCPCPC נשמר באוגר PCCPCCPCC כך:
​מסלול נחמד מאוד.png

בשלב ה-DecodeDecodeDecode אנו נקרא מידע מהאוגרים של המערכת ובנוסף, אנו נבצע חישוב ספקולטיבי של מיקום אליו נקפוץ במקרה וזוהי פקודת קפיצה למקרה בו נדרש לקפוץ.
​מסלול נחמד מאוד של פקודת decode.png

כעת נתחיל לרוץ על פקודות שונות:

  • עבור פקודות R−TypeR-TypeR−Type נבצע שני מחזורים: הראשון יהיה החישוב של הערך ושמירתו ב-ALUoutALUoutALUout ואז השני יהיה השמה של ALUoutALUoutALUout לתוך הרגיסטרים בכתובת.
  • עבור פקודות B−TypeB-TypeB−Type נחשב האם לקפוץ וניתן את המוצא של ALUALUALU לתוך חוט ZEROZEROZERO אשר מקבל 000 אם קופצים. החוט הזה מחובר ללוגיקה קומבינטורית אשר אומרת ל-PCPCPC האם לקפוץ או לא.
  • אפשר להסתכל גם על כל שאר הסוגים אבל זה לא כזה חשוב

הבקר

עד כה השתמשנו ב-ROMROMROM אבל כעת, יש לנו כל כך הרבה מצבים שזה יהיה ממש ממש ממש גדול.
לכן, נרצה להשתמש במשהו יעיל יותר - נוכל להקטין את ה-ROMROMROM באמצעות לוגיקה צירופית:
​עיצוב חדש לcontroler בספרתיות.png
​המשך לעיצוב חדש לrom שאיזה יופי - ספרתיות.png
​עוד דיבורים על הrom לעיצוב המצונרר בספרתיות.png

בקר מיקרו-קוד פשוט אומר שזה בקר שקובע את מוצאו על פי קידוד של מילה מסויימת וניתן לערוך אותו(המפתח, לא המשתמש) - הדרך לממש את זה היא ROMROMROM או fleshfleshflesh או עוד כל מיני דברים שאנחנו לא צריכים להכיר.