Picorv32学习


基本特性介绍

Picorv32 是一个基于RISCV基本指令级设计的一个CPU内核,它能实现RV32E, RV32I, RV32IC, RV32IM,或RV32IMC多种核心配置,还支持内部中断控制。这个内核有一下几种特征

  • 门数少,占用的硬件资源少。(在7系列的Xlinx的FPGA中,综合后仅占用750~2000 个LUT)
  • 可以工作在较高的频率。在7系列FPGA上,可以支持高达750MHz的时钟频率。
  • 可选本地内存接口和轻量级AXI4 master总线
  • 可选的终端请求
  • 可选多核处理接口
  • 在使用的时候,由于整个内核只有一个时钟域,它能很方便地嵌入整个SOC,而且能在非常低的频率下工作。

在整个内核结构中,单个picorv32.v实现了整个RISCV内核,我们可以在这个文件中方便配置内核,以满足自己的要求。

1 EN_COUNTERS (default = 1)

使能RDCYCLE[H], RDTIME[H], 和RDINSTRET[H]指令

2 EN_COUNTERS64 (default = 1)

使能RDCYCLEH, RDTIMEH, RDINSTRETH指令。 如果EN_COUNTERS64=0, EN_COUNTERS=1, 系统仅支持RDCTCLE, RDTIME, RDINSTRET指令。

3 ENABLE_REGS_16_31 (default = 1)

使能寄存器的高16位x16..x31,将其设置为0,可以实现RV32E ISA。然而,在RV32E ISA spec中,当处理器想要获取这些地址的信息时,会进入一个硬件的死循环,而在Picorv32中没有实现。

4 ENABLE_REGS_DUALPORT (default = 1)

我们可以通过这个设置处理器从内存中取数据的端口数量,内存接口通常有单端和双端的区别。双端口的内存端口可以提高内存的访问速率,从而提高降低内存访问延迟。如果配置成双端口的接口,会增大芯片的面积。

5 LATCHED_MEM_RDATA (default = 0 )

LATCHED_MEM_RDATA = 1时,在经历过一次数据传输后,mem_rdata 寄存器中的数据将会保持下去。在默认配置中,Picorv32只期望在 mem_valid && mem_ready = 1mem_rdata有效,并且从内部锁定当前值。这个配置在picorv32核内有效,在picorv32_axipicorv32_wb核中会隐含置为0。

6 TWO_STAGE_SHIFT (default = 1 )

在默认情况下,移位操作被拆分成了两个步骤:首先是以4bit为一个单位进行移位,接着1bit一个单位进行移位。这样能提高移位速率,但同时增加了硬件开销。我们可以把它设置成零,从而进一步减小芯片的面积。

7 BARREL_SHIFTER (default =0 )

默认的的移位操作是是将移位分解为多个较小的移位来实现的(如TWO_STAGE_SHIFT中描述的)。当它设置为1时,移位操作可以一步到位。

8 TWO_CYCLE_COMPARE (default = 0)

通过在最长的数据传输路径中添加额外的边沿触发器,将其分为两个时钟周期实现数据传输,保证数据传输可靠性。

Note: Enabling this parameter will be most effective when retiming (aka"register balancing") is enabled in the synthesis flow.

9 TWO_CYCLE_ALU (default = 0)

在ALU的数据路径中插入边沿触发器, 改善所有指令使用ALU的时间开销。

Note: Enabling this parameter will be most effective when retiming (aka "register balancing") is enabled in the synthesis flow.

10 COMPRESSED_ISA (default =0 )

使能RISC-V 压缩指令集。(dhrystone测试的时候,需要将其配置为1)

11 CATCH_MISALIGN (default = 1)

将其设置为0可以禁用捕获非对齐内存读取电路。

12 CATCH_ILLINSN (default = 1)

设置为0禁用捕获非法指令的电路

将其设置为0时,此核心仍然会进入 EBREAK指令的死循环中。当使能IRQs时,正常状态下CATCH_ILLINSN =1,EBREAK会触发 IRQ 1。而将其设置为0时,EBREAK将不会触发系统中断。

13 ENABLE_PCPI (default = 0)

使能多核处理接口。

14 ENABLE_MUL (default = 0)

使能PCPI,并且实例化 picorv32_pcpi_mul核,实现MUL[H[SU|U]]指令。当ENABEL_PCPI=1时,外部的PCPI总线才会有效。

15 ENABLE_FAST_MUL (default =0 )

使能PCPI,并且实例化 picorv32_pcpi_fast_mul核,实现MUL[H[SU|U]]指令。当ENABEL_PCPI=1时,外部的PCPI总线才会有效。当ENABLE_MUL 和 ENABLE_FAST_MUL都设置为1时,ENABLE_MUL将会被忽略。

16 ENABLE_DIV (default = 0)

使能PCPI,并且实例化 picorv32_pcpi_div核,实现DIV[U]/REM[U]`指令。当ENABEL_PCPI=1时,外部的PCPI总线才会有效。

17 ENABLE_IRQ (default = 0)

使能IRQs.

18 ENABLE_IRQ_QREGS (default = 1)

设置为0禁止对getqsetq指令的支持。根据RISC-V ABI,当没有q寄存器时,irq返回地址将会被存储在x3(gp)x4的IRQ bitmask,全局指针和线程指针寄存器。由普通C语言生成的代码将不会与以上的寄存器发生交互。

当ENABLE_IRQ = 0 时, q寄存器默认无效。

19 ENABLE_IRQ_TIMER (default = 1)

设置为0, 可以禁用timer指令。

当ENABLE_IRQ = 0 时,timer寄存器默认无效。

20 ENABLE_TRACE (default = 0)

使用trace_validtrace_data输出端口生成执行跟踪。使用make test_vcd可以生成跟踪文件*.trace,再执行 python3 showtrace.py testbench.trace firmware/firmware.elf 进行解码。

21 REGS_INIT_ZERO (default = 0)

设置为1可以初始化所以的寄存器为0 (使用 Verilog 的 initial 块)。

22 MASKED_IRQ (default = 32'h 0000_0000) 这个位掩码中的1位对应一个永久禁用的IRQ。

23 LATCHED_IRQ (default = 32'h ffff_ffff)

位掩码中的一位对应一个IRQ 被锁定。 例如,当IRQ线只有一个周期是高电平时,中断将被标记为挂起,并一直挂起,直到中断处理程序被调用(又名“脉冲中断”或“边缘触发中断”)。

设置位掩码其中一位为0, 可以对应设置中断线工作在电平敏感型中断模式。

24 PROGADDR_RESET (default = 32'h 0000_0000)

程序的起始地址。

25 PROGADDR_IRQ (default = 32'h 0000_0010)

中断句柄的起始地址。

26 STACKADDR (default = 32'h ffff_ffff)

当这个参数有一个不同于0xffffffff的值时,那么寄存器x2(堆栈指针)在重置时被初始化为这个值。(所有其他寄存器保持未初始化。)注意,RISC-V调用约定要求堆栈指针按16字节边界对齐(RV32I软浮点调用约定为4字节)。


文章作者: elike
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 elike !
评论
 上一篇
开关电容放大器噪声计算 开关电容放大器噪声计算
开关电容放大器噪声计算(基于Trevor Caldwell提出的计算方法)
2021-09-25
下一篇 
Superconducting quantum processor Superconducting quantum processor
A major milestone along the way is the demonstration of quantum computational advantage, which is known as quantum supremacy. It is defined by a quantum device that can implement a well-defined task overwhelmingly faster than any classic computer to an extent that no classical computer can complete the task within a reasonable amount of time.
  目录