【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)
0 回顧
上一次實踐筆記(0)我們實現了一個最簡單的,能夠每個上升沿+4的PC。
我們最需要關注的就是器件功能的獨立性,避免內外功能混雜,同時一定要注意腦中有電路(RTL級描述的抽象電路而不是實際的門級電路,內個交給EDA工具就行)。
1 針對的指令
現在,我們分析一下R類指令,我們需要構建數據通路,而很多的R類指令是相似的,因此可以直接分析一類指令,就像所有指令都需要取指,我們就分析所有指令一樣。
那么,我們要分析哪一類指令?這取決于我們準備實現的指令有什么,我們先看看。
add addu sub subu and or xor nor slt sltu sll srl sra sllv srlv srav jr
哦是的,我們需要實現以上R類指令,那么我們來分分類吧:
我們需要注意的是,我們是按照指令格式的形式進行分類的,而不是功能,因為同樣指令格式的指令,(各階段的)執行過程是類似的,可以有類似的器件和信號。
下面,我們來分析一下第一類指令格式:
指令格式op rs rt rd 00000 func的分析如下:
2 功能分析
我們一直強調的是類似,而不是相同,因此我們先完成通用器件的分析,再針對個別特殊情況處理。
2.1 指令格式
| add | 000000 | rs | rt | rd | 00000 | 100000 | add $1,$2,$3 | $1=$2+S3 | (rd)←(rs)+(rt); rs=$2,rt=$3,rd=$1 |
我們就先看這一條add指令,它具備通用的特征,首先聲明,我們不實現add指令的異常處理機制。
我們依次分析一下各個字段。
2.2 指令識別
CPU設計最重要的點,就是需要識別出當前執行的指令,對于該格式來說,需要識別是編碼是 op 和 func。
2.3 指令操作
這一類指令,shamt = 00000都是一樣的,并且并不使用該字段,可以直接忽略。
而對于rs rt rd字段,這類指令都執行rd = rs 操作 rt。
我們使用一種通用的表述方式:op $reg1,$reg2,$reg3,那么對應的是
我們目前分析的這一類,都是這樣的!
它的完整功能(RTL)描述是:
3 需要的器件
之前我們知道了指令的識別與操作,現在,我們看看需要什么器件來完成操作。
首先,毫無疑問是從ROM中取指(IF階段),這一點,我們上一篇完成了PC,但是還沒有設計ROM,后面再說。
現在,假設我們取到了指令,接下來該如何處理呢?
3.1 ID(譯碼)階段
我們看看這個操作:R[rd] <- R[rs] op R[rd]
毫無疑問,我們需要寄存器,是的,就是MIPS的32個內部寄存器,然后我們需要控制器,因為寄存器需要控制的,至少寫入操作需要控制,不是任何時候每條指令都能夠寫入寄存器的。
現在,我們知道我們需要2個器件了
問題:為什么這兩個器件在譯碼階段?
3.1.1 寄存器堆(Register Files)的設計
我們看看這個寄存器堆的信號
圖中有一個錯誤:右邊輸出的下面的R[rd]應該是R[rt]
3.1.2 控制器的設計
我們的輸入信號是op和func字段,輸出是什么?是控制信號。需要什么控制信號?我們之后再說。
我們能夠得到輸入和輸出,一個純組合邏輯的電路不難設計,是的,控制器的硬件實現非常簡單,困難的是如何設計控制信號,我們后面一步步展開。
我們先建立一個空架子。
3.2 EX(執行)階段
再這個操作:R[rd] <- R[rs] op R[rd],我們需要執行操作是op,那么
我們依次解答一下。
首先,這個操作是什么,取決于op和func字段,我們需要使用控制器識別操作,并且輸出相應的控制信號。
給出了相應的控制信號,我們就知道要執行什么操作(加法,減法,還是乘法……),然后我們就需要ALU運算器完成運算。
因此,我們需要的新器件是ALU運算器。
這就是我們的ALU了
現在,我們的數據通路是這樣了,其中紅色字是指令的字段。
4 控制信號
4.1 控制器設計
- 輸入信號:op func
- 輸出信號:RegWrite ALUop
| add | 000000 | 100000 | 0000 | 1 |
| addu | 000000 | 100001 | 0001 | 1 |
| sub | 000000 | 100010 | 0010 | 1 |
| subu | 000000 | 100011 | 0011 | 1 |
| and | 000000 | 100100 | 0100 | 1 |
| or | 000000 | 100101 | 0101 | 1 |
| xor | 000000 | 100110 | 0110 | 1 |
| nor | 000000 | 100111 | 0111 | 1 |
| slt | 000000 | 101010 | 1000 | 1 |
| sltu | 000000 | 101011 | 1001 | 1 |
| sllv | 000000 | 101010 | 1010 | 1 |
| srlv | 000000 | 000110 | 1011 | 1 |
| srav | 000000 | 000111 | 1100 | 1 |
其中,RegWrite高電平有效,代表能夠寫入到寄存器,再配合時鐘觸發(暫定上升沿觸發)即可向寄存器堆寫入數據。
現在有13種操作,后面還有一些操作,因此暫時設置ALUop為4位信號(最多識別16種操作),后續如果需要再更改。
4.2 ALU設計
- 數據輸入:R[rs] R[rd]
- 控制輸入:ALUop
- 數據輸出:R[rd]
- 操作:對應4.1中的instruction
- ALUop:對應4.1中的ALUop
這里就不寫了。
5 數據線
輸入的指令就是最重要的數據。
6 地址線
無
7 控制線
clk時鐘信號和rst復位信號。
8 實現
8.1 控制器
control_1.v
`timescale 1ns / 1psmodule control_1(input [5:0] op,input [5:0] func,output reg RegWrite,output reg [3:0] ALUop);always @(*) beginif(op == 0)begincase (func)6'b100000: // addbeginRegWrite <= 1;ALUop <= 4'b0000;end6'b100001: // addubeginRegWrite <= 1;ALUop <= 4'b0001;end6'b100010: // subbeginRegWrite <= 1;ALUop <= 4'b0010;end6'b100011: // sububeginRegWrite <= 1;ALUop <= 4'b0011;end6'b100100: // andbeginRegWrite <= 1;ALUop <= 4'b0100;end6'b100101: // orbeginRegWrite <= 1;ALUop <= 4'b0101;end6'b100110: // xorbeginRegWrite <= 1;ALUop <= 4'b0110;end6'b100111: // norbeginRegWrite <= 1;ALUop <= 4'b0111;end6'b101010: // sltbeginRegWrite <= 1;ALUop <= 4'b1000;end6'b101011: // sltubeginRegWrite <= 1;ALUop <= 4'b1001;end6'b000100: // sllvbeginRegWrite <= 1;ALUop <= 4'b1010;end6'b000110: // srlvbeginRegWrite <= 1;ALUop <= 4'b1011;end6'b000111: // sravbeginRegWrite <= 1;ALUop <= 4'b1100;enddefault:beginRegWrite <= 0;ALUop <= 4'b1111;endendcaseendelsebeginRegWrite <= 0;ALUop <= 4'b1111;end endendmodule注意默認情況下的值。
RTL優化
功能仿真測試
tb_control_1.v
`timescale 1ns / 1psmodule tb_control_1(); // control_1 Parameters parameter PERIOD = 10;// control_1 Inputs reg [5:0] op = 0 ; reg [5:0] func = 0 ;// control_1 Outputs wire RegWrite ; wire [3:0] ALUop ;initial beginop = 1 ;func = 0 ;#10op = 0 ;func = 6'b100000;#10op = 0 ;func = 6'b100001;#10op = 0 ;func = 6'b100010;#10op = 0 ;func = 6'b000111;#10op = 0 ;func = 6'b111111; endcontrol_1 u_control_1 (.op ( op [5:0] ),.func ( func [5:0] ),.RegWrite ( RegWrite ),.ALUop ( ALUop [3:0] ));endmodule是的,控制器非常簡單,2個輸入,2個輸出,真值表都有了,非常容易不是嗎?
8.2以及之后的內容,在下一篇文章。
【計算機系統設計】實踐筆記(2)數據通路構建:第一類R型指令分析(2)
總結
以上是生活随笔為你收集整理的【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 追着幸福跑剧情介绍
- 下一篇: 接口的抽象与实现(概述)