\documentclass[%
  %remarks,  % Print remarks. I currenlt use "answers" instead
  %norecpt,  % Print receptin hours?
  fancy,     % make format slightly more fancy
  %draft,    %
  %nowide,   % Use a4 rather than a4wide
  %eightbit, % re-work this one...
  %nopairs,  % don't print "submition in pairs only"
  pagebreak, % Each question stars a new page
  %noanswers,% (the default)
  answers,  % Print answers
]{iitcsw}
\usepackage{iitcsw-course}
\usepackage{ifthen}
\usepackage[%
  hypertex,%
  %ps2pdf,%
  %dvips,%
  %colorlinks,%
  %nocolorlinks,%
  %bookmarks,%
]{hyperref}
\hypersetup{colorlinks=false,raiselinks=false,breaklinks=true,%
  plainpages=flase,pageanchor=false}
\HeblatexRedefineL

\usepackage{epic}
\usepackage{eepic}
%\usepackage{graphicx}

\newcommand{\hebpar}[1]{)#1(}
\renewcommand{\AssignmentSubject}{מעבד ה-\MIPS}
\renewcommand{\HWNum}{5 \R{\Answer{)פת-רון(}}}
\newcommand{\TaInCharge}{צפריר כהן}
\newcommand{\TaInChargeEmail}{tzafrir@technion.ac.il} % no \L{} needed
\newcommand{\RecHours}{יום ג' \L{13:30}-\L{14:30}}
\newcommand{\SubmitionTime}{יום א', \L{3.3.2002}, בשעה \L{12:00}}% בבוקר, )הגשה מוקדמת עד
%  \L{21.2.2002}, בשעה \L{12:00} בבוקר(}
%\courseSlogan{מבוא לתורת הצפינה - חורף תשס''ב}
%\exerciseNumberAndDate{5}{11/02/2002}
%\renewcommand\CourseName{תכן לוגי}
%\renewcommand\CourseFullName{\CourseName \ \L{234262}} %or simply \CourseName
%\renewcommand\Semester{חורף תשס"ב}
\renewcommand{\ExtraInstructions}{%
  \noindent השאלות מנוסחות בלשון רבות והן מיועדות לזוגות בלבד!%
}
\renewcommand{\submittersname}{מגישות}

\newcommand{\BogoMIPS}{\embox{BogoMIPS}}

\begin{document}
\hyphenation{אסמ-בלר}
%\title{bbb}\author{sfsdf}
\maketitle

\smallskip

\question{מימוש פקודות}

בתרגול 9 מודגמות כל מיני פקודות אותם אמור מעבד ה-\MIPS{} להיות מסוגל 
לבצע. אולם לא את כולם ניתן לממש עם מסלול הנתונים משרטוט \L{5.1} )משקפי 
ההרצאות( ולא את כולן מבצע הבקר משרטוט \L{5.3}.

בשאלה זו נניח כי יחידת ה-\ALU{} מסוגלת לבצע את הפעולות הבאות )בלבד(:
חיבור, חיסור, \L{AND}, \L{OR} ו-\L{SLT} )כמו בפקודה \L{SLT}(

האם ניתן לממש את הפקודות הבאות ע"י הבקר? ע"י מסלול הנתונים?

\smallskip

\begin{otherlanguage}{english}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline 
\R{ע"י מסלול הנתונים} & \R{ע"י הבקר}& \R{פקודה} \\ \hline 
\hline 
\Answer{$\surd$}  & \Answer{$\surd$}  &ADD  \\ \hline
\Answer{$\surd$}  & \Answer{$\surd$}  &SUB  \\ \hline
\Answer{$\surd$}  & \Answer{$\surd$}  &AND  \\ \hline
\Answer{$\surd$}  & \Answer{$\surd$}  &OR   \\ \hline
\Answer{$\surd$}  & \Answer{$\surd$}  &SLT  \\ \hline
\Answer{$\times$} & \Answer{$\times$} &SLL  \\ \hline
\Answer{$\times$} & \Answer{$\times$} &SRL  \\ \hline
\Answer{$\surd$}  & \Answer{$\times$} &ADDI \\ \hline
\Answer{$\times$} & \Answer{$\times$} &LUI  \\ \hline
\Answer{$\surd$}  & \Answer{$\surd$}  &BEQ  \\ \hline
\Answer{$\surd$}  & \Answer{$\times$} &BNE  \\ \hline
\Answer{$\surd$}  & \Answer{$\surd$}  &J    \\ \hline
\Answer{$\times$} & \Answer{$\times$} &JAL  \\ \hline
\Answer{$\times$} & \Answer{$\times$} &JR   \\ \hline
\end{tabular}
\end{center}
\end{otherlanguage}

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

\medskip

\begin{minipage}{\textwidth} % a minipage prevents page breaks
\paragraph{פקודה ראשונה} \AnswerPlace{\L{BNE}} 

\noindent מחזור 1: \Answer{מחזור \L{Fetch}  כרגיל} \hrulefill \\
\noindent מחזור 2: \Answer{מחזור \L{Decode} כרגיל} \hrulefill \\
\noindent מחזור 3: 
  \Answer{
    $M_5=1$, $M_6=0$, $ALU_{op}=SUB$, $M_1=0$, 
    %$\underline{PC_{load}=\overline{ALU_{zero}}}$
    \underline{$PC_{load}=\overline{ALU_{zero}}$}
  }
  \hrulefill \\
\noindent מחזור 4: \hrulefill \\
\noindent מחזור 5: \hrulefill \\
\end{minipage}

\begin{minipage}{\textwidth}
\paragraph{פקודה שניה} \AnswerPlace{\L{ADDI}} 

\noindent מחזור 1: \Answer{מחזור \L{Fetch}  כרגיל} \hrulefill \\
\noindent מחזור 2: \Answer{מחזור \L{Decode} כרגיל} \hrulefill \\
\noindent מחזור 3: \Answer{$M_5=1$, $M_6=1$, $ALU_{op}=ADD$} \hrulefill \\
\noindent מחזור 4: 
  \Answer{
    $M_5=1$, $M_6=1$, $ALU_{op}=ADD$
    $M_3=0$, $M_4=1$, $REG_{write}$
  }
  \hrulefill \\
\noindent מחזור 5: \hrulefill \\
\end{minipage}

\Answer{%
  רוב הסטודנטים התעלמו מהבעיה עם \L{opcode} וסימנו שניתן לבצע את L{JR}. 
  במקרה שהבקר היה יכול להבחין בין L{JR} לבין פקודות אחרות )לדוגמה, אם הבקר היה
  מקבל גם את \L{func}( אותות מחזור 3 היו:
}

\Answer{%
  \L{%
    $M_1=0$, $PC_{load}$, $M_6=0$, $M_5=0$ \quad%
    ($R_t+R_s\rightarrow ALU_{out}\rightarrow PC)$)%
  }%
}

\Answer{}

כמוכן עליכן לבחור שתי פקודות אשר אינן ניתנות למימוש ע"י מסלול הנתונים,
ולהסביר מה הבעיה במימושן:

\paragraph{פקודה ראשונה} \ 

\AnswerLines
{
  \textbf{\L{SLL}, \L{SRL}}: 
  בפקודות הללו צריך לבצע פעולת \L{shift} על ערך של רגיסטר. למעבד 
  ה-\MIPS{} שלנו אין יכולת לבצע את הפעולה הזו. בפרט אין במסלול הנתונים 
  שבשרטוט אפשרות להביא את הסיביות שבהן נתון \L{shamnt}. כמוכן יש לשים 
  לב שה-\L{opcode} של הפקודות הללו זהה לזה של \L{ADD}, \L{SUB}, וכו', 
  ולכן גם כל אותות הבקרה שיחידה $C_1$ שולחת במהלך ביצוע הפקודות הללו 
  צריכים להיות זהים.
}

\paragraph{פקודה שניה} \

\AnswerLines
{
  \textbf{\L{JAL}}:
  הבעיה עם פקודה זו היא שהיא דורשת כתיבה לרגיסטר מספר \L{31} ואילו 
  במסלול הנתונים אין אף קבוע כזה, ובקודה עצמה אין מקום לקודד את הקבוע 
  הזה.
}

\Answer{
  שגיאה נפוצה על \L{JAL}: "אי אפשר את ערך \L{PC} ל\L{-}\L{RegFile}"
}

\Answer{}

\noindent \Answer{ועוד פקודה שלא יכולה להתבצע:}
\AnswerLines
{
  \textbf{\L{JR}}:
  נשים לב שגם לפקודה זו יש \L{opcode=0} כמו ל-\L{ADD} וכמו ל-\L{SLL} 
  לעיל. מכאן שהפקודה לא יכולה לבצע כתיבה ל-\PC{} לאחר המחזור הראשון, 
  שהרי בכל מחזורי ביצוע פקודת \L{ADD} )למעט הראשון( לא כותבים ל-\PC{}. 
  באופן כללי כל אותות הבקרה שיחידה $C_1$ שולחת חייבים להיות זהים לאילו 
  שנשלחים בפקודות אחרות עם אותו \L{opcode}, כגון \L{ADD} ו-\L{SUB}.
}



% \commandsubsection{ADD}{חלק מהבקר}
% 
% \commandsubsection{SUB}{חלק מהבקר}
% 
% \commandsubsection{AND}{חלק מהבקר}
% 
% \commandsubsection{OR}{חלק מהבקר}
% 
% \commandsubsection{SLT}{חלק מהבקר}
% 
% \commandsubsection{SLL}{לא נתמכת: אין דרך להעביר את ערך ה-\L{shamnt}}
% 
% \commandsubsection{SLR}{ר' \L{SLL}}
% 
% \commandsubsection{ADDI}{]להוסיף אותות מסלול נתונים[}
% 
% \commandsubsection{LUI}{ה-\L{ALU} לא תמך בפעולה $sift_{16}(A+B)$, אין
% דרך להעביר קבוע 16 ל-\L{ALU}}
% 
% \commandsubsection{BEQ}{חלק מהבקר}
% 
% \commandsubsection{BNE (\L{Branch on Not Equal})}{]להוסיף אותות מסלול נתונים[}
% 
% \commandsubsection{J}{חלק מהבקר}
% 
% \commandsubsection{JAL}{חסר הקבוע \L{31} בכניסת הכתיבה ל-\L{RF}}
% 
% \commandsubsection{JR}{]להוסיף אותות מסלול נתונים[}


%%
% \question{מימוש פקודות}
% 
% בתרגול 9 מודגמות כל מיני פקודות אותם אמור מעבד ה-\MIPS{} להיות מסוגל 
% לבצע. אולם לא את כולם ניתן לממש עם מסלול הנתונים משרטוט \L{5.1} )משקפי 
% ההרצאות( ולא את כולן ניתן לבצע עם הבקר משרטוט \L{5.3}.
% 
% בשאלה זו נניח כי יחידת ה-\ALU{} מסוגלת לבצע את הפעולות הבאות )בלבד(:
% \begin{itemize}
% \item חיבור
% \item חיסור
% \item \L{AND}
% \item \L{OR}
% \item \L{SLT} )כמו בפקודה \L{SLT}
% \end{itemize}
% 
% לכל פקודה עליכן לרשום האם היא ניתנת לביצוע בעזרת מסלול הנתונים הנ"ל והאם 
% היא ניתנת למימוש בעזרת הבקר. 
% 
% עבור פקודה שנתמכת ע"י מסלול הנתונים אך לא ע"י הבקר, יש לרשום את אותות הבקרה של
% מסלול הנתונים בכל מחזור. עבור פקודה שאינה נתמכת אף ע"י מסלול הנתונים, יש
% לנמק בקצרה מדוע: מה חסר.
% 
% אם הפקודה נתמכת ע"י הבקר וע"י מסלול הנתונים, אין צורך לכתוב נימוק.
% אם סעיף שנימוק לתשובה אליו זהה לזה של סעיף קודם, מותר )ואף רצוי( לרשום
% בנימוק ''ר' סעיף ]\emph{סעיף קודם}\L{``}.
% 
% \newcommand{\commandsubsection}[2]{%
%   \vspace{-1ex}
%   \subsection{הפקודה \L{#1}}
%  
%   \vspace{-2ex}
%   ע"י הבקר: \AnswerPlace \quad ע"י מסלול הנתונים: \AnswerPlace 
%   \answer{#2}
% 
%   \begin{tabular}{p{0.80\textwidth}l}% without factor of 0.95 I get a latex
%                                      % warning about the width
%   \\ & \R{מחזור 1:}
%   \\ \cline{1-1} & \R{מחזור 2:}
%   \\ \cline{1-1} & \R{מחזור 3:}
%   \\ \cline{1-1} & \R{מחזור 4:}
%   \\ \cline{1-1} & \R{מחזור 5:}
%   \\ \cline{1-1} 
%   \end{tabular}
% }
% 
% \remark{שימו לב שהתשובות לא ישתנו גם אם ה-\L{ALU} מאפשר ביצוע \L{shift} לתוצאה}
% 
% \commandsubsection{ADD}{חלק מהבקר}
% 
% \commandsubsection{SUB}{חלק מהבקר}
% 
% \commandsubsection{AND}{חלק מהבקר}
% 
% \commandsubsection{OR}{חלק מהבקר}
% 
% \commandsubsection{SLT}{חלק מהבקר}
% 
% \commandsubsection{SLL}{לא נתמכת: אין דרך להעביר את ערך ה-\L{shamnt}}
% 
% \commandsubsection{SRL}{ר' \L{SLL}}
% 
% \commandsubsection{ADDI}{]להוסיף אותות מסלול נתונים[}
% 
% \commandsubsection{LUI}{ה-\L{ALU} לא תמך בפעולה $sift_{16}(A+B)$, אין
% דרך להעביר קבוע 16 ל-\L{ALU}}
% 
% \commandsubsection{BEQ}{חלק מהבקר}
% 
% \commandsubsection{BNE (\L{Branch on Not Equal})}{]להוסיף אותות מסלול נתונים[}
% 
% \commandsubsection{J}{חלק מהבקר}
% 
% \commandsubsection{JAL}{חסר הקבוע \L{31} בכניסת הכתיבה ל\L{RF}}
% 
% \commandsubsection{JR}{]להוסיף אותות מסלול נתונים[}
% 
% \vfill
% 
%\pagebreak
\question{הרצה}

נתון קטע קוד באסמבלי של \MIPS:

\newcommand\RegBase{\$1}
\newcommand\RegA{\$2}
\newcommand\RegB{\$3}
\newcommand\RegRes{\$4}
\newcommand\RegOne{\$5}
\begin{otherlanguage}{english}
\begin{tabbing}
\tt 
begin:	\= lw \hspace{1cm}	\= \RegA, 0(\RegBase) \hspace{40pt} \= ; \$a = \textit{a} \\
	\> lw	\> \RegB, 4(\RegBase)		\> ; \$b = \textit{b} \\
	\> add	\> \RegRes, \$0, \$0		\> ; \$res = 0 \\
	\> addi	\> \RegOne, \$0, 1		\> ; \$one = 1 \\
loop:	\> beq	\> \RegB, \$0, endloop		\> ; if (\$b == 0) goto \textit{endloop} \\
	\> add	\> \RegRes, \RegRes, \RegA	\> ; \$res = \$res + \$a \\
	\> sub	\> \RegB, \RegB, \RegOne 	\> ; \$b = \$b - \$one \\
	\> j	\> loop				\> ; goto \textit{loop} \\
endloop:\> sw	\> \RegRes, 8(\RegBase)		\> ; \textit{res} = \$res 
%\rm
\end{tabbing}
\end{otherlanguage}

%\pagebreak

וכן תרגומו לשפת מכונה של ה-\MIPS:

\smallskip

\setlength{\tabcolsep}{0.2em}
\begin{otherlanguage}{english}
\begin{center}
\begin{tabular}{|l|lll|r|r|r|r|r|r|r|c|}
\hline 
address&   &     &                & op&rs&rt&rd&shamnt& func& imm& hex\\ \hline 
\hline 
6FF0&      & LW  & \$2,0(\$1)     & 35& 1& 2&  &      & & 0 & 8C220000\\ \hline 
6FF4&      & LW  & \$3,4(\$1)     & 35& 1& 3&  &      & & 4 & 8C230004\\ \hline 
6FF8&      & ADD & \$4,\$0,\$0    & 0 & 0& 0& 4& 0    & 32& & 00002020\\ \hline 
6FFC&      & ADDI& \$5,\$0,1& 8   & 0 & 5&  &  &      & 1   & 20050001\\ \hline 
7000& loop:& BEQ & \$3,\$0,endloop& 4 & 3& 0&  &      & & 3 & 10600003\\ \hline 
7004&      & ADD & \$4,\$4,\$2    & 0 & 4& 2& 4& 0    & 32& & 00822020\\ \hline 
7008&      & SUB & \$3,\$3,\$5    & 0 & 3& 5& 3& 0    & 34& & 00651822\\ \hline 
700C&      & J   & loop           & 2 &  &  &  &      &&7168& 08001C00\\ \hline 
7010& endloop:& SW& \$4,8(\$1)    & 43& 1& 4&  &      & & 8 & AC240008\\ \hline 
\end{tabular}
\end{center}
\end{otherlanguage}

\smallskip

%\subsection{הרצה}

% נשתמש בסימון הבא למצבי הבקר: \L{F} ו-\L{D} למצב הראשון והמצב השני, בהתאמה,
% ועבור כל מצב נוסף: $\hmbox{שם הפקודה}_{\hmbox{מספר המצב}}$. לדוגמה, 
% רצף מצבי הבקר בביצוע פקודת \L{LW} הוא \L{F, D, LW$_3$, LW$_4$, LW$_5$} 
% 
קטע הקוד נמצא בזכרון המעבד בכתובת המצויינת. במחזור מסויים הבקר במצב
\L{Fetch}, ערכו של \L{PC} הוא \L{00006FF8} וערכי כמה מן הרגיסטרים:
)מספרים בבסיס \L{16}(

\begin{otherlanguage}{english}
\noindent $R_1=001188AA$, $R_2=00005040$, $R_3=00004000$, $R_4=0000280C$, 
$R_5=00034458$
\end{otherlanguage}

% עליכן למלא את מצב המעבד ב-\L{20} המחזורים הבאים. 

% \smallskip
% 
% \newcounter{row}
% \setcounter{row}{1}
% \setlength{\tabcolsep}{0.1em}
% \newcommand{\tablerowlastcell}[1]{\stepcounter{row}& & & & & & & & #1  \\ \hline }
% \newcommand{\tablerow}{\tablerowlastcell{\therow}}
% \begin{otherlanguage}{english}
% {\centering 
% \begin{tabular}{|*{7}{p{4.6em}|}c|r|}
% \hline 
% $R_4$    & $R_3$    & $R_2$    & $R_1$    &\BPC         & \IR          & \PC      & \R{בקר} & \\ \hline 
% \hline
% 001188AA & 00005040 & 00004000 & 0000280C & \R{לא נתון} & \R{לא נתון}  & 00006FFC & F & 1 \\ \hline 
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \tablerow
% \hline
% \tablerowlastcell{}
% \tablerowlastcell{}
% \tablerowlastcell{}
% \end{tabular}
% }
% \end{otherlanguage}
% 
% \smallskip

% אם המצב אינו ידוע, או אינו מוגדר היטב, יש לרשום ''לא ידוע\L{``}.
%
% \bigskip

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

\newcommand{\commandsubsection}[4]{%
  %\vspace{-1ex}
  \begin{minipage}{\textwidth}
  \subsection{\R{#1}}
 
  %\vspace{-2ex}
  פקודה: \AnswerPlace{#2}, 
  אוגרים/רגיסטרים שהשתנו: \AnswerPlace[20em]{#3}%
  %\answer{#3}%

  \AnswerLines{#4}%
  \end{minipage}
}

\bigskip

\commandsubsection{קו ה-\L{zero} מעביר תמיד את הערך \L{`1'}}
  {\L{BEQ}, מחזור 3}
  {לרגיסטר \L{PC} יטען לערך \L{00007010} במקום להשאר \L{00007004}}
  {במחזור הראשון לאחר \L{BEQ} ייכנס ל-\PC{} ערך שונה )\L{700C}(. כמובן 
    שלאחר מכן תבוא קפיצה לכתובת סיום הלולאה במקום המשך רגיל שלה.
  }

\commandsubsection{יחידת ה-\L{sign extention} מוסיפה למילה \L{16} אפסים
  במקום להבצע הרחבת סימן}
  {\L{---}}
  {\L{---}}
  {בכל הפקודות שבקטע הנ"ל הסיבית העליונה של \L{Imm} היא 0 ולכן בכל מקרה יחידת
  הרחבת הסימן תעביר שם 0 בכל הסיביות.}

\commandsubsection{סיבית מס' \L{15} של יציאת $M_6$ מוציאה תמיד ערך 
  \L{`0'}}
  {\L{ADD}, מחזור שני}
  {לרגיסטר \L{BPC} יטען לערך \L{0000707c} במקום להשאר \L{0000f07c}}
  {במחזור השני של פקודת ה-\L{ADD} הראשונה מבוצע חישוב של הערך אשר נכנס
    ל-\BPC{}. למרות שבפקודת \L{ADD} לא משתמשים בערך זה, הוא עדיין נשמר
    ב-\BPC{} ולכן משנה את מצבו של ה-\MIPS{}. ביחידה המקולקלת יעביר 
    $M_6$ את הערך $0x80$ במקום הערך $0x8080$, ולכן ישתנה הסכום, אשר נכנס
    ל-\BPC{}
  }

)מספרה של סיבית ה-\L{LSB} הוא 0(




%\end{document}


\question{איתור בעיות}

חברת \MIPS{} החלה לשווק יחידות אשר לא עברו את בקרת האיכות תחת שם המותג 
\L{\href{http://www.unixguide.net/linux/faq/9.06.shtml}{\BogoMIPS}}.
בעקבות נסיונות לקיצוץ עלויות במעבדות הפקולטה, הוחלט להשתמש במעבדי 
\BogoMIPS. כעת מוטל עליכן לנסות לאתר אילו פגמים יש במעבדים.

ממידע פנימי שהתקבל מעובדי פס היצור, מתברר כי יש תקלה אופיינית אחת 
למעבדי \BogoMIPS{}: שתי היציאות של יחידת הרגיסטרים הוחלפו )$R_t$ נכנסת
ל-$M_5$ ואילו $R_s$ נכנסת ל-$M_6$(.

\smallskip

עליכן לכתוב תוכנית קצרה )עד 7 פקודות( עבור מעבד ה-\BogoMIPS{} אשר כאשר 
תורץ על מעבד עם התקלה הנ"ל תקפוץ לכתובת \L{191296} ואילו על מעבד תקין
תקפוץ לכתובת \L{1573696}. על התוכנית להתחיל בכתובת \L{4096} )כל 
המספרים בשאלה זו הם עשרוניים(. יש לכתוב את התוכנית כקוד אסמבלר, 
ובקידוד הקסדצימלי. כמוכן יש לנמק מדוע היא עובדת. אפשר להניח שבזמן ההתחלה יש
בכל האוגרים בעלי מספר זוגי )$R_2$, $R_4$, \ldots, $R_{30}$( ערכים זוגיים 
ובכל האוגרים בעלי המספרים האי-זוגיים )$R_1$, $R_3$, \ldots, $R_{31}$( יש
ערכים אי-זוגיים.

\smallskip

\begin{center}
\begin{tabular}{|r|lll|} \hline
\makebox[5em][c]{\R{קידוד}} & \multicolumn{3}{|c|}{\R{הפקודה}} \\ \hline \hline
%\\ & \R{מחזור 1:}
\ifiitcswanswers
  \L{20010000} &	    & \L{ADDI}	& \L{$R_1$,$R_0$,0}	\\ \hline
  \L{10010002} &	    & \L{BEQ} 	& \L{$R_1$,$R_0$,jgood}	\\ \hline
  \L{0800BAD0} & 	    & \L{J}	& \L{191296} 		\\ \hline
  \L{0806OOD0} & \L{jgood}: & \L{J}	& \L{1573696}		\\ \hline
\else
  & & &\\ \hline
  & & &\\ \hline
  & & &\\ \hline
  & & &\\ \hline
\fi
&   & &\\ \hline
&   & &\\ \hline
&   & &\\ \hline
\end{tabular}
\end{center}

\medskip

\AnswerLines
{
  בשורה הראשונה יש השמה לתוך האוגר $R_1$. בביצוע תקין יוכנס הערך \L{0}. במעבד
  מקולקל ישאר ב-$R_1$ הערך הקודם שהיה בו. מכיוון שמובטח שערכו היה אי\L{-}זוגי,
  הרי שבפרט ערך זה שונה מ\L{-}\L{0} ולכן במעבד תקין פקודת \L{BEQ} תקפוץ.
}

%\pagebreak

\vspace{-2ex}

הקידוד של מספר פקודות \MIPS\ מובא בסיום.

% כדי לבדוק את המעבדים הוצע להשתמש במערכת בדיקת מעבדי \MIPS. למערכת זו
% מכניסים מעבד והיא מבצעת את הפעולות הבאות:
% \begin{itemize}
% \item מאפסת )ע"י כתיבה פיזית( את כל תאי הזיכרון וכל הרגיסטרים.
% \item כותבת לזכרון הראשי מספר תאים
% \item מריצה אותה למספר נתון מראש של פקודות, החל מכתובת \L{1000}
% \item מדווחת מהו תוכן התא \L{500}
% \end{itemize}



%\pagebreak

\question{תזמון}

בשאלה זו נניח כי מעבד ה-\MIPS{} פועל עם מחזור שעון של $10ns$.

מוצע השיפור הבא למעבד ה-\MIPS{}: יחידות ה-\L{\ALU} והזיכרון הראשי
יוחלפו ביחידות חדשניות אשר השהייתן היא קצת פחות מ-$5ns$ )במקום קצת
פחות מ-$10ns$(. המחיר לכך הוא שהשהייתה של יחידת הרגיסטרים תהיה
\emph{קצת יותר מ-$10ns$} )אולם פחות מ-$12ns$(. 

\subsection{ללא שינוי זמן המחזור}

אם המעבד המשופר לא יכלול שום שינוי בבקר משרטוט \L{5.3} )וימשיך לרוץ 
באותו זמן מחזור(: איזו פקודה לא תתבצע כמו שצריך? )מספיק אחת(
%\answer{פקודות אשר צריכות לכתוב ל-\L{RF} במחזור האחרון: לא מובטח
%שבמחזור הקודם הגיעו הערכים המתאימים לכניסות הכתיבה של ה-\L{RF}}

\AnswerLines
{
  כל פקודה אשר צריכה לכתוב ליחידת הרגיסטרים )במחזור האחרון(: נשים לב 
  שבכל הפקודות הנתונים לפקודה יהיו מוכנים בזמן )בכל פקודה כזו יש מסלול צירופי
  שעובר לכל היותר פעמיים ב-\L{register file} ולפחות פעם אחת ב-\L{ALU}(
  הכתובת מגיעה מהשדה $R_t$ או השדה $R_t$ בפקודה )ב-\L{IR}. אולם לפני
  המחזור של הכתיבה עצמה לא מוגדרים הערכים של הבוררים $M_3$ ו-$M_4$. 
}

%\pagebreak

\noindent מהם השינויים הנדרשים לבקר ע"מ שכל הפקודות יוכלו לעבוד בצורה 
  תקינה? 
%\answer{הגדרת אותם ערכים ל-$M_3$ ול-$M_4$ מחזור שעון אחד מוקדם יותר
%בפקודות הכותבות ל-\L{RF}.}

\AnswerLines
{
  השינוי הנדרש הוא פשוט: בכל הפקודות אשר כותבות לאוגר במחזור האחרון
  שלהן, להבטיח שמחזור קודם לכן ינתנו כבר האותות המתאימים ל-$M_3$
  ו-$M_4$ )במקום "ערך לא מוגדר" כיום(. 
}

\subsection{שינוי מחזור השעון}

מעוניינים לקבל מערכת עם תפוקה משופרת. 
בסעיף זה עליכן להציע שינויים לבקר ולזמן המחזור כך שזמן הביצוע של אף
פקודה לא יפגע )ביחס להרצת אותה פקודה על מעבד ה-\MIPS{} המקורי עם זמן
המחזור המקורי(.

מה יהיה מחזור השעון החדש? \AnswerPlace{$5ns$}

הבאנה שתי דוגמאות לביצוע של פקודות במעבד החדש:

% איזו פקודה, לדוגמה, תוכל לעבוד יותר מהר? \AnswerPlace. 
\paragraph{פקודה ראשונה:}  \AnswerPlace{}\ 
מה יהיו אותות הבקרה בכל מחזור?
% \answer{פקודות $opcode=0$: זמן הביצוע: $35ns$ במקום $40ns$, פקודות \L{ADDI},
% \L{ANDI}, \L{ORI}: כנ"ל, \L{J}: $15ns$ במקום $30ns$, \L{BEQ}: $25ns$ במקום
% $30ns$, \L{JR}: $20ns$ במקום $30ns$}

\AnswerLines{}

%\pagebreak

% עבור איזו פקודה, לדוגמה, זמן הביצוע לא ישתנה? \AnswerPlace\
\paragraph{פקודה שניה:}  \AnswerPlace{}\ 
מה יהיו אותות הבקרה בכל מחזור?

\AnswerLines{}

%\pagebreak
\question{שאלת בניה}

יש להוסיף למעבד ה-\MIPS\ את הפקודה \L{DSW} )\L{Double Store Word}(:

\begin{otherlanguage}{english}
DSW $R_i$, $R_j$:

{\tt
  MEM[$R_i$] $\leftarrow$ $R_j$
  
  MEM[$R_j$] $\leftarrow$ $R_i$ 
}
\end{otherlanguage}

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

\smallskip

\begin{center}
\begin{tabular}{|c||r|}
\hline
 \R{עלות} & \R{השינוי} \\ \hline
\hline
 $n\cdot k$ & \R{תוספת בורר של $k$ סיביות עם $n$ כניסות} \\ \hline
 $\left(n_2-n_1\right)k$ & \R{הרחבת בורר $k$ סיביות מ-$n_1$ כניסות ל-$n_2$ כניסות} \\ \hline
 $10\cdot k$ & \R{תוספת אוגר ברוחב $k$ סיביות} \\ \hline
 $1000$ & \R{הוספת יחידת \L{ALU}} \\ \hline
\end{tabular}
\end{center}

\smallskip

שינויים בבקר, וכן שינויים בחיווט הם בחינם.

עליכן לפרט את:
\begin{enumerate}
\item קידוד הפקודה
\item השינויים למסלול הנתונים
\item השינויים לבקר )דיאגרמת מצבים(
\end{enumerate}

\ifiitcswanswers
  \paragraph{הקידוד:}
\fi
\Answer{נראה די טבעי לקודד את $R_i$ ו-$R_j$ כ-$r_s$ ו-$r_t$, ואכן כך
  נעשה. כדי לאפשר להוציא מיציאת ה-\ALU\ את $R_s$ נשים בשדה ה-\L{Imm} את
  הערך \L{"0"} )\L{16} ביטים(.
}

% This is the quickes way I found to have allow a row with no vertical
% rules:
\newcommand{\Mul}[1]{\multicolumn{1}{c}{#1}}
\begin{otherlanguage}{english}
\begin{center}
\Answer{
  \begin{tabular}{|c|c|c|c|}
  \Mul{6}	& \Mul{5}	& \Mul{5}	& \Mul{16}	\\ \hline
  DSW	& $R_i$		& $R_j$		& "0"		\\ \hline
  \end{tabular}
}
\end{center}
\end{otherlanguage}
%}
\renewcommand{\goodluckname}{%
  \hyperlink{http://home.att.net/~cecw/lastpage.htm}{\R{בהצלחה}}%
}
%\vfill
\answer{כאשר \L{DSW} הוא קוד פקודה השונה מכל קוד פקודה קיים}

\Answer{
  מסלול הנתונים הנוכחי מאפשר כתיבה לזכרון רק מתוך יציאת $R_t$ של
  ה-\L{RF}. כמוכן, בעזרת הקידוד שלנו אנו יכולים להעביר ליציאת ה-\L{ALU}
  את $R_s$ וכך להעביר ערך זה לכניסת $ADDR$ של הזכרון. בכך נשלים רק חצי
  מהמשימה: אנו צריכים לעשות את אותו הדבר, אולם תוך החלפת $R_s$ ו-$R_t$.
}

\Answer{
  נראה די מתבקש, איפה, להוסיף עוד שני בוררים שיאפשרו לנו להחליף בין
  הערכים של $R_s$ ו-$R_t$. אפשר לעשות את זה בשני מקומות: לפני
  ה-\L{register file}: להחליף בין מספרי הרגיסטרים, או אחרי 
  ה-\L{register file}: להחליף בין הערכים עצמם. במקרה הראשון צריכים
  בוררים של 5 ביטים, אולם שינוי בערכים מחייב מחזור נוסף של קיראה
  מהאוגרים. במקרה השני צריכים בוררים יותר רחב )\L{32} סיביות( אך לא
  צריך לחכות מחזור נוסף לקריאה. מכיוון שאנו רוצים מינימום חומרה, נבחר
  באפשרות הראשונה.
}

\ifiitcswanswers
  
  % TODO: this fails to work.  rem-out the following line to be able t typeset
  % the file properly
  \CenterFigure{iitcsw-samplefig}
  
  \Answer{בכל מקום שבו לא נאמר אחרת, $M_7=0$, $M_8=1$ )כלומר: חיבור כמו במסלול
  הנתונים הרגיל(}
\fi



\ifiitcswanswers
  \subsection*{מהלך ביצוע הפקודה:}%
\fi

\noindent\Answer{במחזור הראשון והשני: כמו כל הפקודות}

\noindent\Answer{%
  מחזור שלישי: 
  )אליו עוברים אם \L{opcode=DSW}( חישוב ב-\L{ALU} של $R_s+Imm$
}

\noindent\Answer{%
  מחזור רביעי: 
  חישוב ב-\L{ALU} של $R_s+Imm$, כתיבה לכתובת $ALU_{out}$ את $R_t$
}

\noindent\Answer{%
  מחזור חמישי: 
  "החלפת התפקידים" של $R_s$ ו-$R_t$, קריאת הערכים מה-\L{RF} מחדש
}

\noindent\Answer{%
  מחזור שישי: 
  חישוב ב-\L{ALU} של $R_s+Imm$
}

\noindent\Answer{מחזור שביעי: 
  חישוב ב-\L{ALU} של $R_s+Imm$, כתיבה לכתובת $ALU_{out}$ את $R_t$
}

\ifiitcswanswers
  \subsection*{אותות הבקרה:}
\fi

\noindent\Answer{במחזור הראשון והשני: כמו כל הפקודות}

\noindent\Answer{מחזור שלישי: $M_5=1$, $M_6=1$, $ALU_{op}=ADD$}

\noindent\Answer{מחזור רביעי: 
  $M_5=1$, $M_6=1$, $ALU_{op}=ADD$, $M_2=1$, $MEM_{write}$
}

\noindent\Answer{מחזור חמישי: $M_7=1$, $M_8=0$}

\noindent\Answer{מחזור שישי: $M_7=1$, $M_8=0$, $M_5=1$, $M_6=1$, $ALU_{op}=ADD$}

\noindent\Answer{מחזור שביעי: 
  $M_7=1$, $M_8=0$, $M_5=1$, $M_6=1$, $ALU_{op}=ADD$, $M_2=1$, 
  $MEM_{write}$
}




%\begin{figure}[b]
\begin{minipage}{\textwidth}
\subsection*{הקידוד של מספר פקודות:}

\begin{otherlanguage}{english}
\begin{verbatim}

ADD  $a, $b, $c:  opcode=0,  rs=b, rt=c, rd=a, shamnt=0, func=32
SUB  $a, $b, $c:  opcode=0,  rs=b, rt=c, rd=a, shamnt=0, func=34
OR   $a, $b, $c:  opcode=0,  rs=b, rt=c, rd=a, shamnt=0, func=37
AND  $a, $b, $c:  opcode=0,  rs=b, rt=c, rd=a, shamnt=0, func=36
SLT  $a, $b, $c:  opcode=0,  rs=b, rt=c, rd=a, shamnt=0, func=42
SLL  $a, $b, c :  opcode=0,  rs=0, rt=b, rd=a, shamnt=c, func=0
SRL  $a, $b, c :  opcode=0,  rs=0, rt=b, rd=a, shamnt=c, func=2
JR   $a:          opcode=0,  rs=a, rt=0, rd=0, shamnt=0, func=8

ADDI $a, $b, Imm: opcode=8,  rs=b, rt=a
LUI  $a, Imm:     opcode=15, rs=0, rt=a
BEQ  $a, $b, Imm: opcode=4,  rs=a, rt=b
SW   $a, Imm($b): opcode=43, rs=b, rt=a
LW   $a, Imm($b): opcode=35, rs=b, rt=a

J    Imm:         opcode=2
JAL  Imm:         opcode=3

\end{verbatim}

% 
% \newcommand{\reg}[1]{R$_{\textrm{#1}}$}
% 
% \begin{tabular}{*{10}{l}}
%     & command                   &OP &JImm& \reg{s} &\reg{t} &Imm &\reg{d} &
%     {\scriptsize shamnt} & func \\
% ADD & \reg{a}, \reg{b}, \reg{c} &0  &     &b  &c  &    &a  &0  &32 \\
% SUB  &\reg{a}, \reg{b}, \reg{c} &0  &     &b  &c  &    &a  &0  &34 \\
% OR   &\reg{a}, \reg{b}, \reg{c} &0  &     &b  &c  &    &a  &0  &37 \\
% AND  &\reg{a}, \reg{b}, \reg{c} &0  &     &b  &c  &    &a  &0  &36 \\
% SLT  &\reg{a}, \reg{b}, \reg{c} &0  &     &b  &c  &    &a  &0  &42 \\
% SLL  &\reg{a}, \reg{b}, c       &0  &     &0  &b  &    &a  &c  &0  \\
% SRL  &\reg{a}, \reg{b}, c       &0  &     &0  &b  &    &a  &c  &2  \\
% JR   &\reg{a}                   &0  &     &a  &0  &    &0  &0  &8  \\
% ADDI &\reg{a}, \reg{b}, Imm     &8  &     &b  &a  &Imm &   &   &                           \\
% LUI  &\reg{a}, Imm:             &15 &     &0  &a  &Imm &   &   &  \\
% BEQ  &\reg{a}, \reg{b}, Imm     &4  &     &a  &b  &Imm &   &   &  \\
% SW   &\reg{a}, Imm(\reg{b})     &43 &     &b  &a  &Imm &   &   &  \\
% LW   &\reg{a}, Imm(\reg{b})     &35 &     &b  &a  &Imm &   &   &  \\
% J    &JImm                      &2  &JImm &   &   &    &   &   &  \\
% JAL  &JImm                      &3  &JImm &   &   &    &   &   &  \\
% 
% \end{tabular}
\end{otherlanguage}
\end{minipage}
%\end{figure}

\FinalText{}

\end{document}
