RISC-VCPU设计(三)---多周期CPU的设计与实现

更新时间:2023-08-12 05:50:12 阅读: 评论:0

RISC-VCPU设计(三)---多周期CPU的设计与实现
基本情况
本多周期CPU⽀持RV32I指令集(fence,ecall,ebreak除外),已通过部分指令的测试,如代码有bug,欢迎指出。
模块划分
代码将CPU划分为以下⼏个模块:
1.控制单元:ControlUnit
⽤于产⽣控制信号,是CPU的⼤脑,指挥中枢。
2.分⽀决策单元:BranchUnit
⽤于决定B型指令是否发⽣跳转
3.⽴即数单元:ImmUnit
⽤于从指令中解析出⽴即数.
4.寄存器堆:RegisterFile
RISC-V的32个寄存器,其中x0寄存器恒为0,不可更改。
5.指令存储器:InstrMem
⽤于存储指令,⽬前仅⽀持32位指令,不⽀持16位指令,且地址是4字节对齐的。
6.数据存储器:DataMem
数据存储器,⽤于存储数据,可进⾏字、半字、字节的读写。
7.Data_Ext
⽤于load指令,从读出的字中获取需要的部分,并进⾏符号/⽆符号扩展。例如LH,LBU指令选取哪个半字、哪个字节,以及如何扩展为32bit。
8.PC⽣成单元:NPC_Generator
根据Jal,Jalr以及Branch⽣成下⼀条指令的地址(PCF),若上述三个信号均为⽆效电平,则更新为PCF+4
9.计算部件:ALU
⽤于算数逻辑运算。
代码
控制单元
`timescale 1ns /1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/15 18:13:29
// Design Name:
/
/ Module Name: ControlUnit
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
/
/
//
`include"Parameters.v"
import Params::*;
module ControlUnit(
input logic [6:0] Op,
input logic [2:0] Fn3,
input logic [6:0] Fn7,
output logic JalD,//是否为Jal指令
output logic JalD,//是否为Jal指令
output logic JalrD,//是否是Jalr指令
output LoadType RegWriteD,//LOAD指令字节选取(LW,LH,LB,...)
output logic MemToRegD,//写⼊寄存器的值是否来⾃MEM
output logic [3:0] MemWriteD,//写MEM时字节选中信号,S类型指令航线英文
output logic LoadNpcD,//MEM阶段是否计算PC+4,⽤于Jal和Jalr指令
output BType BranchTypeD,//分⽀指令类型,BEQ,BNE,...
output AluOp AluControlD,//EXE阶段ALU控制信号,进⾏何种运算
output logic [1:0] AluSrc2D,//第⼆个源操作数的来源
output logic AluSrc1D,//第⼀个源操作数的来源,rs1或者pc
output Type ImmType              //⽴即数类型,不同类型解析不同
);
//jal,jalr
assign JalD=(Op==7'b1101111)?1'b1:1'b0;//是否为Jal指令
assign JalrD=(Op==7'b1100111)?1'b1:1'b0;//是否为jalr指令
//RegWriteD
always_comb
begin
if(Op==7'b0000011)//是load指令
begin
ca(Fn3)
3'b000:RegWriteD=LB;//LB
3'b001:RegWriteD=LH;//LH
3'b010:RegWriteD=LW;//LW
3'b100:RegWriteD=LBU;//LBU
3'b101:RegWriteD=LHU;//LHU
default:RegWriteD=NOREGWRITE;//出错,不写寄存器
endca
end
el if(Op==7'b0010011||Op==7'b0110011||Op==7'b0110111||Op==7'b0010111||Op==7'b1101111||Op==7'b1100111)
begin
RegWriteD=LW;//I型指令(寄存器-⽴即数指令)、R型指令、U型指令(LUI,AUIPC),J型指令(JAL)和JALR指令,写寄存器    end
el//B型,S型指令,不写寄存器
begin
RegWriteD=NOREGWRITE;
end
end
//MemToRegD
always_comb
begin
if(Op==7'b0000011)//是load指令
MemToRegD=1;
el//其他指令数据均不来⾃于MEM
MemToRegD=0;
end
自然拼读
/
/MemWriteD
always_comb
begin
if(Op==7'b0100011)//S型指令,写MEM
ca(Fn3)
3'b000:MemWriteD=4'b0001;//SB
3'b001:MemWriteD=4'b0011;//SH
3'b010:MemWriteD=4'b1111;//SW
default:MemWriteD=4'b0000;
endca
el
MemWriteD=4'b0000;
end
//LoadNpcD
assign LoadNpcD=(JalD|JalrD)?1'b1:1'b0;//只有Jal指令和Jalr指令时会计算PC+4并存⼊Reg[Rd]
//BranchTypeD
always_comb
begin
if(Op==7'b1100011)//如果是B型指令(条件分⽀)
if(Op==7'b1100011)//如果是B型指令(条件分⽀)
ca(Fn3)
3'b000:BranchTypeD=BEQ;//BEQ
3'b001:BranchTypeD=BNE;//BNE
3'b100:BranchTypeD=BLT;//BLT
3'b101:BranchTypeD=BGE;//BGE
3'b110:BranchTypeD=BLTU;//BLTU
3'b111:BranchTypeD=BGEU;//BGEU
default:BranchTypeD=NOBRANCH;
endca
el
BranchTypeD=NOBRANCH;
end
//AluControlD
always_comb
begin
ca(Op)four
7'b0000011:AluControlD=ADD;//LOAD指令,计算地址,ADD
7'b0100011:AluControlD=ADD;//STORE指令,计算地址,ADD
7'b0110111:AluControlD=LUI;//LUI指令,保持⽴即数不变
7'b0010111:AluControlD=ADD;//AUIPC指令,Reg[rs1]+Imm,ADD
7'b1100011:AluControlD=ADD;//B型条件分⽀指令,不使⽤ALU,dont care(分⽀跳转地址计算在ID阶段完成) 7'b1101111:AluControlD=ADD;//jal指令,未⽤到ALU(地址计算在ID阶段完成)
7'b1100111:AluControlD=ADD;//jalr指令,计算跳转地址(Reg[rs1]+Imm)&~1,ADD
7'b0110011://R型指令
begin
ca(Fn3)
3'b000:if(Fn7[5]==0)
AluControlD=ADD;
el
AluControlD=SUB;
3'b001:AluControlD=SLL;
3'b010:AluControlD=SLT;
3'b011:AluControlD=SLTU;
3'b100:AluControlD=XOR;
3'b101:if(Fn7[5]==0)
AluControlD=SRL;
el
AluControlD=SRA;
3'b110:AluControlD=OR;
asians>了不起的盖茨比简介
材料成型及控制工程考研3'b111:AluControlD=AND;
default:AluControlD=ADD;
endca
end
7'b0010011://I型指令(寄存器-⽴即数和移位指令)
begin
ca(Fn3)
3'b000:AluControlD=ADD;
3'b010:AluControlD=SLT;
3'b011:AluControlD=SLTU;
3'b100:AluControlD=XOR;
3'b110:AluControlD=OR;
3'b111:AluControlD=AND;
3'b001:AluControlD=SLL;
natasha bedingfield3'b101:if(Fn7[5]==0)
AluControlD=SRL;
el
AluControlD=SRA;
default:AluControlD=ADD;
endca
end
default:AluControlD=ADD;
endca
end
//AluSrc1D,PC or 寄存器rs1
//AluSrc1D,PC or 寄存器rs1
always_comb
if(Op==7'b0010111)//AUIPC指令,第⼀个源操作数来⾃PC
AluSrc1D=1;
el
AluSrc1D=0;
//AluSrc2D
always_comb
begin
if(Op==7'b0010011&&(Fn3==3'b001||Fn3==3'b101))//移位指令        AluSrc2D=2'b00;//来⾃rs2
el if(Op==7'b1100011||Op==7'b0110011)//R型指令或者B型指令        AluSrc2D=2'b01;//来⾃Reg[rs2]
el//其他指令
AluSrc2D=2'b10;//来⾃⽴即数
end
//ImmTypeD
日程表英文
always_comb
begin
ca(Op)
7'b0110011:ImmType=RTYPE;
7'b0010011:ImmType=ITYPE;
7'b0000011:ImmType=ITYPE;
7'b1100111:ImmType=ITYPE;
7'b1100011:ImmType=BTYPE;
ranth
7'b0100011:ImmType=STYPE;
7'b1101111:ImmType=JTYPE;
7'b0110111:ImmType=UTYPE;
7'b0010111:ImmType=UTYPE;
default:ImmType=RTYPE;
endca
end
endmodule
计算单元
`timescale 1ns /1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/03/16 16:43:50
/
/ Design Name:
// Module Name: ALU
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
/
/ Additional Comments:
//
//
import Params::*;
`include "Parameters.v"
module ALU(
input logic [31:0] Operand1,
input logic [31:0] Operand2,
input AluOp AluControl,
output logic [31:0] AluOut
);
always_comb
begin
ca(AluControl)
SLL:AluOut=Operand1<<(Operand2[4:0]);//逻辑左移
SRL:AluOut=Operand1>>(Operand2[4:0]);//逻辑右移
SRA:AluOut=$signed(Operand1)>>>(Operand2[4:0]);//算术右移
ADD:AluOut=Operand1+Operand2;//加
SUB:AluOut=Operand1-Operand2;//减
XOR:AluOut=Operand1^Operand2;//异或
OR:AluOut=Operand1|Operand2;//或
AND:AluOut=Operand1&Operand2;//与
SLT:AluOut=($signed(Operand1)<$signed(Operand2))?32'd1:32'd0;//⼩于置位      SLTU:AluOut=(Operand1<Operand2)?32'd1:32'd0;//⽆符号⼩于置位      LUI:AluOut=Operand2;//LUI指令
default:AluOut=0;
endca
end
endmodule
//ALUContrl
/*
`define SLL  4'd0
`define SRL  4'd1
`define SRA  4'd2
`define ADD  4'd3
finity
`define SUB  4'd4
`define XOR  4'd5
`define OR  4'd6
`define AND  4'd7
`define SLT  4'd8
`define SLTU  4'd9
`define LUI  4'd10
*/
⽴即数⽣成单元

本文发布于:2023-08-12 05:50:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/1129760.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   计算   地址
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图