5級流水無cacheCPU實驗計算機組成原理課程設計報告_第1頁
5級流水無cacheCPU實驗計算機組成原理課程設計報告_第2頁
5級流水無cacheCPU實驗計算機組成原理課程設計報告_第3頁
5級流水無cacheCPU實驗計算機組成原理課程設計報告_第4頁
5級流水無cacheCPU實驗計算機組成原理課程設計報告_第5頁
已閱讀5頁,還剩21頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、計算機組成原理課程設計報告5級流水無cache CPU實驗1.1 實驗內容:無cache流水CPU的分析與改造1. 理解無cache流水CPU的工作原理,明確系統總體結構和數據通路圖,分析解決各種相關用到的主要信號,以及詳細分析各流水段的功能和實現。2. 將16位的指令系統改為8位,設計新的指令系統,并修改相應的數據通路。3. 修改規則文件(cpu.txt),并編寫測試程序驗證系統改造的正確性。1.2 總體基本信息1. 深刻理解無cache流水cpu的工作原理。在詳細分析了各流水段的功能實現、3種相關的產生原因和解決方法的基礎上,完成了以下后續工作。2. 修改指令系統。具體包括:a) 16位指

2、令改為8位,重新編寫了指令OP碼。b) 新增了MOVI指令。由于原指令系統沒有將立即數存進指定寄存器的指令,因此此處新增一條MOVI指令。指令的匯編語句為MOVI DR, IMM其中DR為目的寄存器,IMM為立即數。因為指令長度為8位,OP和DR共占了6位,因此IMM的大小不大于3(即二進制“00”至“11”)。c) 修改及刪除了部分指令。此處詳見5.1。3. 修改系統控制信號。在保持原有系統邏輯功能基本不變的情況下,修改各個模塊里控制信號位數以及模塊接口信號位數以和新的指令系統兼容。4. 增加內存模塊。使用vhdl編寫了一個ram模塊,根據讀寫信號來選擇讀寫功能。reset時將事先寫好的二進

3、制形式程序寫進內存。5. 擴展了常量定義文件。在常量定義文件unitpack.vhd中,具體地:a) 新增了ALU功能選擇信號常量aluMOVI。b) 新增了寄存器編號常量R0、R1、R2和R3。c) 新增了ram類型。6. 使用Quartus II進行功能仿真并debug。7. 使用bdf構造頂層實體cpum。由于新增了內存模塊,而原系統是使用vhdl編寫的,為了方便對接,我們使用bdf的形式將無cache流水線cpu和內存模塊連接起來構造頂層實體cpum,“m”的含義是“memory”,即帶內存模塊的無cache流水線cpu。8. 重畫數據通路圖。我們使用了Microsoft Visio軟

4、件在原有的系統總結結構圖的基礎上修改并新增了部分模塊,詳見2。2、系統總體結構及數據通路圖總體結構圖:數據通路圖:整個CPU由以下幾個模塊組成:l 取指模塊(IF):給出內存地址,讀取指令并送入指令寄存器,為下一級準備數據。由于PC控制模塊處于取指模塊中,因此控制相關的檢測也置于取指模塊。l 譯碼模塊(ID):讀取寄存器值和指令譯碼。我們采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數據(如立即數等),在每次時鐘上升沿到來時送入下一級。實際上,結構相關、控制相關、數據相關的檢測都可歸入譯碼部分??紤]到“相關檢測”涉及到的信號分屬不同階段以及整體結構的清晰性,我們將“相關檢測”獨立

5、出來。l 執行模塊(Ex):完成算術邏輯運算、計算有效地址和提供數據通道。l 訪存模塊(Ma):選擇地址線的數據來源和數據線的流向。訪存和取指在功能上是獨立的,但CPU對外只有一條地址線和數據線的事實決定了訪存和取指是相互聯系的。當執行LOAD/STORE指令時,地址線由ALU送入“訪存段”的值提供;取指時,則由PC提供。當寫內存時,CPU內部數據送數據線;當需要讀內存時,CPU往數據線送高阻。l 回寫模塊(Wb):選擇回寫數據源和根據寫使能信號wRegEn將數據回寫到寄存器堆;l HazardDetectUnit模塊:檢測結構相關;l ForwardingUnit模塊:檢測數據相關。l 內存

6、模塊memory,根據訪存地址mem_adr和讀寫信號wr來控制。3 解決各種相關用到的主要信號的分析3.1控制相關 控制相關是指因為程序的執行方向可能改變而引起的相關。當執行跳轉指令時,就會發生這種情況。除JR外,JRZ等條件跳轉需要根據當前狀態位來決定是否跳轉,而當前狀態位是由前面最近的會影響狀態位的指令(如算術指令)決定。常規的也是比較簡單的做法是在碰到JRX之類的跳轉指令時,延遲后邊流水線的進入。但我們通過分析,認為可以一點都不必延遲,通過旁路處理把控制相關轉為數據相關來處理。這樣處理,不必延遲,可以提高流水線的性能。按我們的方式解決控制相關需要做兩項工作:1) 通過旁路,提供狀態寄存

7、器的值和臨時狀態位的值,為判斷是否跳轉作準備;2) 選擇PC更新的時機1旁路處理在每條指令譯碼時,會產生一個信號setFlag,它決定了在執行階段是否根據ALU計算結果改變狀態位。從下面的時序圖中可以發現,只要我們在JRX指令譯碼時提供以下3個信號就可作出是否跳轉的決定:信號含義tFlagALU計算出的臨時狀態位,Flag狀態寄存器輸出,e_setFlag狀態寄存器寫使能表17 處理控制相關信號若e_setFlag要寫狀態寄存器,則說明前一條指令會影響狀態位,這時根據tFlag決定是否跳轉;若e_setFlag要保持狀態寄存器,則說明前一條指令不會影響狀態位,這時根據Flag決定是否跳轉。涉及

8、到控制相關的關鍵信號是setFlag信號,產生于譯碼模塊,作用于執行模塊,即identity.vhdhe exentity.vhd文件中。如下圖所示。從上圖可看出,凡是涉及到數值計算和關系運算的指令的低三位均為001,而不涉及的則為000。該信號傳到執行模塊中用于判斷是否更新狀態寄存器。3.2 數據相關數據相關是指在執行本條指令的過程中,如果用到的操作數是前面指令的執行結果,則必須等待前面的指令執行完成,并把結果寫回寄存器或主存之后,本條指令才能繼續執行。此處采用設置專用數據通路來解決數據相關問題。但旁路技術并非一勞永逸。若前一指令為LOAD,而后一指令和它數據相關,如下圖所示,當下一指令的執

9、行階段需要數據時,上一指令尚未給出,這種情況是無法用旁路技術來解決的。相關的類型有三種:1.2.3.主要用到的關鍵信號是m_wRegEn和w_wRegEn,主要使用是在數據相關檢測模塊forwardingentity.vhd中,在identity.vhd、exentity.vhd、memaccessentity.vhd中均有使用。具體的使用方法如下。相關的檢測都置于“執行階段”。信號wRegEn是寄存器寫使能,SA,SB是寄存器組A,B口選擇信號。信號前綴表示信號所處的階段。如e_SA表示處于執行階段的SA。1相鄰指令數據相關的檢測 若m_wRegEn=1,則表示前一指令要回寫寄存器。此時,若

10、e_SA或e_SB等于m_SA,則必然數據相關,這是因為我們規定,若回寫寄存器,則寄存器A口選擇信號所指定的即為目的寄存器。否則無關。2 中間隔1條指令的兩指令數據相關的檢測 若w_wRegEn=1,則表示第一條指令要回寫寄存器。此時,若e_SA或e_SB等于w_SA,則必然數據相關。否則無關。當然,上述兩種情況可能會一同出現。這時,我們就按情況1處理。因為情況2可以理解為接連出現情況1。下圖為各個指令在譯碼時產生的wRegEn信號,可以發現凡是會寫進寄存器的指令,該信號值都為1。3.3 結構相關由于在設計中不包含緩存,因此會有取指和訪存的沖突,即結構相關。如下圖:關鍵信號是wrMem信號,表

11、示是否讀寫內存。具體出現在結構相關沖突檢測與問題解決模塊Hazarddetectentity.vhd中,產生于譯碼模塊identity.vhd中。具體使用方法如下:1) 沖突檢測只有執行訪存指令(LOAD/STORE)時,才會出現沖突。因此,我們在譯碼時產生一個標志是否訪存的信號wrMem。含義如下:wrMem意義00寫內存(STORE)01讀內存(LOAD)1不占用內存 表16 wMEM控制信號通過檢查“訪存階段”的m_wrMem就可確定是否沖突。2)取指延后在每次取指時,若有沖突,則往IR中寫入空指令(NOP),并保持PC不變,使取指延后一個節拍。4 各流水段功能和實現的詳細分析4.1取指

12、(IF)4.1.1 實現功能列表取指模塊實現的功能是:l 給定內存地址,讀取內存中的指令l 將指令送入指令寄存器,提供給下一級的譯碼模塊l 實現控制相關沖突檢測l 根據讀取到的指令是否為跳轉指令來更新PC4.1.2輸入、輸出信號分析主要輸入信號:Z,C狀態寄存器tempZ,tempCALU計算出的臨時狀態位,用于相關沖突檢測e_setFlag狀態寄存器寫使能端,產生于譯碼時。決定是否在執行階段根據ALU計算出來的結果改變狀態位PCStall決定是否保持PC不變,由結構相關沖突檢測模塊產生IFFlush決定是否往指令寄存器IR里寫入空指令,來自結構相關檢測模塊OuterDB內存讀取過來的數據主要

13、輸出信號:PC_addrPC作為內存地址輸出,用于下一節拍的取指d_PCInc1PC + 1d_IR指令寄存器輸出 4.1.3功能實現邏輯通過分析控制信號我們可以大概了解到取指模塊的功能實現邏輯是如何的。廣義上來說,取指模塊包括結構相關沖突檢測模塊,因為PCStall信號(用來實現IF段對PC的更新)和IFFlush信號(對IR寫入空指令)就來自結構相關沖突檢測模塊。結構相關檢測模塊叫HazardDetectEntity,其模塊圖如下:其中輸入信號的含義是:m_wrMemwrMem在訪存階段的值w_rwMemwrMem在寫回階段的值d_IR指令寄存器通過檢測訪存階段的wrMem信號即可確定是否

14、發生了結構沖突。每次取指后,若有沖突,則往IR中寫入空指令(NOP),并保持PC不變,使得取指延后一個節拍。除此之外,setFlag信號在此處的作用是,決定用狀態寄存器輸出Flag還是ALU計算出的臨時狀態位tFlag來判斷跳轉。4.2譯碼(ID)4.2.1 實現功能列表譯碼模塊實現的功能是:l 讀取指令寄存器中的指令l 對指令進行譯碼,發送控制信號4.2.2輸入、輸出信號分析主要輸入信號:d_IR從取指模塊來的指令d_PCInc1從取指模塊來的pc+1w_wbData寫回數據,從寫回模塊里來w_destReg要寫回的目標寄存器w_wRegEn寄存器寫使能端主要輸出信號:e_RAOut寄存器A

15、輸出值e_RBOut寄存器B輸出值e_IMM立即數輸出值e_ALUSrcALU輸入端選擇信號e_ALUOprALU運算選擇信號e_SetFlag狀態寄存器寫使能信號e_wrMem訪存信號e_wRegEn寄存器寫使能信號e_destReg目標寄存器e_MemToReg內存寫入寄存器使能信號4.2.3功能實現邏輯譯碼模塊內部寫好了根據不同的指令發送不同的控制信號的代碼,采取一次譯碼,逐級傳遞的方式,譯出后幾級流水所需的控制信號和數據(如立即數)。在每次時鐘上升沿到來時送入下一級。實際上,結構相關、控制相關、數據相關的檢測都可歸入譯碼部分。考慮到“相關檢測”涉及到的信號分屬不同階段以及整體結構的清晰

16、性,作者將“相關檢測”獨立出來。4.3執行(EX)4.3.1 實現功能列表執行模塊實現的功能是:l 根據控制信號完成算術邏輯運算l 根據控制信號計算有效地址l 提供數據通道,將上一級傳遞過來的控制信號傳到下一級4.3.2輸入、輸出信號分析主要輸入信號:e_RAOut、e_RBOut、e_ALUSrc、e_ALUOpr、e_SetFlag、e_IMM、e_memToReg、 e_wRegEn、來自譯碼模塊的控制信號forwardA、forwardB來自數據相關沖突檢測模塊的輸出e_ALUOut上一個指令在執行模塊產生的輸出,作為下一條指令在執行模塊執行的輸入信號之一主要輸出信號: m_SA、m_

17、ALUOut、m_RBdata、i_tempZ、i_tempC、m_flag、m_wRegEn、m_memToReg、m_destReg、m_wrMem主要來自上一級模塊傳過來的控制信號4.3.3功能實現邏輯執行模塊執行的功能很簡單,和上個學期做的CPU綜合性實驗類似,主要是一些ALU邏輯運算和狀態寄存器的更新操作。在這里還有向下一模塊傳遞控制信號的作用。其中,forwardA和forwardB信號是來自數據相關沖突檢測模塊的信號。 模塊圖如下所示:作用是在發生讀后寫數據相關時,直接將計算好了的結果在寫回目標寄存器時也發往下一條指令的執行模塊作為ALU的輸入之一。4.4訪存(MEM)4.4.1

18、 實現功能列表訪存模塊實現的功能是:l 根據地址線對內存進行讀操作或者寫操作4.4.2輸入、輸出信號分析主要輸入信號:m_wrMem內存讀寫控制信號m_ALUOut來自ALU的輸出結果m_RBdata要寫回的數據PC程序計數器的值主要輸出信號:w_wrMem傳送到寫回模塊的內存讀寫控制信號wr讀寫控制信號addr要讀取的內存地址OuterDB既可作為輸入又可作為輸出,用于傳輸數據4.4.3功能實現邏輯訪存和取指在功能上是獨立的,但是因為CPU對外只有一條地址線和數據線,因此訪存和取指在實際上是有聯系和沖突的。當執行Load/Store指令時,地址線由ALU送入訪存段的值提供;取指時,則由PC提

19、供。當寫內存時,CPU內部數據送往數據線。當需要讀內存時,CPU往數據線送高阻。4.5寫回(WB)4.5.1 實現功能列表寫回模塊實現的功能是:l 選擇寫回數據源(來自ALU的輸出還是來自內存)l 根據寫使能信號wRegEn將數據寫回到寄存器組4.5.2輸入、輸出信號分析主要輸入信號: s_w_ALUOutALU的輸出 s_w_MemOut內存讀取的輸出 s_w_memToReg決定寫入寄存器的數據來源 s_w_flag要寫進狀態寄存器的值4.5.3功能實現邏輯此部分較為簡單,即通過s_w_memToReg信號來決定是將ALU的輸出寫進寄存器還是將從內存讀出來的數據寫進寄存器。模塊圖如下:5

20、系統改造5.1新的指令系統匯編語句操作碼功能描述指令類型ADD DR,SR0000DR+SRDR算術邏輯指令SUB DR,SR0001DR-SRDRCMP DR,SR0010DR-SR 比較AND DR,SR0011DR and SRDR 邏輯與OR DR,SR0100DR or SRDR 邏輯或XOR DR,SR0101DR xor SR DR 異或SHL DR0110邏輯左移,最低位補0,最高位移入CSHR DR 0111邏輯右移,最高位補0,最低位移入CMOVI DR,IMM1000IMM(立即數)DR,存立即數進寄存器數據傳送指令MOV DR,SR1001SR DRLOAD DR,SR

21、1010SR DRSTORE DR,SR1011 SR DRJR ADR1100無條件跳轉到ADR , ADR=原PC值+OFFSET控制轉移指令JRC ADR1101當C=1時,跳轉到ADR, ADR=原PC值+OFFSETJRZ ADR1110當Z=1時,跳轉到ADR, ADR=原PC值+OFFSETNOP1111空操作其他5.1.1選擇改動說明包括NOP空操作指令在內指令系統共包括16條指令,在原有的25條指令的基礎上刪除了10條,新增了1條。具體地,刪除了DEC,INC,TEST,SAR,PUSH,POP,JRNC,JRNZ,LOADH,LOADL,新增了一條數據傳送指令MOVI。5.

22、2修改的代碼及說明1)代碼段1,新增內存模塊memory.vhd-內存-2015-10-30library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use work.unitPack.all;ENTITY memory ISPORT ( databus : inout STD_LOGIC_VECTOR(7 DOWNTO 0);-數據總線addr : IN STD_LOGIC_VECTOR(7 DOWNTO 0);-訪存地址wr : IN STD_LOGIC;-讀寫控制信號reset: IN STD_LOG

23、IC);END memory;ARCHITECTURE rtl OF memory ISSIGNAL ram:ram_type;-ram_type在unitpack.vhd文件里定義BEGINPROCESS(addr,wr,ram,databus,reset) BEGINIF reset=0 THENram(0) = MOVI & R0 & 11;-此處將程序寫進內存中,省略ram(15) = JR & 1110;END IF;-讀寫功能的實現IF wr=0 THENdatabus = Z8;ram(conv_integer(addr) = databus;END IF; IF wr=1 TH

24、EN databus = ram(conv_integer(addr);END IF;END PROCESS; END rtl;內存模塊使用vhdl編寫,內存由ram組成,讀出數據線和寫入數據線為同一條數據總線,因此不能同時進行讀寫。因為這樣所以會產生結構相關,即在取指的時候不可以訪存,否則會產生沖突。內存讀寫功能由wr信號進行控制,當wr為0時執行寫功能,當wr為1時執行讀功能。2) 代碼段2,取指模塊ifentity.vhdop = IR(7 downto 4);-操作碼取指令的高4位-控制相關信號e_setFlag,用于選擇當狀態寄存器的值來源with e_setFlag select

25、ZZ = Zwhen flag_hold, tempZ when others;with e_setFlag select CC = Cwhen flag_hold,-由于跳轉信號中只保留了JR、JRC、JRZ,因此此處只判斷該3個OPs_selZ = 1 WHEN( op=JRZ AND ZZ=1) -判斷是否跳轉 OR op=JR else 0; s_selC = 1 WHEN( op=JRC AND CC=1) -判斷是否跳轉 else 0; PCIncSel = 1 WHEN s_selZ=1 or s_selC=1 ELSE 0; s_PCInc1 = PC + x01;-此處修改了

26、PC位數 WITH PCIncSel SELECT-當有跳轉時pc = pc + offset,否則pc = pc + PCnext = s_PCInc1 WHEN 0, PCPlusOffset WHEN 1, s_PCInc1 when others; process(reset,clk,PCStall)beginif reset = 0 thenPC = x00;-此處修改了PC位數 elsif FALLING_EDGE(clk) and (PCStall=0) then PC ALUResult := opR + opS; tempV := (not opR(7)and(not opS

27、(7)and ALUResult(7) or (opR(7)and opS(7)and (not ALUResult(7); when aluSub = ALUResult := opR - opS; tempV := ( opS(7)and(not opR(7)and (not ALUResult(7) or (NOT opS(7)and opR(7)and ALUResult(7); when aluAnd = ALUResult := opR and opS;when aluOr = ALUResult := opR or opS;when aluXor = ALUResult := o

28、pR xor opS;when aluShl = ALUResult(7 downto 1) := opR(6 downto 0); ALUResult(0) := 0;cx := opR(7);when aluShr = ALUResult(6 downto 0) := opR(7 downto 1); ALUResult(7) := 0;cx := opR(0); -增加了aluMOVI的alu功能選擇信號及其處理實現when aluMOVI = ALUResult := 00000&opS(3 downto 0);when others = null;end case; 修改了alu選擇

29、信號以及alu功能信號的判斷邏輯,以及狀態寄存器的判斷邏輯,之所以修改是因為位數的修改。除此以外還增加了aluMOVI的alu功能信號及其對應的邏輯功能實現。1) 代碼段1,譯碼模塊identity.vhd新增了的WriteBack:process(reset,clk) -寫回模塊begin if reset=0 then-新增了初始化寄存器一步 RegArray(0) = x00; RegArray(1) = x00; RegArray(2) = x00; RegArray(3) = x00;elsif FALLING_EDGE(clk) and w_wRegEn=1 thenRegArra

30、y(wRegIndex) ctrl:=d_IR(3 downto 0)&10&1&1&001&0000&001;when SUBB = ctrl:=d_IR(3 downto 0)&10&1&1&001&0001&001;when ANDins = ctrl:=d_IR(3 downto 0)&10&1&1&001&0010&001;when CMP = ctrl:=d_IR(3 downto 0)&10&0&1&001&0001&001;-新增了MOVI指令及其譯碼出來的控制信號when MOVI = ctrl:=d_IR(3 downto 0)&10&1&1&101&1010&000; i

31、mm ctrl:=d_IR(3 downto 0)&10&1&1&001&0011&001;when XORins= ctrl:=d_IR(3 downto 0)&10&1&1&001&0100&001;when SHLIns = ctrl:=d_IR(3 downto 0)&10&1&1&000&0101&001;when SHRIns = ctrl:=d_IR(3 downto 0)&10&1&1&000&0110&001;when MOV = ctrl:=d_IR(3 downto 0)&10&1&1&011&0000&000;when LOAD = ctrl:=d_IR(3 downt

32、o 0)&01&1&0&011&0000&000;when STORE= ctrl:=d_IR(3 downto 0)&00&0&1&000&0000&000;when JR|JRZ|JRC = ctrl:=DoNothing; -若是JR*指令,計算offset,并向Exe插入Bubble offset ctrl:=DoNothing; end case;譯碼模塊主要修改了控制信號ctrl的位數,并根據“SA, SB, Wrmem, wRegEn, MemToReg, ALUSrc, ALUOpr, SetFlag”的順序增加了MOVI指令的控制信號,如下所示:when MOVI = ctr

33、l:=d_IR(3 downto 0)&10&1&1&101&1010&000; imm = 000000&d_IR(1 downto 0);最后還增加了寄存器的初始化。6 測試與總結6.1 規則文件(cpu.txt的內容)6.2測試代碼-程序1-指令正確性測試- R0R1R2R3ram(0) = MOVI & R0 & 11;- 3000ram(1) = ADD & R0 & 01;- 4000ram(2) = MOV & R1 & R0;- 4400ram(3) = SUBB & R1 & 11;- 4100ram(4) = SUBB & R2 & 10;- 41-20ram(5) = ADD & R2 & 11;- 4110ram(6) = ORIns & R1 & R0;- 4410ram(7) = ANDIns & R1 & R2;- 4110ram(8) = XORIns & R0 & R1;- 5110ram(9) = SHLIns & R1 & 00;- 5210;ram(10) = SHRIns & R0 & 00;-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論