1.掌握RISC-V特性 熟悉处理器结构
RISC-V是哈佛结构的处理器,指令存储和数据存储是分开的
有两个memory 指令存储器and数据存储器
RV32\64 代表他是32位或64位的指令集 IEM等字母代表模块
2.设计一个实现加法的CPU单元
2.1 总览
add指令:用到5条
add R型 立即数加法
addi I型 ADD Immediate 立即数加法 把一个寄存器和一个立即数进行相加
bne B型 branch not equal 分支跳转 两个数不等就跳转
jal J型 jump and link 跳转后储存指令地址
lui U型 load upper immediate 高位立即数加载存入寄存器
最开始有指令存储器inst_mem和数据存储器data_mem两个记忆单元,这里数据存储器用不上的
1.PC寄存器pc_reg来决定从指令存储器中读哪一条指令
2.将指令取出后经过译码模块ctrl分析指令进行译码,提供控制信号,地址信号和立即数值
case1.add寄存器加法,译码后会根据相应的寄存器地址取出寄存器值,所以需要一个reg_file来存放寄存器堆
case2.addi立即数加法,立即数并不能直接使用,需要根据指令的结构不同有不同的扩展,所以需要一个imm_gen立即数扩展模块,才可以送入3.ALU算数逻辑运算单元中去
4.不涉及数据访存
5.数据直接写回寄存器堆中,除此以外还有一些信号流回PC寄存器中,准备提取下一条指令
2.2 指令存储器设计
代码解析:32为CPU,所以 CPU_WIDTH = 32,所有单元的最大位宽只能是这个CPU_WIDTH
1.首先模块例化一个输入 32位的程序计数器curr_pc(代表发号施令 告诉指令存储器执行哪一条指令)
一个输出 32位的指令寄存器inst
并设置32位内存大小为1024的指令存储器inst_mem_f(宽度只用到10)
2.一句always写取指令命令
这里的取值粒度为字节(8bit),且对于指令来说前两位不含有效信息不读,所以说程序计数器宽度从2开始读,读出对应指令的地址给指令存储器inst_mem_f进行进一步的寻址,最后再将这个地址中的数据赋值给指令寄存器inst,这样就完成了取指令的过程
2.3 PC寄存器 programme counter register设计
代码解析:
1.例化环节跳过
2.ena跟随复位 复位给curr_pc置零 \next_pc
next_pc:为什么最后curr_pc加32位16进制4,因为指令前两位不用,也就是说前四位的前两个字是是什么都不影响这一位为0
设计完毕后用tb测试
2.4 译码阶段 控制模块CTRI
指令集:
接下来对RISC-V指令集详细介绍:
可以看到RISBUJ六种指令类型,其中
opcode表示操作码 operation code
rd目标寄存器
funct3\7 应该是function的意思,占据3\7位
imm 立即数
rs1 rs2 寄存器一寄存器二
不同的指令类型,立即数存放的位置是不一样的,这对我们之后做立即数扩展至关重要
那么怎么区分不同的指令呢,首先通过opcode分辨出是寄存器型还是立即数型——进一步看fuc3——进一步看fun7这就是译码的过程。
控制模块比较复杂,去看视频