




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 概述1.1 CPU基本结构五级流水线,专用通路结构数据通路;硬连线控制器;哈佛体系结构,具有独立的指令内存和数据内存。1.2 CPU基本功能Z0指令集中的全部功能,包括全部数据处理指令及带立即数的数据处理指令、比较操作指令、数据传送指令以及控制流指令;通过前传和插泡解决了数据相关和控制相关。1.3 其他用C语言编写了汇编器,可以根据汇编指令直接生成内存初始化文件(.mif)。2 设计说明2.1 指令集及汇编器设计2.1.1 指令集设计指令集设计如下表,可见实现了Z0指令集的全部指令外加CMP指令。操作类型助记符指令编码功能说明ALUOP算数运算ADD000100加法0000SUB000101减法0001逻辑运算AND001000与1000OR001001或1001XOR001010异或1010NOT001011非1011移位运算SHL001100逻辑左移1100SHR001101逻辑右移1101ASR001110算数右移1110ROR001111循环右移1111带立即数算术运算ADDI010000立即数加法0000SUBI010001立即数减法0001带立即数逻辑运算ANDI011000立即数与1000ORI011001立即数或1001XORI011010立即数异或1010NOTI011011立即数求非1011带立即数移位运算SHLI011100立即数逻辑左移1100SHRI011101立即数逻辑右移1101ASRI011110立即数算术右移1110RORI011111立即数循环右移1111数据传输指令LDR110000存储器读出0000STR110001存储器存储0000LDH110010高位立即数存储0000LDL110011低位立即数存储0000ISTR110100立即数存储0000控制流JMP1000000000JEQ100001等于0跳转0000JNE100010不等于0跳转0000JAE100011无符号大于转移0000JB100100无符号小于转移0000JGE100101有符号大于转移0000JL100110有符号小于转移0000CALL101000子过程调用0000INT101001INT中断0000RET101010返回0000比较操作CMP101011比较0001空操作NOP000000空操作0000表 21 指令集设计2.1.2 汇编器设计我们都知道,要对所设计的CPU进行较为完整的测试至少需要几十条不同类型的指令,而手工写机器指令即复杂又极容易出错。而且,对于一个实用的CPU,如果要让使用者每次都用机器码输入指令的话,其实用性也会大打折扣。因此,我们在所设计的指令集的基础上,用VS2008编写了一个汇编器assembler.exe,可以将文本格式的汇编指令自动翻译成相应的二进制机器指令,并且可以支持对指令行加注释、自动检测有无语法错误,并提示在哪一行有语法错误等功能,和实际的汇编器的效果非常接近,感觉还是蛮有成就感的,呵呵。汇编器编写思路如下: 读取输入的包含汇编指令的文本文件名,打开相应的文本文件,并生成一个同名的mif文件; 读取一行汇编指令,检测该行有无注释,如果有的话,将注释内容包括“;”去掉; 读取该行的指令类型助记符,确定是何种指令,并将其转换成相应的二进制指令操作码(6位),并左移26位,写进该行对应的二进制机器指令中; 读取该行的操作数,并区分是寄存器操作数还是立即数。如果是寄存器操作数,获取其编号,并左移相应位数,与该行对应的二进制机器指令做或运算。如果是立即数,则直接与该行对应的二进制机器指令做或运算。 将得到的二进制机器指令写进mif文件中; 判断储存汇编指令的文本文件是否结束。若结束,则给出汇编结束提示;若未结束,则回到继续执行。程序验证如下,存储汇编指令的文本文件code.txt内容为:SUB R1,R3,R9;减法ADD R1,R2,R4;加法AND R1,R2,R3;与OR R1,R5,R7;或NOT R1,R2;非XOR R1,R2,R3;异或SHL R1,R2,R3;逻辑左移SHR R1,R2,R3;逻辑右移ASR R1,R2,R3;算术右移ROR R1,R2,R3;循环右移表 22 汇编指令文本文件code.txt程序运行如下:图 21程序运行结果生成的mif文件用记事本打开内容如下:WIDTH=32;DEPTH=256;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENT BEGIN0:337856512;1:270671872;2:539105280;3:606418944;4:740425728;5:673323008;6:807540736;7:874649600;8:941758464;9:1008867328;10.256:0;END;表 23 生成的.mif文件内容生成的mif文件用QuartusII打开,内容如下:图 22 用Quartus打开.mif文件可见,汇编器正确地实现了将汇编指令翻译成二进制机器指令的功能。2.2 ALU设计ALU是CPU进行数据的处理和加工的重要的运算单元,因此,ALU的设计对于整个CPU的性能有重要的影响。根据CPU的功能要求,我们设计的ALU具有对输入的数据进行算术运算(加和减)、逻辑运算(与、或、异或、非)以及移位运算(逻辑左移、逻辑右移、算术右移、循环右移)等功能。因此,我们在设计ALU时,也将其功能划分为三大模块来实现:Arithmetic用于实现算术运算、Logic用于实现逻辑运算、Shifter用于实现移位运算。在设计指令集时,我们就充分考虑到了将同一性质的操作指令(如寄存器操作数与寄存器操作数运算和寄存器操作数与立即数运算)赋予相同的ALU操作控制码,因此ALU 具体执行何种操作仅受四位ALU操作码控制(即6位操作码的后4位)。具体的ALU整体框图如下:图 23 ALU整体框图由上图可见,op的低两位用来控制在每个模块中具体执行哪种操作(比如对于逻辑运算,可以决定是“与”还是“或“),而op的高两位则用来控制多路选择器的输出(即决定输出的是算术运算、逻辑运算还是移位运算的结果)。ALU的输出结果并不仅仅是相应的运算结果,而且为了便于各种指令功能的实现,还输出四个标志位,分别为:溢出标志OV,进位标志CY,零标志ZR,负数标志NG。其意义分别如下:当运算结果发生溢出时,OV=1; 当运算结果出现进位时,CY=1;当运算结果全零时,ZR=1;当运算结果为负数时,NG=1。下面,分模块介绍ALU的各个部件的设计原理和功能。2.2.1 算数运算(1) 加法器综合考虑CPU对于速度的需求以及芯片器件数量的约束,我们的加法器采用4个四位超前进位加法器组间并联构成十六位超前进位加法器,再将两个十六位超前进位加法器串联可以得到所需的32位加法器。示意图如下:图 24 32位组内并行、组间并行进位加法器示意图(2) 加减法器因为A-B=A+(B)+1,所以在已经得到的32位加法器的基础上,我们可以按照如下方式构建一个加减法器,即一个完整的算术运算单元。图 25 加减法器实现其中,加减法器的功能表如下:功能SubABCin加法器0AB0减法器1AB1表 24 加减法器功能另外加减法运算都可能会改变各个标志位的值,具体判断方法如下:OV:溢出标志。OV=cout(i) xor cout(i-1)CY:进位标志。CY=cout(i)ZR:结果为零标志。 输出结果32位全为0时,ZR=1NG:结果为负数标志。输出结果最高位为1时,NG=12.2.2 逻辑运算一位逻辑运算器构造方法如下:(同时包含了与、或、异或、非)图 26 1位逻辑运算器用Verilog实现如下:图 27 1位逻辑运算器(Quartus RTL Viewer截图)将一位逻辑运算器进行32位并联之后,便可得到所需的可以实现与、或、异或、非功能的32位逻辑运算器。示意图如下:图 28 32位逻辑运算器2.2.3 移位器我们的思路是首先实现一个64位的右移位器,再用该右移位器构成一个漏斗移位器,进而实现各种移位功能。因为实际移位的位数最多为32位,因此我们可用5级2选1多路选择器构成该右移位器。其中,用四级2选1多路选择器构成16位右移位器示意图如下:图 29 16位右移位器示意图用同样的方法可以构造出用5级2选1多路选择器构造的64位右移位器。用该64位右移位器构造漏斗移位器的示意图如下:图 210 漏斗移位器设A31:0为待移位的数据,B4:0为待移位的位数,则漏斗移位器的具体实现方法如下:移位指令Op1:0功能描述YX右移位数SHL,SHLI00逻辑左移A032-BSHR,SHRI01逻辑右移0ABASR,ASRI10算术右移Sign(A)ABROR,RORI11循环右移AAB表 25 漏斗移位器的具体实现由上表可见,操作码的最低两位决定了移位的类型,而根据移位类型的不同我们可以决定64右移位器的高32位和低32位分别加载何种数据以及右移的位数。这样便可得到一个功能正确的漏斗移位器。2.3 数据通路设计图 211 数据通路设计(Visio绘制)本CPU采用了5级流水线结构,这一结构在多种RISC处理器中被广泛使用,被认为是经典的处理器设计方式。在5级流水线结构中,指令的执行分为取指、译码及取操作数、ALU操作、内存访问和回写寄存器5个阶段,各相邻阶段之间在结构上以一组流水线寄存器分隔。由此可见,上图就是CPU的RTL级设计。在本CPU的数据通路部分,我们使用verilog语言的结构描述实现了这一设计。2.3.1 指令地址选择模块图 212 指令地址选择模块如图2-12,其中PC为指令地址寄存器,PC1为子程序调用时保存返回地址的寄存器。独立于ALU的加法器PCadder1完成当前指令地址加4的功能以顺序读取下一条指令,PCadder2将待读入的下一条指令与相对偏移相加完成跳转,mux0选择下一条指令写入到PC中。2.3.2 各级流水线寄存器如图2-11,CPU中有4组流水线寄存器IF/ID,ID/EX,EX/MEM和MEM/WB。其中IF/ID中保存了刚刚读入的一条指令,并通过一个组合逻辑完成译码功能:OP为32位指令直接输出;RX,RY,RZ为寄存器地址输出;LH为高16位加载,用于LHI指令;LO为低16位加载无符号扩展,用于立即数逻辑运算;IM1为有符号扩展,用于立即数算数运算;IM2为左移两位的无符号扩展,表示转移指令的相对偏移量。2.3.3 寄存器文件图 213 寄存器文件如图2-13,RX、RY、RZ为寄存器地址输入,寻址空间为5位32个寄存器。DX,DY为寄存器内容输出。DZ为寄存器内容输入,当且仅当写使能信号WE有效时可以写入。2.3.4 指令内存和数据内存图 214 指令内存和数据内存如图2-14。仿真中我们使用Quartus的megawizard plug-in manager生成了两个双端口片上RAM分别作为指令内存和数据内存。其中指令内存作为只读内存使用,Address为8位地址输入,q为32位指令输出,该内存还有一个IRead读使能信号。数据内存作为一般的RAM使用,Data为32位数据输入,WAddress和RAddress为10位地址输入,RE为读使能,WE为写使能。2.3.5 数据相关及控制相关的解决:前传专用通路与插泡对于数据相关,由于每条指令顺次进入流水线,而且回写寄存器文件和写入数据内存分别在唯一的阶段完成,故不存在写后写相关;另外由于寄存器文件的回写实在流水线的最后一级完成,而对数据内存的读写都在第四阶段完成,故不存在后一条指令的数据更新先于前一条指令的数据读取的情况,即不存在读后写相关。唯一需要考虑的数据相关就是写后读相关。写后读相关按前后两条指令的类别可分为以下4类:ALU指令写寄存器ALU指令读寄存器,ALU指令写寄存器数据传送指令读寄存器,数据传送指令写寄存器ALU指令读寄存器,以及数据传送指令写寄存器数据传送指令读寄存器。前两类相关可能发生在相邻两条指令或相隔一条指令的两条指令间,解决方法是在数据通路中设置两条前传专用通路,如图,其中一条从ALU的输出引回到流水线第二级,结合mux2和mux3解决二、三级间的ALU-ALU相关;另一条从流水线的第四级引回到流水线第二级,解决二、四级间的相关。对于后两类相关,由于寄存器回写在第五级完成,而内存读取在第四级完成,我们的解决方法是在mux7处,在两条指令间插入一个或多个气泡从而避免相关。对于控制相关,其产生的原因在于:当条件跳转指令刚刚进入流水线时,其上一条指令(可能为ALU)的计算结果尚未进入FLAG寄存器,故无法判断是否应进行跳转。故此时需要在mux7处插入一个气泡以停水一个周期。2.4 控制器设计本CPU采用了硬连线控制器,在实现上完全使用组合逻辑。它以各级流水线寄存器中的指令寄存器中的内容及ALU标志寄存器中的内容为输入,输出各多路选择器控制信号,内存、寄存器文件、ALU标志寄存器读写信号以及ALU操作信号。其结构如图2-15。图 214 控制器设计(Quartus RTL Viewer截图)2.4.1 控制信号真值表控制信号取值条件说明MP0(SELECT PC)0IR2=JMP ;IR2=JXX&CON=1;CALL执行跳转1默认PC+42IR2=RET子程序调用3IR2=INT中断MP1(SELECT RY)0IR2=STR/CMPRY=RZ1默认RY=RYselectALUXMP21IR2为ALU/STR/LDR,并且IR4也为ALU指令,并且IR2的Rx等于IR4的RZ,且IR3为非ALU指令或者IR3的RX不等于RZ;LOAD/STR RZ,RX,IMM16第2、4阶段数据冲突,采用前传技术。0默认直接连接RX2IR2为ALU/STR/LDR,并且IR3为ALU指令,且IR2的RX等于IR3的RZ;第2、3阶段数据冲突,采用前传技术selectALUYMP32IR2为LDR/STR/ADDI/SUBIIM1(IR2低16位符号扩展)4IR2为ALU指令,并且IR4也为ALU指令,并且IR2的RY等于IR4的RZ,且IR3为非ALU指令或者IR3的RY不等于RZ;LOAD/STR RZ,RX,IMM16,故没有ta第2、4阶段数据冲突,采用前传技术。3IR2为ALU指令,并且IR3也为ALU指令,并且IR2的RY等于IR3的RZ第2、3阶段数据冲突,采用前传技术1默认直接连接RY0IR2为LOGICI(第二操作数为无符号立即数)立即数逻辑运算(没有立即数移位)LO(IR2 16位无符号扩展)selectZ5MP43IR4=LDH高位立即数存储2IR4=LDL低位立即数存储1默认ALU计算结果0IR4=LDRselect Z4MP51默认ALU计算结果0IR3为INT(修改)INT中断selectMAR MP6(主要是为了指令设计)1IR2为STR,并且IR3为ALU指令,并且IR2的RZ等于IR3的RZSTR将寄存器中内容写到内存中,数据前传解决第2、3阶段数据冒险2IR2为STR(RY=RZ),并且IR4为ALU指令,并且IR2的RZ等于IR4的RZ,并且IR3为非ALU指令或者IR3的RZ不等于IR2的RZ(由RY接出)STR将寄存器中内容写到内存中,数据前传解决第2、4阶段数据冒险0默认直接连接RYMP80默认连接X1iIR3=NOTI连接YBubble MP70默认正常执行指令1(1)IR2为转移指令(2)IR2 为ALU(I)类指令,并且IR3 为LDR/LDH/LDL,并且IR2 的Rx 等于IR3的Rz 或者 IR2 的Ry 等于IR3 的Rz(3)IR2 为ALU(I) 类指令,并且IR4 为LDR/LDH/LDL,并且IR2 的Rx 等于IR4/IR5的Rz 或者 IR2 的Ry 等于IR4/IR5 的Rz(4)IR2=STR,并且IR3/IR4为LDR/LDH/LDL ,并且IR2 的Rz 等于IR3/IR4/IR5 的Rz (5)IR2=LDR/STR,并且IR3/IR4为LDR/LDH/LDL,并且IR2 的Rx 等于IR3/IR4/的Rz(LDR,RZ冲突不用插泡)(6)IR2为CALL指令时,加泡,停水一个周期加泡,停水一个周期Fin0默认FLAG寄存器不写入1IR3=ALU(I)/CMPFLAG寄存器写入Rin0默认寄存器不写入1IR5=ALU(I) ,IR5=LDR/LDL/LDH寄存器写入PC1in0默认1IR2为CALL 记下此时的跳转地址memREAD0默认1IR4为LDR读取内存memWRITE0默认1IR4为STR写内存IREAD1恒为1,一直读指令PCIN0加泡而且iIR2为ALU(I)指令不读指令1默认读指令表 26 控制信号真值表2.4.2 指令信号控制表指令一二三四五ADDI R0,R1,IM ReadMP2=0ALUop=0000MP4=1RinMP0=1MP3=2FinPCinMP8=0MP5=1SUBI R0,R1,IM ReadMP2=0ALUop=0001MP4=1RinMP0=1MP3=2FinPCinMP8=0MP5=1ANDI R0,R1,IM ReadMP2=0ALUop=1000MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1ORI R0,R1,IM ReadMP2=0ALUop=1001MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1XORI R0,R1,IM ReadMP2=0ALUop=1010MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1NOTI R0,IMReadMP2=0ALUop=1011MP4=1RinMP0=1MP3=0FinPCinMP8=1MP5=1SHLI R0,R1,IM ReadMP2=0ALUop=1100MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1SHRI R0,R1,IM ReadMP2=0ALUop=1101MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1ASRIR0,R1,IMReadMP2=0ALUop=1110MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1RORIR0,R1,IMReadMP2=0ALUop=1111MP4=1RinMP0=1MP3=0FinPCinMP8=0MP5=1JMP IMReadMP0=0PCinJEQ IMReadMP0=0 cond=1MP0=1 elsePCinJNE IMReadMP0=0 cond=1MP0=1 elsePCinJHE IMReadMP0=0 cond=1MP0=1 elsePCinJLO IMReadMP0=0 cond=1MP0=1 elsePCinJGE IMReadMP0=0 cond=1MP0=1 elsePCinJLT IMReadMP0=0 cond=1MP0=1 elsePCinCALL IMReadPC1inMP0=0PCinRETReadMP0=2PCinNOP默认默认默认默认默认ADD R0,R1,R2ReadMP2=0ALUop=0000MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1SUB R0,R1,R2ReadMP2=0ALUop=0001MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1AND R0,R1,R2ReadMP2=0ALUop=1000MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1OR R0,R1,R2ReadMP2=0ALUop=1001MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1XOR R0,R1,R2ReadMP2=0ALUop=1010MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1NOT R0,R1ReadMP2=0ALUop=1011MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1SHL R0,R1,R2ReadMP2=0ALUop=1100MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1SHR R0,R1,R2ReadMP2=0ALUop=1101MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1ASR R0,R1,R2ReadMP2=0ALUop=1110MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1ROR R0,R1,R2ReadMP2=0ALUop=1111MP4=1RinMP0=1MP3=1FinPCinMP8=0MP5=1LDR R0,R1,IMReadMP2=0ALUop=0000readRinMP0=1MP3=2MP4=0PCinMP8=0MP5=1STR R0,R1,IMReadMP2=0ALUop=0000WRITEMP0=1MP3=2PCinselectRY=0MP5=1LDH R0, IMReadMP4=3RinMP0=1PCinLDL R0, IMReadMP4=2RinMP0=1PCinINT IMReadMP5=0MP4=1MP0=3PC1in PCinMP0=1PCinCMP R0,R1ReadMP2=0ALUop=0001MP0=1MP3=1FinPCinMP8=0表 27 指令信号控制表3 仿真测试3.1 仿真环境说明本CPU的综合及仿真在QuartusII 9.0中进行,片上指令内存以内存初始化文件(.mif)初始化,CPU的输入信号为时钟和复位,输出信号为数据通路中一些关键寄存器的值,仿真采用时序仿真,综合所选用的芯片为Cyclone III系列中的EP3C120F780C8。3.2 指令功能仿真3.2.1 ALU指令算数指令测试,代码如下:LDL R1,4LDL R2,8ADD R3,R1,R2;将12写入R3SUB R4,R2,R1;将4写入R4ADDI R5,R1,3;将7写入R5SUBI R6,R2,2;将6写入R6表 31 算数指令测试程序仿真波形如下:图 31 算数指令测试仿真波形可见从1.4us处开始,寄存器文件写使能WE有效,依次将4个运算结果(DZ)12、4、7、6写入地址(RZsel)为3、4、5、6的寄存器中。运行结果正确。逻辑运算指令测试,代码如下:LDL R1,4LDL R2,6AND R3,R1,R2;将4写入R3中OR R4,R1,R2;将6写入R4中XOR R5,R1,R2;将2写入R5中NOT R6,R1;将FFFFFFFB写入R6中ANDI R7,R1,12;将4写入R7中ORI R8,R1,12;将12写入R8中XORI R9,R1,12;将8写入R9中NOTI R10,12;将FFFFFFF3写入R10中表 32 逻辑运算指令测试程序仿真波形如下:图 32 逻辑运算测试仿真波形可见从1.4us处开始,寄存器文件写使能WE有效,依次将8个运算结果(DZ)4、6、2、FFFFFFFB、4、12、8、FFFFFFF3写入地址(RZsel)为3、4、5、6、7、8、9、10的寄存器中。运行结果正确。移位指令测试,代码如下:LDL R1,29LDL R2,3SHL R3,R1,R2;将232写入R3中SHR R4,R1,R2;将3写入R4中ASR R5,R1,R2;将3写入R5中(标志位为0)ROR R6,R1,R2;将A0000003写入R6中SHLI R7,R1,4;将464写入R7中SHRI R8,R1,4;将1写入R8中ASRI R9,R1,4;将1写入R9中(标志位为0)RORI R10,R1,4;将D0000001写入R10中表 33 移位运算指令测试程序仿真波形如下:图 33 移位运算测试仿真波形可见从1.4us处开始,寄存器文件写使能WE有效,依次将8个运算结果(DZ)000000E8、00000003、00000003、A0000003、000001D0、00000001、00000001、D0000001写入地址(RZsel)为3、4、5、6、7、8、9、10的寄存器中。运行结果正确。3.2.2 访存指令访存指令测试,代码如下:LDH R1,4;将4存入R1的高16位,低16位置0LDL R2,8;将8存入R2的低16位,高16位置0STR R1,R2,4;将R1中的内容保存在地址为R2+4的内存单元中LDR R3,R2,4;从R2+4的内存单元中读取内容载入R3中表 34 访存指令测试程序仿真波形如下:图 34 访存指令测试仿真波形可见第一次写使能(WE)有效期间,CPU完成了LDH和LDL两条指令,分别将DZ中的8h00040000和8b00000008写入到寄存器地址(RZsel)为1、2的两个寄存器中。随后数据内存写使能DATAWrite有效期间,读取地址(RYsel)为1的寄存器中的内容(DY)8h00040000,到MD4中,写入内存地址(Z4,得到这一结果的ALU计算部分的波形未画出)为12的内存地址单元中。最后数据内存读使能DATARead有效,将内存地址(Z4)为12的内存单元的内容读出,在下一个时钟周期(对应LDR指令的流水线第五阶段)传入DZ,写入寄存器地址(RZsel)为3的寄存器(R3)中。运行结果正确。3.2.3 跳转指令跳转指令测试,代码如下:LDL R1,2LDL R2,3CMP R1,R2;比较R1,R2中的值JGE 1;R2大于或等于R1时跳转,此时应跳转LDL R3,100;不执行这条指令LDL R4,200;执行这条指令表 35 跳转指令测试程序仿真波形如下:图 35 跳转指令测试仿真波形可见各级指令寄存器(IR3、IR4、IR5)中都没有读入倒数第二条指令。当JGE指令进入IR2时(即OP为94000001时),MP7变为1,流水线中插入一个气泡。在下一个时钟周期,跳转标志COND置为1,下一条指令地址选择(MP0)置为0,选择跳转后的指令地址,将最后一条指令(CC8000C8)读入指令寄存器IR2,完成跳转。最终程序将200写入寄存器文件。运行结果正确。3.2.4 函数调用指令函数调用指令测试,代码如下:LDL R1,2LDL R2,3ADD R0,R1,R2CALL 3;调用子程序,子程序入口在下一行指令后的第3行SUB R3,R2,R1;子程序调用结束后返回这里ADDI R4,R1,4;继续执行JMP 3;跳至最后一条指令后,程序结束AND R5,R1,R2;子程序入口ADDI R6,R2,5;RET;返回表 36 函数调用指令测试程序仿真波形如下:图 36 函数调用指令测试仿真波形1图 37 函数调用指令测试仿真波形2可见,当CALL指令进入IR2时(即OP为A0000003时),PC1en使能以保存返回地址,第二级流水线寄存器IR2的使能信号IR2en无效,MP7有效以插入一个气泡,从而使流水线停水一个周期以避免将下一条指令直接读入。同时MP0选择0使得下一个周期进入子程序。随后依次运行子程序中的两条指令(20A11000,40C2005),然后运行RET指令(A8000000),此时MP0选择2以读入返回指令,流水线再次停水一个周期。在下一个周期中,程序返回到CALL之后的一条指令(14620800),顺序正常执行程序,直到执行到最后一条JMP指令(80000003)跳出程序。运行结果正确。3.3 数据相关及控制相关仿真在3.2节中,已经出现过一些数据相关及控制相关的情况,以下通过一些专门的分析来验证数据相关和控制相关问题的解决。3.3.1 数据相关如2.3.5节所述,数据相关仅涉及写后读相关,按照两条冲突的指令中前一条是ALU操作或内存操作分类,相应的解决办法分别为前传和插泡。仿真代码如下:LDL R1,2LDL R2,5ADDI R3,R1,4;产生一个内存-ALU写后读相关SUB R4,R3,R2;产生一个ALU-ALU写后读相关STR R4,R0,1;产生一个ALU-内存写后读相关表 37 数据相关测试程序仿真波形如下:图 38 数据相关测试仿真波形如图。当第二条LDL指令读入IR2中后(即OP为CC400005后),由于下一时钟周期内ALU指令要读取同一寄存器R1,与第一条指令构成写后读相关,故控制器通过将MP7置为1在流水线寄存器中插泡,同时将IR2读使能IR2en置为无效,从而解决了第一个相关。当R1载入完成后,CPU继续流水,执行连续两条冲突的ALU指令。当其中第一条ALU指令进入IR3时(即IR3为40610004时,此时IR2中为第二条ALU指令),MP2置为2,从而将ALU输出直接接回至流水线第三级的输入,以完成下一条ALU指令的计算,从而解决了第二个相关。最后读入CPU的是一条STR指令,它与第二条ALU指令构成冲突。当第二条ALU指令进入IR3时(即IR3为14831000时,此时IR2中为STR指令),MP6置为1,从而将ALU输出直接接回至流水线第三级输入的MD3寄存器中,在两个时钟周期后写入到数据内存中,从而解决了第三个相关。运行结果正确。3.3.2 控制相关控制相关的仿真测试程序可见3.2.3节中的程序,其中涉及到一行条件跳转指令JGE。以下将代码和仿真波形重新给出并进行分析。LDL R1,2LDL R2,3CMP R1,R2;比较R1,R2中的值JGE 1; R2大于或等于R1时跳转,此时应跳转LDL R3,100;不执行这条指令LDL R4,200;执行这条指令表 38 控制相关测试程序图 39 控制相关测试仿真波形如图,当跳转指令读入IR2时(即OP为94000001时),控制器通过将MP7置为1在流水线寄存器中插泡,同时将IR2读使能IR2en置为无效(途中未画出),以避免直接读入下一条指令。在下一个时钟周期,跳转标志COND置为1,下一条指令地址选择(MP0)置为0,选择跳转后的指令地址,将最后一条指令(CC8000C8)读入指令寄存器IR2,完成跳转。最终程序将200写入寄存器文件。运行结果正确。4 总结控制器部分:我们设计的CPU的控制器是硬连线设计,在设计控制器时,拿到数据通路后,需要弄清楚数据通路需要哪些控制信号,每条指令在流水线的不同阶段时该阶段的控制信号应该是什么,这就必须要清楚每条指令在流水线中执行的完整过程,包括遇到控制冒险和数据冒险,选择加泡或者数据前传的方法来消除冒险,弄清楚这些过程之后,代码倒是比较简单。最开始,控制器的控制信号是在时钟的上升沿统一发出,由于输出端有寄存器,输出控制比较稳定,但是,虽然控制信号时钟频率比CPU主频率低很多,但是在调试的时候依然发现两个时钟之间不好协调,后来就把控制器改成纯组合电路,直接输出。通过写控制器,我对流水线中指令的执行过程有了更加深刻的认识,对CPU的工作原理也有了更深入的理解,收获很大。ALU部分吴方照同学的感想写在这里吧。:数据通路部分:数据通路设计是CPU中比较复杂的部分。虽然有课件上的设计图可供参考,但是在CPU实现及仿真测试的过程中,不可避免地发现了一些问题,需要结合控制器设计及ALU设计,反复对数据通路反复进行修改。同时,由于以前的HDL设计大多采用的是功能描述,而本次大作业中的设计和实现都是模块化的结构描述,也需要一些时间去适应。然而,通过对数据通路的设计,我对于流水线CPU的结构和功能都有了更加深刻的认识,同时在数字电路设计上也积累了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 康复科疼痛科活动方案策划
- 福克斯营销方案
- 物联网技术在库存监控-洞察及研究
- 6G网络智能天线多用户干扰抑制方法-洞察及研究
- 大学大礼堂活动方案策划
- 纸品生命周期评价研究-洞察及研究
- 电商生态圈构建-洞察及研究
- 就业咨询服务方案
- 纺织服装行业知识产权保护机制研究-洞察及研究
- 2025年光伏组件生产成本控制与市场竞争力分析报告
- 生产成本控制及预算管理表格模板
- 动漫艺术概论考试卷子及答案
- 山东省青岛市即墨区实验学校2025-2026学年九年级上学期开学考试英语试题(含答案)
- 浙江省浙南名校联盟2025-2026学年高二上学期开学返校联考英语试卷(含音频)
- 2025年国企中层干部竞聘笔试题及答案
- 材料返款协议书
- DB3202∕T 1075-2024 职业健康检查质量控制技术规范
- 教育惩戒培训课件
- 期末教学质量分析会校长讲话:把脉找因、沉心补课教学质量没有“回头路”
- 调经补血中药液行业跨境出海项目商业计划书
- 五金公司质量管理制度
评论
0/150
提交评论