将粗略结构模型的数据通路划分为:取指令单元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