【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)
0 回顧
上一次實(shí)踐筆記(0)我們實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的,能夠每個(gè)上升沿+4的PC。
我們最需要關(guān)注的就是器件功能的獨(dú)立性,避免內(nèi)外功能混雜,同時(shí)一定要注意腦中有電路(RTL級(jí)描述的抽象電路而不是實(shí)際的門級(jí)電路,內(nèi)個(gè)交給EDA工具就行)。
1 針對(duì)的指令
現(xiàn)在,我們分析一下R類指令,我們需要構(gòu)建數(shù)據(jù)通路,而很多的R類指令是相似的,因此可以直接分析一類指令,就像所有指令都需要取指,我們就分析所有指令一樣。
那么,我們要分析哪一類指令?這取決于我們準(zhǔn)備實(shí)現(xiàn)的指令有什么,我們先看看。
add addu sub subu and or xor nor slt sltu sll srl sra sllv srlv srav jr
哦是的,我們需要實(shí)現(xiàn)以上R類指令,那么我們來分分類吧:
我們需要注意的是,我們是按照指令格式的形式進(jìn)行分類的,而不是功能,因?yàn)橥瑯又噶罡袷降闹噶?#xff0c;(各階段的)執(zhí)行過程是類似的,可以有類似的器件和信號(hào)。
下面,我們來分析一下第一類指令格式:
指令格式op rs rt rd 00000 func的分析如下:
2 功能分析
我們一直強(qiáng)調(diào)的是類似,而不是相同,因此我們先完成通用器件的分析,再針對(duì)個(gè)別特殊情況處理。
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指令,它具備通用的特征,首先聲明,我們不實(shí)現(xiàn)add指令的異常處理機(jī)制。
我們依次分析一下各個(gè)字段。
2.2 指令識(shí)別
CPU設(shè)計(jì)最重要的點(diǎn),就是需要識(shí)別出當(dāng)前執(zhí)行的指令,對(duì)于該格式來說,需要識(shí)別是編碼是 op 和 func。
2.3 指令操作
這一類指令,shamt = 00000都是一樣的,并且并不使用該字段,可以直接忽略。
而對(duì)于rs rt rd字段,這類指令都執(zhí)行rd = rs 操作 rt。
我們使用一種通用的表述方式:op $reg1,$reg2,$reg3,那么對(duì)應(yīng)的是
我們目前分析的這一類,都是這樣的!
它的完整功能(RTL)描述是:
3 需要的器件
之前我們知道了指令的識(shí)別與操作,現(xiàn)在,我們看看需要什么器件來完成操作。
首先,毫無疑問是從ROM中取指(IF階段),這一點(diǎn),我們上一篇完成了PC,但是還沒有設(shè)計(jì)ROM,后面再說。
現(xiàn)在,假設(shè)我們?nèi)〉搅酥噶?/strong>,接下來該如何處理呢?
3.1 ID(譯碼)階段
我們看看這個(gè)操作:R[rd] <- R[rs] op R[rd]
毫無疑問,我們需要寄存器,是的,就是MIPS的32個(gè)內(nèi)部寄存器,然后我們需要控制器,因?yàn)榧拇嫫餍枰刂频?#xff0c;至少寫入操作需要控制,不是任何時(shí)候每條指令都能夠?qū)懭爰拇嫫鞯摹?/p>
現(xiàn)在,我們知道我們需要2個(gè)器件了
問題:為什么這兩個(gè)器件在譯碼階段?
3.1.1 寄存器堆(Register Files)的設(shè)計(jì)
我們看看這個(gè)寄存器堆的信號(hào)
圖中有一個(gè)錯(cuò)誤:右邊輸出的下面的R[rd]應(yīng)該是R[rt]
3.1.2 控制器的設(shè)計(jì)
我們的輸入信號(hào)是op和func字段,輸出是什么?是控制信號(hào)。需要什么控制信號(hào)?我們之后再說。
我們能夠得到輸入和輸出,一個(gè)純組合邏輯的電路不難設(shè)計(jì),是的,控制器的硬件實(shí)現(xiàn)非常簡(jiǎn)單,困難的是如何設(shè)計(jì)控制信號(hào),我們后面一步步展開。
我們先建立一個(gè)空架子。
3.2 EX(執(zhí)行)階段
再這個(gè)操作:R[rd] <- R[rs] op R[rd],我們需要執(zhí)行操作是op,那么
我們依次解答一下。
首先,這個(gè)操作是什么,取決于op和func字段,我們需要使用控制器識(shí)別操作,并且輸出相應(yīng)的控制信號(hào)。
給出了相應(yīng)的控制信號(hào),我們就知道要執(zhí)行什么操作(加法,減法,還是乘法……),然后我們就需要ALU運(yùn)算器完成運(yùn)算。
因此,我們需要的新器件是ALU運(yùn)算器。
這就是我們的ALU了
現(xiàn)在,我們的數(shù)據(jù)通路是這樣了,其中紅色字是指令的字段。
4 控制信號(hào)
4.1 控制器設(shè)計(jì)
- 輸入信號(hào):op func
- 輸出信號(hào):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高電平有效,代表能夠?qū)懭氲郊拇嫫?#xff0c;再配合時(shí)鐘觸發(fā)(暫定上升沿觸發(fā))即可向寄存器堆寫入數(shù)據(jù)。
現(xiàn)在有13種操作,后面還有一些操作,因此暫時(shí)設(shè)置ALUop為4位信號(hào)(最多識(shí)別16種操作),后續(xù)如果需要再更改。
4.2 ALU設(shè)計(jì)
- 數(shù)據(jù)輸入:R[rs] R[rd]
- 控制輸入:ALUop
- 數(shù)據(jù)輸出:R[rd]
- 操作:對(duì)應(yīng)4.1中的instruction
- ALUop:對(duì)應(yīng)4.1中的ALUop
這里就不寫了。
5 數(shù)據(jù)線
輸入的指令就是最重要的數(shù)據(jù)。
6 地址線
無
7 控制線
clk時(shí)鐘信號(hào)和rst復(fù)位信號(hào)。
8 實(shí)現(xiàn)
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注意默認(rèn)情況下的值。
RTL優(yōu)化
功能仿真測(cè)試
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是的,控制器非常簡(jiǎn)單,2個(gè)輸入,2個(gè)輸出,真值表都有了,非常容易不是嗎?
8.2以及之后的內(nèi)容,在下一篇文章。
【計(jì)算機(jī)系統(tǒng)設(shè)計(jì)】實(shí)踐筆記(2)數(shù)據(jù)通路構(gòu)建:第一類R型指令分析(2)
總結(jié)
以上是生活随笔為你收集整理的【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 追着幸福跑剧情介绍
- 下一篇: 接口的抽象与实现(概述)