BUAA計組p3_Logisim_復習tips


p3 OCC


一、設計需求

  • 基礎要求指令集:{addu, subu, ori, lw, sw, beq, lui, nop}。

  • MIPS-C0指令集:{addu, subu, beq, sltu, lw, sw, jal, jr}

  • 課下實現指令集:{addu, subu, ori, lui, sll, lw, sw, lb, sb, j, jal, jr, jalr, beq, nop}


二、指令添加步驟

  1. 分析數據通路,判斷是否需要修改模塊
  2. 確定控制信號,在控制元件中添加控制指令
  3. 檢查控制指令實現情況,測試數據

三、高老板的教導!!!(ptsd合集)

  1. 設計思想

    • 層次化設計思想,在思考一層的搭建設計時,應該着眼於各部件的主要功能需求實現,以及各部件之間的主要聯系,整體觀念最為重要。在設計該層時向下最多深入一層,過於糾結下層設計會導致整體觀念混亂。

    不同層次應關注不同的問題域;RTL描述關注的是指令執行所涉及的對象及其操作的抽象,但建模CPU內部結構時就必須關注對象與操作的具體實現方式。

    • 以單周期為例,首先要掌握的是整體的架構,要熟悉單周期CPU模型,再思考功能部件與控制器的設計與實現

      1. 熟單悉周期CPU模型:
      • 單周期CPU模型分為控制器與數據通路,可以通過指令的宏觀實現過程完成對於數據通路所需功能部件及其關系的思考。首先PC通過地址信息驅動IM輸出指令信息,緊接着指令信息驅動從寄存器堆中讀出參與運算的寄存器值,之后從寄存器堆中輸出的操作數進入ALU參與運算,其運算結果或寫回至目的寄存器,或進數據存儲器,同時一些指令從數據存儲器中讀取數據寫入目的寄存器中。當然,需要通過指令存儲器及PC值計算下一指令的地址,即NPC。
      1. 功能部件的設計與實現:指令級數據通路及控制信號真值表的建模、數據通路的綜合、綜合器的綜合

      2. 建模指令的數據通路與控制信號真值表

      3. 控制器的設計與實現:考慮指令與數據通路的功能部件之間的關系,再進行具體實現的映射部分

  2. 自己的問題:

    • 設計思路方面的邏輯不清,缺乏層次化設計的思想

    • 對於基礎模型的概念的掌握非常差

    • 對於指令的實現很不熟悉


四、dalao的實現思路(膜)

ACE_control

part1: 進入后先識別指令

part2: 翻譯為RTL表達,把rs,rt,rd寄存器對應上,直接在control里確定好GRF的A1,A2,A3

part3:control signal直接給每一個指令編碼control值,其splitter即為各control值


五、課下感悟

  1. 如果該位之前Control連的是零新加指令需要修改這一位務必刪除0

  2. 注意控制指令務必寫全位數,確保高位到低位連接的順序,為0的位置不連!control連接完成之后對照文檔檢查一下是否正確,所以文檔務必寫對!

  3. 注意關注指令的實際意義,以簡化測試代碼的編寫,比如sll左移的數字必須是小於等於31的,低級錯誤一定避免!

  4. IM一定先clear再load

  5. 看清楚rt,rd,rs!!!!!!!!!rd, rt常作為A3,rs是A1

  6. 先clear再連接controller里面指令判斷

  7. 確保mips里的代碼一行對一行不要有偽指令!


六、課上測試

  1. 課上感悟

    1. 玄學問題如我遇到的一上來一連線就變藍線,先開始擔心是不是課下殘留的bug,試圖直接引OpCode和Funct替代與邏輯運算直接判斷,結果也藍線,De了20min心態鍛煉效果極佳。解決辦法:果斷關掉Logisim重開。經驗:重啟解決玄學bug,親測非常之有效。

    2. 認真讀懂RTL描述性語言非常之重要。本次指令中LBI指令因為沒有讀懂load and insert浪費了不少時間。建議務必先讀懂指令含義,分析清楚數據通路,再下手連接,確保高效且思路清晰。類似LBI這樣與LB指令類似的指令,可以通過閱讀手冊,對比其與LB指令的區別幫助理解,2h加三個指令時間其實相對很充足,心態要好,要細心(老生常談,勸誡自己emm)。

    3. 跳轉類指令debug如果發現測試點部分正確,及時去查看是否為PC值得擴展方式選錯了。如查錯本次課上的BLTZALR指令時,看到報錯信息部分正確,立即去查了branch類指令PC+4+sign_Imm<<2發現果然是Bit-extender錯選為0擴展了,而且記起來課下測beq竟然沒測過偏移負值!Bit-extender一定要選對,p0就因為同步復位extender選錯載過,建議對於這種細節謹慎查看。

  2. 思路回顧

    • bltzalr跳轉指令:判斷Rs寄存器內值小於零時,跳轉至branch類PC值,否則仍為PC+4;將PC+4存儲進Rt寄存器。

      • 實現:
      • 類似beq,實現也相近,在實現時可以沿用beq的方式給Controller增加一位來自ALU判斷Rs寄存器內值是否小於0的sml,其他不贅述。
    • movz指令:判斷Rt寄存器內存儲的值是否為零,若為零則將Rs寄存器內值存儲進Rd(?具體存進哪個我忘記了)

      • 實現:
      1. 首先分析數據通路。
      • 此指令需要判斷寄存器內值是否為零,且需要進行寄存器堆的存儲操作,思路上類似於beq指令:不同條件下執行操作不同。因此借鑒beq經驗,對數據通路進行修改:給ALU增加一位Equal輸出,給Controller增加一位Equal輸入。Equalr標識ALU_A-ALU_B是否等於ALU_A,即減法的結果是否等於被減數。
      1. 之后確定控制信號。
      • NPC為PC+4
      • A3選擇要求的寄存器(為對應RTL,建議在MUX建立時就選擇label命名為Rs,Rt,Rd,直觀效率高且出錯率低)
      • ALU選擇減法
      • RF_WD選擇ALU_Y(本題中符合寫入條件Rt_data == 0時,ALU_Y==Rs_data)= Rs-Rt == Rs
      • Equal && movz的結果連接到RF_Wr的或運算中。
      1. 在Debug模塊中檢查控制信號是否完全對應。注意給Controller添加了一個輸入信號后,Debug模塊需要同步修改。
    • lbi指令:讀出offset(base)地址內的8bits,並且insert進Rt寄存器。

      • 注意:該指令與lb指令的區別:lbi取出的8bits需插入在對應的位置上,其他位保持不變,而lb是進行符號擴展再放在最低位。

      • 實現:

      1. 首先分析數據通路。
      • 此指令需要將load的8bits插入Rt寄存器,再將數據寫入Rt寄存器。由於課下已經實現了lb指令,給DM增加了兩位DM_mode控制信號,並修改了DM讀入地址為[6:0]七位,因此只需要給DM增加Rt_data的輸入即可,即RD2輸入至DM。DM中實現方式:DM_mode為1時由Addr[1:0]作為選擇信號選擇Mem_RD插入的位數及對應於Rt的插入位置,由DM_mode為1選擇輸出為lbi_RD作為DM_RD。
      1. 之后確定控制信號。
      • NPC為PC+4
      • A3選擇Rt
      • DM_mode選擇1,對應8bits操作控制輸出。
      • RF_Wr為1,RF_WD為DM_RD
      1. 在Debug模塊中檢查控制信號是否完全對應。
  3. 模塊構建一定要遵循高內聚,低耦合

    內聚是指某個功能部件的內部功能的相關性,耦合是指功能部件間連接關系的強度。
    高內聚強調單一性,即功能部件或者功能單一,或者多個功能高度相似。
    低耦合強調功能部件的接口應該盡可能少。

  • 在課下實現時,我盡可能的將指令的控制置於Controller中,仿照beq指令添加一位Zero判斷相等的思路,課上實現時bltzalr, movz均於ALU內添加類似Zero的一位標識信號輸出至Controller,lbi添加一個Controller輸出的兩位DM_mode輸入控制其操作位數。(考慮到lw, lb, lh三類,設置為兩位應該更合適)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM