RISC处理器设计-------处理器整体架构

Posted 1mpanda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RISC处理器设计-------处理器整体架构相关的知识,希望对你有一定的参考价值。

将粗略结构模型的数据通路划分为:取指令单元IFU、指令译码单元IDU、算术运算单元ALU、存储器访问单元MAU以及前推和数据寄存器堆FRU。
前推和数据寄存器堆FRU包括写回级、寄存器堆和数据前推逻辑。一些指令的功能涉及在多个流水线级的操作,把流水线的控制功能集中在两个模块完成。
因此分别设计流水线控制单元PCU和总线控制单元BCU,用以实现对外存储器和总线控制协议的接口。
1.取指令级IFU
IFU包括程序计数器PC、跳转解码、PC逻辑、通用指令Cache MPC和条件转移目标Cache BTC。
部分跳转指令以及其延迟指令保存在BTC中,其他指令保存在MPC中。跳转指令在这一级识别并计算跳转地址。
IFU从Cache中或向BCU请求从存储器中取出下一条指令之后,指令送向IDU中。跳转指令在这一级识别并计算跳转地址。
该单元模块工作在不同模式下:FETCH_MODE信号选择IFU工作在串行存储器访问模式还是并行存储器访问模式,Cache也存在多种工作模式并可以关闭。
 
2.指令译码单元IDU
IDU对来自IFU的指令进行译码,产生指令执行所需的控制信号。该单元识别非法或无效的指令,以及处理器的违规操作并对相应的异常情况给出对应的控制信号。
 
3.算术逻辑单元ALU
ALU完成算术和逻辑运算操作,还可以进行循环和移位操作。同时还为下一个流水线级的存储器访问操作计算地址。
 
4.存储器访问单元MAU
MAU用于访问主存储器,写回的数据送向总线控制单元BCU,从主存储器读取的数据也来自BCU。
对于指令SWAP,需要在一个流水线周期内完成读/写两个操作。当没有存储器访问进行时,这个单元的功能是作为流水线的一个缓冲器。
 
5.前推和寄存器堆单元FRU
FRU包括通用寄存器堆、前推逻辑和回写流水线级。根据流水线结构,有时请求读取的寄存器数据在上一个流水线级刚刚写入。
这种情况通过前推机制来处理数据相关。新的数据通过前推可以直接从相应的总线上读出。
数据前推相关的逻辑包含在FRU中,这样对于其他单元,并不知道数据是来自寄存器堆还是前推逻辑。
 
6.流水线控制单元PCU
PCU控制流水线的运行。它能够使能或者禁止流水线的执行,并对所有的部件通过控制信号。
PCU还管理外部请求和内部产生的中断事件。
 
7.总线控制单元BCU
BCU支持芯片同外部存储器的通信。它实现一边是异步,一边是同步的握手协议。
对外部,该单元提供存储器所有所需的控制信号。
对内部,它提供总线使用权,以便IFU和MAU能够安全共享一个存储器总线。
 
对处理器整体架构进行把握之后,开始对处理器进行编码。本文所有的编码均使用硬件描述语言 Verilog HDL,对系统功能的验证使用UVM和system verilog。
首先是处理器Chip
CHIP模块作为前面提到的7个子模块的总体框架,指明了子模块之间的关系。外部芯片信号也与这些子模块相连。
外部信号分别有输入信号in、输出信号out和三态信号tri。
 
信号 方向 编码 说明
CONFIG 输入
 
0????
1????
 
???00
???01
???10
???11
 
?00??
?01??
?10??
Cache配置
并行模式
串行模式
 
BTC:关
BTC:只保存BCC
BTC:只保存CALL
BTC:保存BCC和CALL
 
MPC:关
MPC:RIB模式
MPC:IC模式
IRQ_ID 输入
 
000
001
010
中断ID号
总线错误
页面错误
未对准错误
CP 输入   系统时钟
nRESET 输入
 
1
0
复位
CPU工作
复位
nIRQ 输入
 
1
0
中断请求
无请求
系统请求中断
nMHS 输入
 
1->0
0->1
存储器握手信号
启动存储器访问
存储器访问结束
nHLT 输入
 
1
0
中止
CPU工作
CPU中止
BUS_PRO 输入
 
1
0
总线协议
同步
异步
ADDR_BUS 输出   存储器地址总线
ACC_MODE 输出
 
00
01
10
访存类指令的访问模式
字节
半字
nIRA 输出
 
1->0
0->1
中断响应
接受中断请求
中断执行
RnW
 
 
nRWM
输出
 
 
输出
 
1
0
 
0
1
存储器读或写
读后写
读--写访问
无读--写访问
nMRQ 输出
 
0
1
存储器请求
存储器访问
无存储器访问
KU_MODE 输出
 
0
1
处理器模式
内核模式
用户模式
DATA_BUS 三态   数据总线

 

chip是整个处理器的顶层模块,包含各个部分的输入输出。chip的verilog编码如下:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 1mpanda
// 
// Create Date: 2018/02/01 19:58:05
// Design Name: 
// Module Name: chip
// Project Name: 处理器chip模块,是联系各个模块关系的顶层模块
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//ACC_MODE:访存类指令的访问模式 00--字节 01--半字  10--字
//BUS_PRO:0--异步总线协议  1--同步总线协议
//CONFIG:Cache配置 0????--并行模式 1????--串行模式 ?00??--MPC关闭 ?01??--MPC为RIB模式 ?10??--MPC为IC模式  ???00--BTC关闭 ???1?--BTC保存CALL指令 ????1---BTC保存BCC指令
//IRQ_ID 中断ID号 000--总线错误   001--页面错误   010--未对准错误
/*
remaining:系统环境和操作系统
KU_MODE 处理器模式  0--用户模式   1--内核模式
nRMW  0---读后写访问   1---无读后写访问
RnW  0---存储器写   1---存储器读
nHLT  0---中止并将CPU与数据总线和地址总线断开连接   1---CPU工作
nIRA 中断响应  1->0 --接受中断请求  0->1---中断执行
nMHS  存储器握手协议  1->0:启动存储器访问  0->1:存储器访问结束
nMRQ  存储器请求  1->0:接收存储器访问
FACC  取值访问  0--数据访问  1--指令访问
nRESET  CPU复位  0--CPU重置  1---CPU工作

*/
///////////////////////////////////////////////////////////////
/*
内部连接的信号编码
ALU_OPCODE 算术和逻辑运算单元信号
0000--AND   0001--OR  0010---XOR  0100---LSL    0101---LSR   0110---ASR  0111---ROT  1000--ADD  1001--ADDC  1010--SUB  1011--SUBC
BCU_ACC_DIR  访问方向  00--Load  01--Store  10--Swap
BCU_ACC_MODE 访问模式  0??--MAU访问  1??--IFU访问  ?00--字节访问  ?01--半字访问  ?10---字访问
BCU_READY 存储器访问状态  0--存储器访问未完成   1--存储器访问已完成
BREAK_MEM_ACC  0--存储器访问  1--禁止存储器访问
CALL_NOW CALL指令  0--NPC_BUS有效  1--NPC_BUS无效
CCLR 清除caches  1--CCLR在IDU中   0--无CCLR在IDU中
DIS_ALU  0--允许指令执行   1--禁止指令执行      也就是是否禁止EX级
DIS_IDU  0--允许指令译码   1--禁止指令译码      也就是是否禁止ID级
DO_HALT HALT请求   0--无HALT请求   1--有HALT请求
DO_RET1 RET1请求   0--无RET1请求   1--有RET1请求
DS_IN_IFU  0--指令无延迟槽  1--指令是跳转类指令,指令在ID级、延迟指令在IF级
EMERG_FETCH  中断标志  0--无中断  1--下一步进入中断
EXECPT_CTR   CTR异常   0--无延迟跳转   1--存在延迟跳转指令
EXECPT_ID    异常ID   000--延迟跳转指令  001---Privilege Violation  010--不合法指令  011---无效指令
EXCEPT_RQ    异常请求  0--无异常  1--存在异常请求在IDU或IFU级
FD_FLAGS、FLAGS_FROM_ALU、IF_FLAGS  标志位  0--进位  1--溢出  2--零  3--负
ID_KU_MODE,IF_KU_MODE  0--用户模式  1--内核模式
IFU_CORRECT  IFU跳转校正   0--无分支跳转   1--IFU校正上一次的分支跳转方向
IFU_FETCH_RQ IFU装载请求  0--无指令装载  1--在下一步进行指令装载
INT_STATE  选择中断重叠寄存器  00--无中断  01--内部中断(软件中断或异常) 10--硬件中断
KILL_IDU  IDU禁止  0--所有判断信号无效  1--设置判断信号
LDST_ACC_NOW MAU访问 0--无MAU访问 1--允许MAU访问
MAU_ACC_MODE2,MAU_ACC_MODE3 访问模式  0??--如果是跳转类指令按字节访问,如果时SWP指令按字访问   1?0--如果是跳转类指令按半字访问,如果是SWP指令按字访问  1?1--按字访问
MAU_OPCODE2,MAU_OPCODE3 MAU操作码 000--无标记拓展读  001--有标记拓展读  010--store 011--swap访问   1??--将C3_BUS上的数据转移到C4_BUS上
NEW_FLAGS ALU操作数是否带.F标志   0--不带标志   1---带.F标志
SREG_ACC_DIR  0--读特殊寄存器,发送数据到SREG_DATA  1--将B_BUS上的数据转移到特殊寄存器
SREG_ADDR 特殊寄存器编码
            0000--PC  0001--RPC  0010--LPC  0011--SR  0110--HISR  0111--ECSR
            1000--SISR  1001--HIRPC   1010--ECRPC  1011--SIRPC  1100--HIADR  1101--ECADR
 SWI_RQ  软中断请求  0--无软件中断  1--存在软件中断
 WORK_EX,WORK_FD,WORK_ID :0--保持不变  1--输入使能
 STEP  0--流水线不移动  1--流水线移动
WORK_WB  0--保持不变    1--输入使能
 USE_IMMEDIATE  0--立即数无效  1--立即数有效
 USE_PCU_PC  0--忽略PC_BUS地址  1--使用PC_BUS总线
 USE_SREG_DATA  0--特殊寄存器无效  1--特殊寄存器有效
*/

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


module chip(
    ADDR_BUS,
    ACC_MODE,nIRA,RnW,nRMW,nMRQ,FACC,KU_MODE,
    DATA_BUS,
    CONFIG,IRQ_ID,CP,nRESET,nIRQ,nMHS,nHLT,BUS_PRO
    );
    output [31:0] ADDR_BUS;     //地址总线
    output [ 1:0] ACC_MODE;     //访问模式
    output        nIRA,
                  RnW,
                  nRMW,
                  nMRQ,
                  FACC,
                  KU_MODE;
                  
     input [31:0] DATA_BUS;     //数据总线
     input [ 4:0] CONFIG;       //cache  配置
     input [ 2:0] IRQ_ID;       //中断ID号
     input        CP,
                  nRESET,
                  nIRQ,
                  nMHS,
                  nHLT,
                  BUS_PRO;
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
   //定义外部连接的线网类型---引脚               
     wire [31:0] ADDR_BUS;
     wire [ 1:0] ACC_MODE;
     wire        nIRA,
                  RnW,
                  nRMW,
                  nMRQ,
                  FACC,
                  KU_MODE;
                  
     wire [31:0] DATA_BUS;
     wire [ 4:0] CONFIG;
     wire [ 2:0] IRQ_ID;
     wire        CP,
                  nRESET,
                  nIRQ,
                  nMHS,
                  nHLT,
                  BUS_PRO;
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //定义内部连接---------数据
  wire [31:0] A_BUS,             //操作数总线A
               B_BUS,            //操作数总线B
               C3_BUS,           //ALU运算结果
               C4_BUS,           //MAU结果
               I_BUS,            //指令总线
               IFU_DATA_BUS,     //指令读数据
               IMMEDIATE,        //立即数
               MAU_READ_DATA,    //访问存储器读取数据
               MAU_WRITE_DATA,   //访问存储器写入数据
               SREG_DATA,        //特殊寄存器读数据
               D_BUS;            //准备写入的数据
               
  wire [ 3:0] ALU_OPCODE,       //ALU操作码
               FLAGS_FROM_ALU,  //ALU运算标志位的结果
               IF_FLAGS,        //IF级分支跳转的标志位
               FD_FLAGS,        //FD分支跳转的标志位
               SWI_ID;          //软件中断的ID号
               
  wire [ 2:0] BCU_ACC_MODE,     //BCU访问模式
               EXCEPT_ID,       //异常ID号
               MAU_ACC_MODE2,   //MAU访问模式  针对ID级
               MAU_ACC_MODE3,   //MAU访问模式  针对EX级
               MAU_OPCODE2,     //MAU操作码    针对ID级
               MAU_OPCODE3;    //MAU操作码    针对EX级
               
  wire [ 1:0] BCU_ACC_DIR,
               INT_STATE;               
  wire        ALU_CARRY;        //操作数进位
               
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义内部连接-------地址
wire [31:0] MAU_ADDR_BUS;       //存储器访问数据的地址总线
wire [31:2] IFU_ADDR_BUS,       //下一条指令地址 >> 2
             NPC_BUS,            //当前指令地址+4 再>>2
             PC_BUS;             //PC总线
wire [ 4:0] ADDR_A,             //寄存器操作数A的地址
             ADDR_B,            //寄存器操作数B的地址
             ADDR_C,            //目的寄存器的地址
             ADDR_D;            //写数据寄存器的地址
wire [ 3:0] SREG_ADDR;         //特殊寄存器地址
               
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//定义内部连接-------控制信号
wire        BCU_READY,          //存储器访问状态
             BREAK_MEM_ACC,     // 存储器访问中断请求
             CALL_NOW,
             CCLR,              //清除Cache
             DIS_ALU,           //释放ALU请求
             DIS_IDU,           //释放IDU 请求
             DO_HALT,
             DO_RET1,
             DS_IN_IFU,         //IFU延迟槽(delay slot)
             EMERG_FETCH,       //中断入口地址
             EXCEPT_CTR,        //延迟跳转所照成的异常请求
             EXCEPT_RQ,         //异常请求
             ID_KU_MODE,        //ID级内核或用户模式
             IF_KU_MODE,        //IF级内核或用户模式
             IFU_CORRECT,       //分支跳转
             IFU_FETCH_RQ,      //指令访问请求
             KILL_IDU,          //IDU不执行
             LDST_ACC_NOW,      //MAU总线访问
             NEW_FLAGS,         //ALU.F
             SREG_ACC_DIR,      //特殊寄存器访问方向
             SWI_RQ,            //软件中断请求
             USE_IMMEDIATE,     //立即数
             USE_PCU_PC,        //PC_BUS
             USE_SREG_DATA,     //SREF_DATA
             WOKR_EX,           //EX级使能
             WORK_FD,           //FD级使能
             WORK_ID,           //ID级使能
             WORK_IF,           //IF级使能
             WORK_MA,           //MA级使能
             STEP,              //流水线流动
             WORK_WB;           //WB级使能                    
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//实例化
//取值单元
ifu IFU(
I_BUS ,            //输出数据
IFU_ADDR_BUS ,NPC_BUs,   //输出地址
BREAK_MEM_ACC ,CALL_NOW ,DIS_IDU ,DIS_ALU ,EXCEPT_CTR ,DS_IN_IFU ,IFU_FETCH_RQ ,IFU_CORRECT,      //输出控制信号

IFU_DATA_BUS ,PC_BUS ,CONFIG ,IF_FLAGS ,FD_FLAGS,   //输入数据
CP ,WORK_IF ,WORK_FD ,CCLR ,nRESET ,IF_KU_FLAGS ,USE_PCU_PC ,NEW_FLAGS ,LDST_ACC_NOW ,EMERG_FETCH    //输入控制信号
);

 
 //指令译码单元
idu IDU(
    IMMEDIATE ,SWI_ID ,EXCEPT_ID,     //输出数据
    ADDR_A ,ADDR_B ,ADDR_C ,ADDR_D ,SREG_ADDR,      //输出地址
    ALU_OPCODE ,MAU_ACC_MODE2 ,MAU_OPCODE2 ,        //输出控制信号
    USE_SREG_DATA ,USE_IMMEDIATE ,SWI_RQ ,EXCEPT_RQ ,
    SREG_ACC_DIR ,DO_RET1 ,DO_HALT ,NEW_FLAGS ,CCLR,   
    I_BUS , //输入书籍
    CP ,WORK_ID ,STEP ,KILL_IDU ,nRESET ,ID_KU_MODE ,EXCEPT_CTR     //输入控制信号
); 

//算术逻辑运算单元
alu ALU(
    C3_BUS ,FLAGS_FROM_ALU,     //输出数据
    A_BUS ,B_BUS ,ALU_CARRY ,ALU_OPCODE ,CP ,WORK_EX    //输入数据
);

//存储器访问单元
mau MAU(
    C4_BUS ,MAU_WRITE_DATA ,     //输出数据
    MAU_ADDR_BUS,               //输出地址
    D_BUS ,MAU_READ_DATA, C3_BUS,   //输入数据
    MAU_ACC_MODE3 ,MAU_OPCODE3 ,CP ,WORK_MA //输入控制信号
); 

//前推和寄存器堆单元 
fru FRU(
    A_BUS ,B_BUS ,D_BUS,    //输出数据
    SREG_DATA ,IMMEDIATE ,C3_BUS ,C4_BUS,    //输入数据
    
    ADDR_A ,ADDR_B ,ADDR_C ,ADDR_D,         //输入地址
    INT_STATE ,USE_IMMEDIATE ,CP ,STEP ,    //输入控制信号
    WORK_EX ,WORK_MA ,WORK_WB ,USE_SREG_DATA    
);

//流水线控制单元
pcu PCU(
        SREG_DATA ,IF_FLAGS ,FD_FLAGS ,ALU_CARRY,       //输出数据
        PC_BUS,                                         //输出地址
        MAU_ACC_MODE3 ,MAU_OPCODE3 ,BCU_ACC_MODE ,BCU_ACC_DIR ,INT_STATE,   //输出控制信号
        nIRA ,KU_MODE ,IF_KU_MODE ,ID_KU_MODE ,STEP,
        WORK_IF ,WORK_FD ,WORK_ID ,WORK_EX ,WORK_MA ,WORK_WB,
        USE_PCU_PC ,LDST_ACC_NOW ,EMERG_FETCH ,KILL_IDU,
        
        B_BUS ,FLAGS_FROM_ALU ,SWI_ID ,IRQ_ID ,EXCEPT_ID,   //输入数据
        MAU_ADDR_BUS ,IFU_ADDR_BUS ,NPC_BUS ,SREG_ADDR ,MAU_ACC_MODE2 ,MAU_OPCODE2, //输入地址
        CP ,nRESET ,nIRQ ,BCU_READY ,                       //输入控制信号
        CALL_NOW ,IFU_CORRECT ,DS_IN_IFU ,DIS_IDU ,DIS_ALU,
        SREG_ACC_DIR ,SWI_RQ ,EXCEPT_RQ ,DO_HALT ,DO_RET1 ,NEW_FLAGS
);

//总线控制单元
bcu BCU(
    MAU_READ_DATA ,IFU_DATA_BUS ,   //输出数据
    ADDR_BUS,                       //输出地址
    ACC_MODE ,BCU_READY ,nMRQ ,FACC ,nRMW ,RnW,     //输出控制信号
    
    DATA_BUS ,                      //双向数据
    MAU_WRITE_DATA,                 //输入数据
    IFU_ADDR_BUS ,MAU_ADDR_BUS,     //输入地址
    CP ,nRESET ,BCU_ACC_MODE ,BCU_ACC_DIR ,BREAK_MEM_ACC ,IFU_FETCH_RQ,  //输入控制信号
    BUS_PRO ,nHLT ,nMHS
);

endmodule

 

以上是关于RISC处理器设计-------处理器整体架构的主要内容,如果未能解决你的问题,请参考以下文章

科普 | 处理器RISC和CISC架构分析对比

NASA 选中 RISC-V 高性能计算芯片架构

[转] RISC-V架构介绍

趋势观察:第五代精简指令集RISC

阿里开源玄铁RISC-V系列处理器,推动RISC-V架构走向成熟

软考 系统架构设计师计算机组成与体系结构⑤ CISC与RISC