330 likes | 416 Views
Implement the behavior of LC-3 CPU by reading instructions from a binary file, fetching and decoding instructions, executing them, and storing results in registers or memory.
E N D
Introduction to C Programming Final Project: LC-3 CPUControlUnit Simulator
題目簡介 Briefintroductiontotheproject
LC-3 CPUControlUnit • 目標: • 用軟體實作LC-3 CPU的行為 • 自Binaryfile讀取指令 • 依序Fetch、Decode指令 • 再來若該指令有需要Evaluateaddress、Fetchoperand則Evaluateaddress、Fetchoperand • Execute該指令 • 將結果Store到Register或Memory。
LC-3 CPUControlUnit • 會以輸入一個Binary file的方式作為input(讀取方式可參考C語言Ch8投影片讀取Binary file之方式) • 輸出結果是將每次指令單步執行(PC=PC+1)時,當下Register、Memory的值印出到檔案 • Memory大小是由題目指定的,可使用Array來模擬Memory • 關於LC-3 CPU控制單元的行為請參考LC-3Ch4投影片 • 關於LC-3每種指令的行為請參考LC-3 Ch5投影片 • 我們實際上不會實作全部的指令,要實作哪些指令、有哪些詳細的規格、配分在投影片後面會詳述
需要模擬的指令 Theinstructionswhichshouldbesimulated
數學運算指令(70%) • ADD • AND • NOT
Load/Store指令(15%) • LOAD類 • LD • LDI • LDR • LEA • STORE類 • ST • STI • STR
分支類與軟體中斷指令(15%) • SoftwareInterrupt • TRAP • Return • RET • Unconditionalbranch • JMP • JSR • JSRR • Conditionalbranch • BR(n)(z)(p)
註:RET指令敘述 摘錄自”IntroductiontoComputerSystems”,PattandPatel,2ndEd.,p536
備註 • 只有被列出來的指令需要模擬 • 每個指令的行為請參考LC-3投影片的Ch5投影片,但是若Spec上有修改部分指令的行為時,請依照Spec的修改來實作
實作講解 Hintofimplementation
實作講解與範例 • 在實作的時候,基本上是按照下面這個流程圖來實作 • Step1:自我們提供的input.bin當中,每16-bit切出一道指令,將檔案中的指令全部收集 • Step2:將剛才收集到的指令依序放入你用軟體模擬的記憶體當中,從0x0030的位置開始依序放入 • Step3&4:模擬CPU行為、並把PC每移動一次時,Register和Memory的值印到檔案中
如何自Binaryfile讀取指令? • 真正編譯器編譯出的Binary file除了程式碼外,還會帶有相當多其他的資訊,在這邊就不詳加討論。 • 我們所提供的Binaryfile會是一個相當簡化的Binary file,裡頭只有指令的部份,是以0101的方式儲存,注意不是用純文字的方式儲存,所以你在讀取檔案的時候,必須要用Read Binary File的方式讀取。 • 若你要自Binaryfile當中讀取指令,你要以每16-bit為一個單位切出指令出來,然後把切出來的指令的值存起來,即可切出一道指令。
CPUControlUnit模擬 • 在實作CPUControlUnit的時候,基本上是按照下面這張StateDiagram來用軟體實作,前段是Fetch與移動PC的部份、再來Decode,決定是屬於哪類指令,再來分別實作 圖片取自:”IntroductiontoComputerSystems”,PattandPatel,2ndEd.,投影片Ch4第22頁
如何看著Ch5的指令敘述用軟體實作? • 在下面的範例當中,我們假設同學已經完成前段自Binary檔案Load到Memory的部份、Decode OPcode的部份,我們只會給大家看如何看著一個Instruction的描述,來實作其行為。(但同學在實作的時候,前面自Binary檔案Load到Memory的部份、Decode OPcode的部份仍然要自己實作)
範例:NOT指令 • 假設同學已經DecodeIR[15:12]的OPcode,知道這道指令是NOT,由下面的圖可看出,他是要把Sourceregister裡面的值拿出來取NOT,然後寫回Destinationregister裡。 Note: Src and Dstcould be the same register. 圖片取自:”IntroductiontoComputerSystems”,PattandPatel,2ndEd., 投影片Ch5第6頁
由於NOT指令只需要Fetch Operand、Execute和Store回RegisterFile,故我們在實作的時候只需要實作這些部分,你可以針對NOT指令的模擬寫一個emu_not如下: • 其中的fetch_not_operand、exec_not、store_not的內容在下幾頁投影片會解釋 • [註]:u16是我們範例程式中自行定義的:typedefunsignedshort,其長度為16-bit
首先,要先fetch這道指令的Operand,所以我們寫一個fetch_not_operand的函式,輸入參數為該道指令,回傳值為operand,operand是一個structure,裡面包含src1、src2和dst,在這個案例中,因為只有一個source register,所以只填入src1和dst。 • 我們把原本instruction中instr[8:6]的值取出來作為Sourceregister的編號,把instr[11:9]的值取出來作為Destinationregister的編號
接下來,執行NOT指令應該要做的事情,也就是把Source Register的值取出來,然後做「NOT」邏輯運算,然後回傳回去。
最後,把NOT邏輯運算出來的結果,寫到RegisterFile當中的DestinationRegister。即完成此指令的行為模擬。最後,把NOT邏輯運算出來的結果,寫到RegisterFile當中的DestinationRegister。即完成此指令的行為模擬。 • [註] 我們有提供NOT指令的範例程式碼片段,你可以直接擷取此部份的程式碼到你自己的程式中,也可以自己實作。但是不論如何,最後Demo的時候你的程式必須也要能執行NOT指令
題目規格 Spec
Spec • 輸入檔案會是一個簡化後的可執行檔,以二進位儲存資料的一個檔案。 • 你必須先將指令Load進來放到用軟體模擬的Memory的0x0030的地方,將每道指令依序放置(第一道指令在0x0030、第二道在0x0031等等依序排放) • 要執行的時候,自0x0030的指令開始執行(初始PC=0x0030),除非遇到Branch類指令,不然就是依序往下執行(PC=PC+1),遇到Branch類指令則依照Branch類指令的行為決定執行順序 • TRAP指令所定址的VectorAddress是從0x0070~0x007F
Spec • 在每執行一道指令後,把當時的結果輸出到檔案,格式請按照後面Sample output file當中的格式輸出,輸出時請將執行完後當下的PC、R0~R7的值印出,Memory當中的值只要印出0x0000~0x002F的部份即可。 • 在輸入檔案當中的指令全部被執行完畢後,結束程式
Spec • 你要用軟體模擬的Memory大小請以0x0000~0x007F(請注意是16進位)為準,其中0x0000到0x002F是給保留給程式當做資料儲存用的,0x0030到0x006F是拿來存放程式碼的,0x0070到0x007F是拿來存放Trap的Vector內容的。在實作上,可用Array來模擬Memory即可,不需要模擬更細部的記憶體硬體行為。 • 不需要考慮真正LC-3當中Supervisormode和Non-supervisor mode的差別。 • 不需要考慮真正LC-3當中,對高位與低位Memoryspace的權限控制。 • 不需要考慮Hardware Interrupt的部份。 • 輸入檔案名稱為input.bin、輸出檔案名稱為output.txt,檔名直接寫定在程式碼當中即可。
Spec • 由於範例input是以binary的形式存在,所以不方便直接顯示,我們下面的內容是寫出input.bin其原始組合語言的方式來顯示,並且顯示出當輸入這個input.bin時,你應該寫入到output.txt的內容。範例input.bin和範例output.txt之後會在iLMS上公布。 • 你的程式的輸出格式必須依照Spec上所規定的格式輸出 • 範例input.bin的組合語言內容: • NOTr1,r0 • NOTr2,r0
Spec • 範例output.txt輸出內容(第一頁):
Spec • 範例output.txt輸出內容(第二頁):
加分題 Bonus
Bonus-1:Livecoding • 我們會在Demo現場新增新的Instruction type,當場公布該新增的Instruction之Encode方式與指令邏輯行為,有要DemoBonus-1的人會需助教面前現場修改自己的程式碼,若在10分鐘內可以順利讀取並且模擬新增的Instruction type的行為,即可取得此Bonus分數。若超過10分鐘還沒寫出來,則就無法取得此Bonus分數。 • Livecoding環境可使用自己的筆電、遠端桌面或是工作站等熟悉的環境 • 要Demo Bonus-1的人需要在填寫Demo timetable的時候就告知助教說要DemoBonus。
Bonus-2:Disassembler 反組譯器 • 此部份為事先完成的,不是Live coding • 將輸入的Binaryfile,輸出成對應的組合語言程式碼 • 輸入檔案:Binaryfile • 輸出檔案:Assemblylanguagefile(純文字檔,內容是組合語言) • 裡面遇到Label的部份,在Generate組合語言檔案的時候,可自行取Label名稱,只要符合原始輸入的Binary file的程式行為即可。
評分方式與繳交期限 Gradingpolicy&Deadline
Gradingpolicy • 運算類指令:70% • Load/Store類指令:15% • Branch類與軟體中斷指令:15% • Bonus-1-Livecoding:10% • Bonus-2-Disassembler:5%
Deadline • 2013/01/24 • FinalProject不接受補交,若當天不能來Demo的人請先寄信過來提早Demo。