Open cisen opened 3 years ago
1.支持RV32IM指令集,通过RISC-V指令兼容性测试;
2.采用三级流水线,即取指,译码,执行;
3.可以运行C语言程序;
4.支持JTAG,可以通过openocd读写内存(在线更新程序);
5.支持中断;
6.支持总线;
7.支持FreeRTOS;
GPIO为什么要做特殊处理?有哪些特色的地方?
timer是做什么的?
pc寄存器有什么作用?
CpuResetAddr 32'h0
if_id有什么用?
触发器(Flip-Flop)是什么?
译码是如何实现的?
执行是如何实现的? 执行模块所在的源文件:rtl/core/ex.v
执行(ex)模块是一个纯组合逻辑电路,主要作用有以下几点: 1.根据当前是什么指令执行对应的操作,比如add指令,则将寄存器1的值和寄存器2的值相加。 2.如果是内存加载指令,则读取对应地址的内存数据。 3.如果是跳转指令,则发出跳转信号。 执行模块的输入输出信号如下表所示:
下面以add指令为例说明,add指令的作用就是将寄存器1的值和寄存器2的值相加,最后将结果写入目的寄存器。代码如下:
`INST_TYPE_R_M: begin if ((funct7 == 7'b0000000) || (funct7 == 7'b0100000)) begin case (funct3) `INST_ADD_SUB: begin jump_flag = `JumpDisable; hold_flag = `HoldDisable; jump_addr = `ZeroWord; mem_wdata_o = `ZeroWord; mem_raddr_o = `ZeroWord; mem_waddr_o = `ZeroWord; mem_we = `WriteDisable; if (inst_i[30] == 1'b0) begin reg_wdata = reg1_rdata_i + reg2_rdata_i; end else begin reg_wdata = reg1_rdata_i - reg2_rdata_i; end ... end
第2~4行,译码操作。 第5行,对add或sub指令进行处理。 第6~12行,当前指令不涉及到的操作(比如跳转、写内存等)需要将其置回默认值。 第13行,指令编码中的第30位区分是add指令还是sub指令。0表示add指令,1表示sub指令。 第14行,执行加法操作。 第16行,执行减法操作。
取完指令是如何过度到执行指令的?
always @ (*) begin
乘法是如何实现的?如何重复调用加法器?
INST_TYPE_R_M
INST_MUL
INST_MULHU
INST_MULH
INST_MULHSU
除法是如何实现的?
固化后如何输入一堆指令?
多条指令执行以默认自动+4?pc_o <= pc_o + 4'h4;
pc_o <= pc_o + 4'h4;
https://github.com/cisen/sourcecode-tinyriscv-zynq-00/tree/main/blog
总结
1.支持RV32IM指令集,通过RISC-V指令兼容性测试;
2.采用三级流水线,即取指,译码,执行;
3.可以运行C语言程序;
4.支持JTAG,可以通过openocd读写内存(在线更新程序);
5.支持中断;
6.支持总线;
7.支持FreeRTOS;
GPIO
问答
GPIO为什么要做特殊处理?有哪些特色的地方?
timer是做什么的?
pc寄存器有什么作用?
CpuResetAddr 32'h0
if_id有什么用?
触发器(Flip-Flop)是什么?
译码是如何实现的?
执行是如何实现的? 执行模块所在的源文件:rtl/core/ex.v
执行(ex)模块是一个纯组合逻辑电路,主要作用有以下几点: 1.根据当前是什么指令执行对应的操作,比如add指令,则将寄存器1的值和寄存器2的值相加。 2.如果是内存加载指令,则读取对应地址的内存数据。 3.如果是跳转指令,则发出跳转信号。 执行模块的输入输出信号如下表所示:
下面以add指令为例说明,add指令的作用就是将寄存器1的值和寄存器2的值相加,最后将结果写入目的寄存器。代码如下:
第2~4行,译码操作。 第5行,对add或sub指令进行处理。 第6~12行,当前指令不涉及到的操作(比如跳转、写内存等)需要将其置回默认值。 第13行,指令编码中的第30位区分是add指令还是sub指令。0表示add指令,1表示sub指令。 第14行,执行加法操作。 第16行,执行减法操作。
取完指令是如何过度到执行指令的?
always @ (*) begin
监控所有电平变化,每次变化就执行一次always乘法是如何实现的?如何重复调用加法器?
INST_TYPE_R_M
,指令是:INST_MUL
,INST_MULHU
,INST_MULH
,INST_MULHSU
除法是如何实现的?
固化后如何输入一堆指令?
多条指令执行以默认自动+4?
pc_o <= pc_o + 4'h4;