(Verilog+Quartus Ⅱ+Cyclone版) 计算机系统综合课程设计 基于MIPS32的SOC设计实践(上) (Verilog+Quartus Ⅱ+Cyclone版) 主讲 杨全胜 东南大学计算机科学与工程学院 2018/11/9 P.1
主要内容 MiniSys 指令系统介绍 MiniSys CPU的设计 2018/11/9 P.2
第1章 MiniSys指令系统介绍 MiniSys寄存器组 Minisys指令的寻址方式 MiniSys指令目录 MiniSys指令格式 2018/11/9 P.3
MiniSys指令系统简介 MiniSys采用32位MIPS指令中最常用的31条指令,其寄存器组织,指令格式等均采用MIPS指令系统相同的格式。 共有32个32位寄存器 32位定长格式指令 4种寻址方式 2018/11/9 P.4
MiniSys寄存器组 寄存器名 寄存器号 约定用途 $zero 常数0,该寄存器永远只返回0。 $at 1 用做汇编器的暂时变量。 常数0,该寄存器永远只返回0。 $at 1 用做汇编器的暂时变量。 $v0~$v1 2~3 用来存放一个子程序(函数)的非浮点运算的结果或返回值。 $a0~$a3 4~7 存放子程序(函数)调用时的非浮点参数。 $t0~$t7 8~15 暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用后它们的值会被破坏。 $s0~$s7 16~23 8个子程序用寄存器。子程序(函数)必须在返回之前恢复这些寄存器的值以保证其没有变化。 2018/11/9 P.5
MiniSys寄存器组 寄存器名 寄存器号 约定用途 $t8~$t9 24~25 暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用后它们的值会被破坏。 $i0~$i1 26~27 分别保存两个中断到来时程序的返回地址。(该两寄存器定义和MIPS中的有所不同) $s9 28 第10个子程序用寄存器。(该定义和MIPS中的不同) $sp 29 堆栈指针,对它的调整必须显式的通过指令来实现,硬件不支持堆栈指针的调整。 $s8 30 第9个子程序用寄存器。(该定义和MIPS中的不同) $ra 31 存放调用子程序(函数)时的返回地址。 2018/11/9 P.6
Minisys指令的寻址方式 立即数寻址 相对寻址 寄存器寻址 寄存器相对寻址 指令中第3操作数可使用16位二进制立即数 操作数是下一条指令的PC值(PC+4)加上一个32位偏移量 寄存器寻址 操作数存放在寄存器中,指令里放的是寄存器号 寄存器相对寻址 操作数存放在数据存储器中,其有效地址由两部分组成,基地址放在一个寄存器中,偏移部分为一个16位的立即数 2018/11/9 P.7
MiniSys指令目录 算术指令-add, addu, addi, addiu, sub, subu 逻辑指令-and, andi, or, ori, xor, xori, nor, sll, srl, sra, sllv, srlv, srav 数据传送指令-lw, sw, lui 比较、条件转移指令-beq, bne, slt, slti, sltu, sltiu 无条件转移指令-j, jr, jal mfhi $1 $1=Hi nflo $1 $1=Lo lh 取半双字(一个字16位) 2018/11/9 P.8
MiniSys指令格式 (1)R-format add $1, $2, $3 # $1=$2+$3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 2 3 1 32 000000 00010 00011 00001 00000 100000 2018/11/9 P.9
MiniSys指令格式 (2)I-format lw $1, 10($2) # $1=Memory[$2 +10] 6-bit 5-bit 5-bit 16-bit op rs rt Address/Immediate 35 2 1 10 100011 00010 00011 0000 0000 0000 1010 2018/11/9 P.10
MiniSys指令格式 (3)J-format j 10000 # go to 10000 6-bit 26-bit op Target/ Address 2 2500 000010 00000 00000 0000 1001 1100 0100 2018/11/9 P.11
部分MiniSys指令详解 这里只介绍几个典型的指令格式,比较完整的指令格式请参看教材。 2018/11/9 P.12
部分MiniSys指令详解 加法指令( R-format) add $s1, $s2, $s3 # $s1=$s2+$s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 19 17 32 000000 10010 10011 10001 00000 100000 2018/11/9 P.13
部分MiniSys指令详解 减法指令(R-format) sub $s1, $s2, $s3 # $s1=$s2-$s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 19 17 34 000000 10010 10011 10001 00000 100010 2018/11/9 P.14
部分MiniSys指令详解 逻辑与指令(R-format) and $s1, $s2, $s3 # $s1=$s2 & $s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 19 17 36 000000 10010 10011 10001 00000 100100 2018/11/9 P.15
部分MiniSys指令详解 逻辑或操作(R-format) or $s1, $s2, $s3 # $s1=$s2 | $s3 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 19 17 37 000000 10010 10011 10001 00000 100101 2018/11/9 P.16
部分MiniSys指令详解 有符号立即数加(I-format) addi $s1, $s2, 100 # $s1=$s2 + 100 6-bit 5-bit 5-bit 16-bit op rs rt Immediate 8 18 17 100 001000 10010 10001 0000 0000 0110 0100 立即数做符号扩展 2018/11/9 P.17
部分MiniSys指令详解 立即数逻辑与指令(I-format) andi $s1, $s2, 100 # $s1=$s2 & 100 6-bit 5-bit 5-bit 16-bit op rs rt Immediate 12 18 17 100 001100 10010 10001 0000 0000 0110 0100 立即数做0扩展 2018/11/9 P.18
部分MiniSys指令详解 立即数逻辑或指令(I-format) ori $s1, $s2, 100 # $s1=$s2 | 100 6-bit 5-bit 5-bit 16-bit op rs rt Immediate 13 18 17 100 001101 10010 10001 0000 0000 0110 0100 立即数做0扩展 2018/11/9 P.19
部分MiniSys指令详解 逻辑左移指令(R-format) sll $s1, $s2, 10 # $s1= shift($s2)left logic 10 bits 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 17 10 000000 00000 10010 10001 01010 000000 2018/11/9 P.20
部分MiniSys指令详解 逻辑右移指令(R-format) srl $s1, $s2, 10 # $s1= shift($s2)right logic 10 bits 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 17 10 2 000000 00000 10010 10001 01010 000010 2018/11/9 P.21
部分MiniSys指令详解 算术右移指令(R-format) sra $s1, $s2, 10 # $s1= shift($s2)right arithmatic 10 bits 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 17 10 3 000000 00000 10010 10001 01010 000011 2018/11/9 P.22
部分MiniSys指令详解 存储器读(I-format) lw $s1, 100($s2) # $s1=Memory[$s2 +100] 6-bit 5-bit 5-bit 16-bit op rs rt Offset 35 18 17 100 100011 10010 10001 0000 0000 0110 0100 立即数做符号扩展 2018/11/9 P.23
部分MiniSys指令详解 存储器写(I-format) sw $s1, 100($s2) # Memory[$s2 +100] = $s1 6-bit 5-bit 5-bit 16-bit op rs rt Offset 43 18 17 100 101011 10010 10001 0000 0000 0110 0100 立即数做符号扩展 2018/11/9 P.24
部分MiniSys指令详解 相等则转移指令(I-format) beq $s1, $s2,100 # if $s1=$s2, goto PC+4+100 6-bit 5-bit 5-bit 16-bit op rs rt Offset= immediate/4 4 17 18 25 000100 10001 10010 0000 0000 0001 1001 立即数做符号扩展 2018/11/9 P.25
部分MiniSys指令详解 不相等则转移转移指令(I-format) bne $s1, $s2,100 # if $s1 ≠ $s2, goto PC+4+100 6-bit 5-bit 5-bit 16-bit op rs rt Offset = immediate/4 5 17 18 25 000101 10001 10010 0000 0000 0001 1001 立即数做符号扩展 2018/11/9 P.26
部分MiniSys指令详解 小于则设置指令(R-format) slt $s1, $s2, $s3 # if $s2<$s3, $s1=1; else $s1=0 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 18 19 17 42 000000 10010 10011 10001 00000 101010 2018/11/9 P.27
部分MiniSys指令详解 无条件转移指令(J-format) j 10000 # go to 10000 6-bit 26-bit op Target = Address/4 2 2500 000010 00000 00000 0000 1001 1100 0100 2018/11/9 P.28
部分MiniSys指令详解 过程调用指令(J-format) jal 10000 # $31=PC+4; go to 10000 6-bit 26-bit op Target = Address/4 3 2500 这里补充讲解一下,address、offset何时要除以4,什么时候不除,规律是访问代码的地址都要除以4(定长32位指令) 而访问RAM的变量时不要除,因为从可扩展角度,对变量的访问可以是字节型、半字型和字型等 000011 00000 00000 0000 1001 1100 0100 2018/11/9 P.29
部分MiniSys指令详解 按寄存器内容转移指令(R-format) jr $ra # jump register $ra 6-bit 5-bit 5-bit 5-bit 5-bit 6-bit op rs rt rd shamt funct 31 8 000000 11111 00000 00000 00000 001000 2018/11/9 P.30
部分MiniSys指令详解 立即数赋值指令(I-format) lui $s1,100 # $s1 = 100 << 16 6-bit 5-bit 5-bit 16-bit op rs rt immediate 15 17 100 001111 00000 10001 0000 0000 0110 0100 2018/11/9 P.31
第2章 MiniSys的设计 MiniSys CPU设计架构 MiniSys CPU中各个单元 指令执行的分析 设计流水线处理器的考虑 设计多核处理器的考虑 2018/11/9 P.32
MiniSys CPU设计架构(1) 指令执行的步骤 idecode Control ifetch Execute Write Dmemory 2018/11/9 P.33
MemtoReg MemWrite op Sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal MIPS instruction format R-format MemWrite op rs rt rd func op Sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal Branch 1 + Regdst 4 Regwrite PC+4 address + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 读地址 rt Zero readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 writeD ALU 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(1) Fetch(取指单元) 定义指令ROM存储器 到程序ROM中取指令 对PC值进行+4处理
取指单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A readD1 PC rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 writeD ALU 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
指令ROM的例化 lpm_rom prgrom(.address(PC[11:2]),.inclock(clock),.q(Jpadr)); // 实际上给出的地址是PC除4的结果,因为MIF文件按0、1、2、 // 3排列的 defparam prgrom.lpm_width = 32; //数据(指令)宽度32位 defparam prgrom.lpm_widthad = 10; //地址线宽度10位 defparam prgrom.lpm_file = "prgmip32.mif"; defparam prgrom.lpm_outdata = "UNREGISTERED"; defparam prgrom.lpm_address_control = "REGISTERED"; 2018/11/9 P.37
指令ROM的初始化文件 prgmip32.mif文件(自行创建) DEPTH = 1024; -- 10位地址线 210=1024 WIDTH = 32; -- 数据宽度32位 ADDRESS_RADIX = HEX; --地址采用16进制描述 DATA_RADIX = HEX; -- 数据采用16进制描述 CONTENT BEGIN 0 : 8c020000; --lw $2 0($0) 1 : 8c030002; --lw $3 2($0) [19..3FD] : 00000000; 3FE: 03400008; -- jr $1A 中断0返回 3FF: 03600008; -- jr $1B 中断1返回 END; 2018/11/9 P.38
MiniSys CPU中各单元(2) Decode(译码单元) 定义寄存器组 对寄存器组进行读写操作 根据指令译码结果,决定向其他部件(如运算器)送1路或两路数据 2018/11/9 P.39
译码单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A readD1 PC rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 writeD ALU 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(3) Control(控制单元) 根据指令中的指令码(op)和功能码(funct)的不同组合输出相应的控制信号。 2018/11/9 P.41
控制单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc func jmp | jal jrn nBranch jal Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A readD1 PC rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 writeD ALU 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(4) Exe(执行单元) 完成逻辑运算 完成算术运算 完成移位运算 完成比较转移的PC值计算 完成比较后赋值
执行单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A readD1 PC rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 writeD ALU 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
MiniSys CPU中各单元(5) Dmemory(存储单元) 定义数据存储单元RAM 实际完成对数据存储器的读写操作
存储单元的设计 Memtoreg Memwrite op Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch jal Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A readD1 PC rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 writeD ALU 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
时序关系 器件固有延迟维持的流水 2018/11/9 P.47
数据RAM的例化 数据存储器的实现 lpm_ram_dq ram(.data(write_data) , .address(address[11:2]), .we(Memwrite ), .inclock(clk),.q(read_data)); //在 // Verilog中使用Altera的RAM单元, 注意地址要除2 defparam ram.lpm_width =32; //数据宽32位 defparam ram.lpm_widthad = 10; //地址线宽10位 defparam ram.lpm_outdata = "UNREGISTERED"; defparam ram.lpm_indata = "REGISTERED"; defparam ram.lpm_address_control = "REGISTERED"; defparam ram.lpm_file = “dmem32.mif”; //存储体初始化文件 // 以双字为单位,所以地址都是4的倍数 教材中,P56页程序的12行 assign lpw_write(Memwrite && clk 删除 13行中的lpm_write 改成 Memwrite 2018/11/9 P.48
数据RAM初始化文件 dmem32.mif文件(自行创建) DEPTH = 1024; --10 位地址线 WIDTH = 32; -- 数据宽度32位 ADDRESS_RADIX = HEX; --地址采用16进制描述 DATA_RADIX = HEX; -- 数据采用16进制描述 CONTENT BEGIN 0 : 00000055; -- 行号是地址除以4的结果 1 : 000000AA; [2..3FF] : 00000000; END; 2018/11/9 P.49
MiniSys CPU中各单元(6) MiniSys (顶层设计) 顶层整合模块 前面已经给出了MiniSys cpu 的5大部件的设计,最后需要将这5大部件组合成一个完整的CPU,可以用GDT图,也可以用Verilog的元件例化的方法来完成。 在元件例化的时候特别注意字母大小写一定要一致。 2018/11/9 P.50
顶层的设计(2) 模块的定义 module minisys(reset, clock, pc, alu_result_out, read_data_1_out, read_data_2_out, write_data_out, instruction_out, branch_out, zero_out, memwrite_out, regwrite_out, i_format_out); input reset,clock; output[15:0] pc, alu_result_out, read_data_1_out; output[15:0] read_data_2_out, write_data_out; output[31:0] instruction_out; output branch_out, zero_out, memwrite_out, regwrite_out; output i_format_out; 2018/11/9 P.51
顶层的设计(3) 内部信号定义 wire[15:0] pc_plus_4; wire[15:0] read_data_1; wire[15:0] sign_extend; wire[15:0] add_result; wire[15:0] alu_result; wire[15:0] read_data; wire[15:0] pc_next,opcplus4; wire alusrc ,jrn,i_format,regwrite, zero, memwrite; wire branch, memtoreg, memread, memreg; wire nbranch,jmp,jal,regdst; wire[1:0] aluop; wire[31:0] instruction; 2018/11/9 P.52
顶层的设计(4) 内部信号赋值 assign instruction_out = instruction ; assign alu_result_out = alu_result ; assign read_data_1_out = read_data_1 ; assign read_data_2_out = read_data_2 ; assign write_data_out = (memtoreg == 1) ? read_data : alu_result ; assign branch_out = branch ; assign zero_out = zero ; assign regwrite_out = regwrite ; assign memwrite_out = memwrite ; assign i_format_out = i_format ; 2018/11/9 P.53
顶层的设计(5) 元件例化 其他元件例化大家参看教材。 Ifetc32 ifetch(.Instruction(instruction), .PC_plus_4_out(pc_plus_4) , .Add_result(add_result), .Branch(branch), .nBranch(nbranch), .Jmp(jmp), .Jal(jal), .Jrn(jrn), .Read_data_1(read_data_1), .PC_next(pc_next), .Zero(zero), .PC_out(pc), .clock(clock), .reset(reset) .opcplus4(opcplus4)); 其他元件例化大家参看教材。 2018/11/9 P.54
指令执行的分析 各类指令执行的分析 2018/11/9 P.55
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal 除jr指令之外的其他16条R-format指令 Branch 1 + Regdst 4 Regwrite PC+4 addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal jr Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 读地址 rt Zero readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal addi, addiu,andi, ori, xori,lui,slti,sltiu Branch 1 + Regdst 4 Regwrite PC+4 addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal lw Branch 1 + Regdst 4 Regwrite PC+4 addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal sw Branch 1 + Regdst 4 Regwrite PC+4 addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal beq, bne Branch 1 + Regdst 4 Regwrite PC+4 addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal j Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 1 0 符号扩展
Aluctl/slt/sftmd/sftm/I_format Alusrc 控制单元 func jmp | jal jrn nBranch Memtoreg MIPS instruction format R-format Memwrite op rs rt rd func op Aluctl/slt/sftmd/sftm/I_format I-format Alusrc 控制单元 op rs rt immediate func jmp | jal J-format jrn op address nBranch jal jal Branch 1 Regdst 4 Regwrite PC+4 + addresst + 1 左移2位 左移2位 WE rs 1 readR1 程序ROM A PC readD1 rt Zero 读地址 readR2 WE Alu result readD2 Address 指令 [31-0] B writeR Mem data rd 寄存器 1 1 1 ALU writeD 数据RAM Clock Write Data Clock immediate 31 1 0 符号扩展
设计流水线处理器的考虑 选择合适的流水级数 尽量保持流水线各级延迟相等 流水线中的相关性 2018/11/9 P.64
设计流水线处理器的考虑 结构相关 ? 所谓结构相关是指指令在重叠执行的时候由于硬件资源不能满足重叠执行的要求,而产生的一种结构上的相关 MiniSys系统采用指令ROM和数据RAM分开的设计,取指和数据读写分别在两个存储体内进行,因此不会产生取指和数据访问的冲突。另外,由于MiniSys系统采用的是Load/Store型指令结构,除了LW和SW两条指令外,其他指令都不会操作数据RAM。LW与SW指令也仅仅在存储阶段才访问数据存储器,因此不可能出现两条指令同时读写数据RAM的情况。 另外,关于寄存器堆的读写问题,可以采用时钟上升沿读,下降沿写的方法避免读写冲突。 因此MiniSys CPU的设计中避免了结构相关问题。 2018/11/9 P.65
设计流水线处理器的考虑 数据相关 写后读相关(RAW) 阻塞 乱序 定向转发法 2018/11/9 P.66
设计流水线处理器的考虑 数据相关 读后写相关(WAR) ? 2018/11/9 P.67 从我们设计的流水来看,读寄存器是在译码阶段,而写寄存器要等到回写阶段,因此,处于后面的程序不可能在前面程序读寄存器前写相同的寄存器。 考察存储器的读写,因为都只能在存储阶段进行读或写,所以不会出现后续指令比前面指令先操作存储器的情况。 因此,MiniSys CPU不存在WAR相关。 2018/11/9 P.67
设计流水线处理器的考虑 数据相关 写后写相关(WAW) ? 2018/11/9 P.68 在MiniSys系统中,无论是对寄存器写还是对存储器写,都是在唯一的阶段内操作的,比如写存储器是在存储阶段,而写寄存器在回写阶段。因此,不可能出现后续指令先与前面的指令写数据的情况,因此MiniSys中也不存在WAW相关。 2018/11/9 P.68
设计流水线处理器的考虑 控制相关 阻塞 分支预测 分支地址计算尽量前移 延迟槽法 静态预测 动态预测 其他指令Ia~Im 转移指令In 所谓控制相关是当程序执行到条件分支指令的时候,会出现与控制相关的问题。控制相关可以看作是对指令指针寄存器PC的RAW相关问题。 延迟槽法:编译程序编译时,将转移指令前与转移指令无关的n条指令或空指令放入延迟槽;,延迟槽在紧跟在转移指令后 静态预测根据指令的情况,通常转移地址小于当前指令地址,预测为转移命中,如果转移地址比当前指令地址大,则预测转移不被命中 动态预测根据程序历史行为和分支历史行为来协助判断分支是否命中,这是在运行时的判断。 其他指令Ia~Im 转移指令In 延迟槽中指令(空指令) 其他指令Io~Iz 延迟转移法的目标代码 其他指令Ia~If、Ig~Im中与In有关的指令 延迟槽中指令(Ig~Im中与In无关的指令或空指令) 优化延迟转移法的目标代码 2018/11/9 P.69
设计多核处理器的考虑 简单核还是复杂核? 同构核还是异构核? 几个核之间怎么配合?中断怎么处理? 数据一致性上的问题 软件上的同步与互斥 核间互联问题 2018/11/9 P.70
几个多核的例子 INTEL CORE DUO Each with its own execution resources Each with its own L1 cache 32K instruction and 32K data Both cores share the L2 cache 2MB 8-way set associative; 64-byte line size 10 clock cycles latency; Write Back update policy 2018/11/9 P.71
几个多核的例子 AMD Opteron Separate 1Mbyte L2 caches CPU0 and CPU1 communicate through the SRQ and Crossbar 2018/11/9 P.72
几个多核的例子 2018/11/9 P.73
几个多核的例子 UltraSPARC T1 from SUN 8 CPU core Each core can run 4 thread simultaneity All cores connected through high bandwidth (134.4GB/s) crossbar switch 2018/11/9 P.74
几个多核的例子 Cell from IBM, Toshiba and Sony 1 PPE (Power Processor Element) 8 SPE (Synergistic Processor Element) All cores connected through EIB 我们可以看到Cell内部有一条 768bit位宽的“EIB单元互联总线环(Element Interconnect BUS Ring,EIB Ring)”, 2018/11/9 P.75
几个多核的例子 Tile64 from Tilera Co. 64 Cores RISC 19.2W All cores connected through MESH 500Gb/s for one core, 32Tb/s for all. Every core can run OS 2018/11/9 P.76
几个多核的例子 Larrabee from Intel Multiple in-order x86 CPU cores that are augmented by a wide vector processor unit A coherent on-die 2nd level cache All cores connected through Interprocessor Ring Network 2018/11/9 P.77
Sandy Bridge 2018/11/9 P.78