RISC-V学习笔记(六):RISC-V的功能实现详解之译码

前提

RISC-V实践部分我们使用的是三级流水,包含了取指、译码和执行三个步骤。

tinyriscv的流水线结构图:

1.译码 

tinyriscv整体框架图:

 对比tinyriscv的流水线结构图和tinyriscv整体框架图,译码实际涉及到id.v(译码)模块、id_ex(流水线寄存器)模块,clint.v(中断)模块和csr_reg.v(CSR寄存器)模块控制这两个模块是用于例外中断的和特权架构的、ctrl.v(控制单元)模块是实行产生暂停流水线、跳转等控制信号。

C源代码到可运行程序的过程:

注释:译码就是将汇编转换成机器语言,懂吧我想去阿根廷去找梅西所以带了个翻译员来帮助我能听懂梅西在讲什么(我是梅西球迷)。涉及到RISC-V的汇编知识,请大家移步去看我的其他文章对RISC-V的汇编知识有了解再回来。 

1. id.v(纯组合逻辑电路)

1.1功能

1.根据指令,翻译出是哪一条指令。

2.根据指令,确定涉及到寄存器。读寄存器是一个还是两个,是否需要写寄存器以及写哪一个寄存器。

3.访问通用寄存器,得到要读的寄存器的值(访存,但其实tinyriscv是不涉及访存的)。

1.2输入输出信号
序号信号名输入/输出位宽(bits)
1rst输入1复位信号
2inst_i输入32指令内容,来源于if_id.v的inst_o
3inst_addr_i输入32指令地址,来源于if_id.v的inst_addr_o
4reg1_rdata_i输入32寄存器1输入数据,来源于regs.v的rdata1_o
5reg2_rdata_i输入32寄存器2输入数据,来源于regs.v的rdata2_o
6csr_rdata_i输入32

CSR寄存器输入数据,来源于csr_reg.v的data_o

7ex_jump_flag_i输入1跳转信号,来源于ex.v的jump_flag_o
8reg1_raddr_o输出5读寄存器1地址,输出到regs.v
9reg2_raddr_o输出5读寄存器2地址,输出到regs.v
10csr_raddr_o输出32读CSR寄存器地址,输出到csr_reg.v
11inst_o输出32指令内容,输出到id_ex.v的
12inst_addr_o输出32指令地址,输出到id_ex.v的inst_addr_i
13reg1_rdata_o输出32通用寄存器1数据,输出到id_ex.v的reg1_rdata_i
14reg2_rdata_o输出32通用寄存器2数据,输出到id_ex.v的reg2_rdata_i
15reg_we_o输出1

通用寄存器写使能,输出到id_ex.v的reg_we_i

16reg_waddr_o输出5通用寄存器写地址,输出到id_ex.v的reg_waddr_i
17csr_we_o输出1CSR寄存器写使能,输出到id_ex.v的csr_we_i
18csr_rdata_o输出32CSR寄存器读数据,输出到id_ex.v的csr_rdata_i
19csr_waddr_o输出32CSR寄存器写地址,输出到id_ex.v的csr_waddr_i
1.3代码注释

来自项目作者的解释:

注释:根据RISC-V的6种基本指令集格式我们就可以精确定位到我们需要的指令类型,再根据操作码就可以精确定位到我们需要的指令。

 2.id_ex.v(时序逻辑电路)

2.1功能

 进行了译码后的信号向执行模块传递

2.2输入输出信号
序号信号名输入/输出位宽(bits)说明
1

clk

输入1时钟输入信号
2

rst

输入1复位输入信号
3

inst_i

输入32

指令内容,来源于id.v的inst_o

4inst_addr_i输入32指令地址,来源于id.v的inst_addr_o
5reg_we_i输入1

写通用寄存器标志,来源于id.v的reg_we_o

6reg_waddr_i输入5

写通用寄存器地址,来源于id.v的reg_waddr_o

7reg1_rdata_i输入32

通用寄存器1读数据,来源于id.v的reg1_rdata_o

8reg2_rdata_i输入32

通用寄存器2读数据,来源于id.v的reg2_rdata_o

9csr_we_i输入1

写CSR寄存器标志,来源于id.v的id_csr_we_o

10csr_waddr_i输入32

写CSR寄存器地址,来源于id.v的csr_waddr_o

11csr_rdata_i输入32

CSR寄存器读数据,来源于id.v的id_csr_rdata_o

12hold_flag_i输入3

流水线暂停标志,来源于ctrl.v的hold_flag_o

13inst_o输出32

指令内容,输出到ex.v的inst_i

14inst_addr_o输出32

指令地址,输出到ex.v的inst_addr_i

15reg_we_o输出1

写通用寄存器标志,输出到ex.v的reg_we_i

16reg_waddr_o输出5

写通用寄存器地址,输出到ex.v的reg_waddr_i

17reg1_rdata_o输出32

通用寄存器1读数据,输出到ex.v的reg1_rdata_i

18reg2_rdata_o输出32

通用寄存器2读数据,输出到ex.v的reg2_rdata_i

19csr_we_o输出1

写CSR寄存器标志,输出到ex.v的csr_we_i

20csr_waddr_o输出32

写CSR寄存器地址,输出到ex.v的csr_waddr_i

21csr_rdata_o输出32

CSR寄存器读数据,输出到ex.v的csr_rdata_i

2.3代码注释

gen_pipe_dff #(32) inst_ff(clk, rst, hold_en, `INST_NOP, inst_i, inst);

注释:D触发器的例化啊,实现将输入的信号打一拍后再输出到执行模块(ex.v)的功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值