PicoRV32是一个实现RISC-V RV32IMC指令集的CPU内核。它可配置为 RV32E、RV32I、RV32IC、RV32IM 或 RV32IMC 内核,并可选择包含内置中断控制器。
工具(gcc、binutils 等)可以通过RISC-V 网站获取。与 PicoRV32 捆绑在一起的示例期望各种 RV32 工具链安装在/opt/riscv32i[m][c]
.有关详细信息,请参阅下面的构建说明。现在许多 Linux 发行版都包含 RISC-V 工具(例如 Ubuntu 20.04 就有gcc-riscv64-unknown-elf
)。使用相应设置进行编译
TOOLCHAIN_PREFIX
(例如make TOOLCHAIN_PREFIX=riscv64-unknown-elf-
)。
PicoRV32 是根据ISC 许可证 (与 MIT 许可证或 2 条款 BSD 许可证类似的许可证)授权的免费开放硬件。
- 特点和典型应用
- 此存储库中的文件
- Verilog 模块参数
- 每条指令的周期性能
- PicoRV32 本机内存接口
- Pico 协处理器接口 (PCPI)
- IRQ 处理的自定义指令
- 构建纯 RV32I 工具链
- 将二进制文件与 PicoRV32 的 newlib 链接
- 评估:Xilinx 7 系列 FPGA 的时序和使用
- 小型(7 系列 Xilinx 架构中的 750-2000 个 LUT)
- 高 f max(7 系列 Xilinx FPGA 上为 250-450 MHz)
- 可选本机内存接口或 AXI4-Lite 主接口
- 可选的 IRQ 支持(使用简单的自定义 ISA)
- 可选的协处理器接口
该 CPU 旨在用作 FPGA 设计和 ASIC 中的辅助处理器。由于其高 f max,它可以集成到大多数现有设计中,而无需跨时钟域。当在较低频率下运行时,它将具有很大的时序裕度,因此可以在不影响时序收敛的情况下将其添加到设计中。
对于更小的尺寸,可以禁用对寄存器x16
..x31
以及RDCYCLE[H]
、RDTIME[H]
和RDINSTRET[H]
指令的支持,从而将处理器变成 RV32E 内核。
此外,还可以在双端口和单端口寄存器文件实现之间进行选择。前者提供更好的性能,而后者则导致更小的核心。
注意:在专用存储器资源中实现寄存器文件的架构中,例如许多 FPGA,禁用 16 个高位寄存器和/或禁用双端口寄存器文件可能不会进一步减小内核大小。
核心存在三种变体:picorv32
、picorv32_axi
和picorv32_wb
。第一个提供了简单的本机内存接口,易于在简单的环境中使用。picorv32_axi
提供 AXI-4 Lite Master 接口,可轻松与已使用 AXI 标准的现有系统集成。picorv32_wb
提供Wishbone主接口。
提供了一个单独的内核picorv32_axi_adapter
来桥接本机内存接口和 AXI4。该内核可用于创建自定义内核,其中包括一个或多个 PicoRV32 内核以及本地 RAM、ROM 和内存映射外设,使用本机接口相互通信,并通过 AXI4 与外界通信。
可选的 IRQ 功能可用于对来自外部的事件做出反应、实现故障处理程序或捕获来自更大 ISA 的指令并在软件中模拟它们。
可选的 Pico 协处理器接口 (PCPI) 可用于在外部协处理器中实现非分支指令。该软件包中MUL[H[SU|U]]
包含实现 M 标准扩展指令的 PCPI 内核的实现
DIV[U]/REM[U]
。
你现在正在读它。
该 Verilog 文件包含以下 Verilog 模块:
模块 | 描述 |
---|---|
picorv32 |
PicoRV32 CPU |
picorv32_axi |
带 AXI4-Lite 接口的 CPU 版本 |
picorv32_axi_adapter |
从 PicoRV32 内存接口到 AXI4-Lite 的适配器 |
picorv32_wb |
带Wishbone Master接口的CPU版本 |
picorv32_pcpi_mul |
MUL[H[SU|U]] 执行指令的 PCPI 内核 |
picorv32_pcpi_fast_mul |
picorv32_pcpi_fast_mul 使用单周期乘法器的版本 |
picorv32_pcpi_div |
DIV[U]/REM[U] 执行指令的 PCPI 内核 |
只需将此文件复制到您的项目中即可。
一个基本的测试环境。运行以在标准配置下make test
运行标准测试台 ( )。testbench.v
还有其他测试台和配置。有关详细信息,请参阅test_*
Makefile 中的 make 目标。
Run make test_ez
to runtestbench_ez.v
是一个非常简单的测试平台,不需要外部固件 .hex 文件。这在 RISC-V 编译器工具链不可用的环境中非常有用。
注:测试台使用 Icarus Verilog。然而,Icarus Verilog 0.9.7(撰写本文时的最新版本)有一些错误,导致测试平台无法运行。升级到最新的Icarus Verilog github master来运行测试台。
一个简单的测试固件。这会运行一些 C 代码的基本测试tests/
,测试 IRQ 处理和乘法 PCPI 内核。
中的所有代码firmware/
均属于公共领域。只需复制您可以使用的任何内容即可。
来自riscv-tests的简单指令级测试。
另一个运行 Dhrystone 基准测试的简单测试固件。
使用 PicoRV32 的简单示例 SoC,可以直接从内存映射 SPI 闪存执行代码。
适用于不同(综合)工具和硬件架构的各种脚本和示例。
以下 Verilog 模块参数可用于配置 PicoRV32 内核。
此参数启用对RDCYCLE[H]
、RDTIME[H]
和
RDINSTRET[H]
指令的支持。如果ENABLE_COUNTERS
设置为零,该指令将导致硬件陷阱(与任何其他不受支持的指令一样) 。
注意:严格来说RDCYCLE[H]
, 、RDTIME[H]
、 和RDINSTRET[H]
指令对于 RV32I 内核来说不是可选的。但在应用程序代码经过调试和分析后,它们很可能不会被错过。对于 RV32E 内核,此指令是可选的。
此参数启用对RDCYCLEH
、RDTIMEH
和RDINSTRETH
指令的支持。如果该参数设置为 0,则ENABLE_COUNTERS
设置为 1,则只有RDCYCLE
、RDTIME
、 和RDINSTRET
指令可用。
该参数启用对寄存器的支持x16
... x31
RV32E ISA 不包括该寄存器。然而,当代码尝试访问该寄存器时,RV32E ISA 规范需要一个硬件陷阱。 PicoRV32 中未实现此功能。
寄存器堆可以用两个或一个读端口来实现。双端口寄存器文件可以稍微提高性能,但也可以增加内核的大小。
mem_rdata
如果交易后外部电路保持稳定,则将其设置为 1 。在默认配置中,PicoRV32 内核仅期望
mem_rdata
输入在周期内有效,mem_valid && mem_ready
并在内部锁存该值。
该参数仅适用于核心picorv32
。在
picorv32_axi
核心中picorv32_wb
,它被隐式设置为 0。
默认情况下,移位操作分两个阶段进行:首先以 4 位为单位进行移位,然后以 1 位为单位进行移位。这加快了轮班操作,但增加了额外的硬件。将此参数设置为0可禁用两级移位,以进一步减小内核的尺寸。
默认情况下,移位操作是通过连续少量移位来执行的(见TWO_STAGE_SHIFT
上文)。设置此选项后,将使用桶形移位器。
通过添加额外的 FF 级,以向条件分支指令添加额外的时钟周期延迟为代价,稍微放宽了最长的数据路径。
注意:当在综合流程中启用重定时(又名“寄存器平衡”)时,启用此参数将最有效。
这在 ALU 数据路径中添加了一个额外的 FF 级,从而以使用 ALU 的所有指令的额外时钟周期为代价来改善时序。
注意:当在综合流程中启用重定时(又名“寄存器平衡”)时,启用此参数将最有效。
这使得能够支持 RISC-V 压缩指令集。
将其设置为 0 可禁用捕获未对齐内存访问的电路。
将其设置为 0 可禁用捕获非法指令的电路。
将此选项设置为 0 时,内核仍会捕获EBREAK
指令。启用 IRQ 后,anEBREAK
通常会触发 IRQ 1。此选项设置为 0 时,anEBREAK
将捕获处理器而不触发中断。
将其设置为 1 以启用 Pico 协处理器接口 (PCPI)。
该参数在内部启用 PCPI 并实例化picorv32_pcpi_mul
实现MUL[H[SU|U]]
指令的内核。仅当 ENABLE_PCPI 也被设置时,外部 PCPI 接口才起作用。
该参数在内部启用 PCPI 并实例化picorv32_pcpi_fast_mul
实现MUL[H[SU|U]]
指令的内核。仅当 ENABLE_PCPI 也被设置时,外部 PCPI 接口才起作用。
如果同时设置了 ENABLE_MUL 和 ENABLE_FAST_MUL,则 ENABLE_MUL 设置将被忽略,并且快速乘法器核心将被实例化。
该参数在内部启用 PCPI 并实例化picorv32_pcpi_div
实现DIV[U]/REM[U]
指令的内核。仅当 ENABLE_PCPI 也被设置时,外部 PCPI 接口才起作用。
将其设置为 1 以启用 IRQ。 (有关 IRQ 的讨论,请参阅下面的“IRQ 处理的自定义指令”)
将其设置为 0 可禁用对getq
和setq
指令的支持。如果没有 q 寄存器,IRQ 返回地址将存储在 x3 (gp) 中,IRQ 位掩码将存储在 x4 (tp) 中,根据 RISC-V ABI,全局指针和线程指针寄存器。从普通 C 代码生成的代码不会与这些寄存器交互。
当 ENABLE_IRQ 设置为 0 时,对 q 寄存器的支持始终被禁用。
将其设置为 0 以禁用对该timer
指令的支持。
当 ENABLE_IRQ 设置为 0 时,对定时器的支持始终被禁用。
trace_valid
使用和输出端口生成执行跟踪trace_data
。为了演示此功能,请运行make test_vcd
创建跟踪文件,然后运行python3 showtrace.py testbench.trace firmware/firmware.elf
对其进行解码。
将其设置为 1 可将所有寄存器初始化为零(使用 Veriloginitial
块)。这对于模拟或形式验证很有用。
该位掩码中的 1 位对应于永久禁用的 IRQ。
该位掩码中的 1 位表示相应的 IRQ 被“锁定”,即当 IRQ 线仅在一个周期内为高电平时,中断将被标记为挂起并保持挂起状态,直到调用中断处理程序(又名“脉冲中断”)或“边沿触发中断”)。
将此位掩码中的一位设置为 0,以将中断线转换为“电平敏感”中断。
程序的起始地址。
中断处理程序的起始地址。
当此参数的值不同于 0xffffffff 时,寄存器x2
(堆栈指针)在复位时初始化为此值。 (所有其他寄存器保持未初始化状态。)请注意,RISC-V 调用约定要求堆栈指针在 16 字节边界上对齐(RV32I 软浮点调用约定为 4 字节)。
简短提醒:该核心针对尺寸和 f max进行了优化,而不是针对性能进行了优化。
除非另有说明,否则以下数字适用于 ENABLE_REGS_DUALPORT 处于活动状态并连接到可在一个时钟周期内容纳请求的存储器的 PicoRV32。
每条指令的平均周期 (CPI) 约为 4,具体取决于代码中的指令组合。各个指令的 CPI 编号可在下表中找到。 “CPI (SP)”列包含未使用 ENABLE_REGS_DUALPORT 构建的内核的 CPI 编号。
操作说明 | 消费者物价指数 | 消费者物价指数(SP) |
---|---|---|
直接跳转 (jal) | 3 | 3 |
ALU 寄存器 + 立即数 | 3 | 3 |
ALU 寄存器 + 寄存器 | 3 | 4 |
分支(未采取) | 3 | 4 |
内存负载 | 5 | 5 |
记忆库 | 5 | 6 |
分支(已拍摄) | 5 | 6 |
间接跳转(jalr) | 6 | 6 |
轮班操作 | 4-14 | 4-15 |
当ENABLE_MUL
激活时,一条MUL
指令将在 40 个周期内执行,一条MULH[SU|U]
指令将在 72 个周期内执行。
当ENABLE_DIV
激活时,一条DIV[U]/REM[U]
指令将在 40 个周期内执行。
激活后BARREL_SHIFTER
,移位操作所需的时间与任何其他 ALU 操作一样长。
以下 dhrystone 基准测试结果适用于启用了
ENABLE_FAST_MUL
、ENABLE_DIV
和BARREL_SHIFTER
选项的核心。
Dhrystone 基准测试结果:0.516 DMIPS/MHz(908 Dhrystones/秒/MHz)
对于 Dhrystone 基准,平均 CPI 为 4.100。
如果不使用前瞻内存接口(通常需要最大时钟速度),结果会降至 0.305 DMIPS/MHz 和 5.232 CPI。
PicoRV32 的本机内存接口是一种简单的有效就绪接口,一次可以运行一个内存传输:
output mem_valid output mem_instr input mem_ready
output [31:0] mem_addr output [31:0] mem_wdata output [ 3:0] mem_wstrb input [31:0] mem_rdata
output [31:0] mem_addr output [31:0] mem_wdata output [ 3:0] mem_wstrb input [31:0] mem_rdata" tabindex="0" role="button">
内核通过置位 来启动内存传输mem_valid
。有效信号保持高电平,直到对等方断言mem_ready
。在此期间所有核心输出都很稳定mem_valid
。如果内存传输是指令提取,则内核断言mem_instr
。
在读取传输中,mem_wstrb
值为 0 并且mem_wdata
未使用。
存储器读取地址mem_addr
并使读取的值在
mem_rdata
周期为mem_ready
高电平时可用。
不需要外部等待周期。存储器读取可以异步实现,并mem_ready
在与 相同的周期内变为高电平mem_valid
,或者
mem_ready
与常数 1 相关联。
在写入传输中mem_wstrb
不为 0 并且mem_rdata
未被使用。存储器将数据写入mem_wdata
地址mem_addr
并通过置位确认传输mem_ready
。
的 4 位mem_wstrb
是寻址字中四个字节的写使能。只有0000
、 、1111
、1100
、0011
、1000
、0100
、0010
和8 个值0001
是可能的,即分别不写、写 32 位、写高 16 位、写低 16 位或写单个字节。
不需要外部等待周期。存储器可以立即确认写入,并mem_ready
在与 相同的周期内变为高电平
mem_valid
,或者mem_ready
与常数 1 相关联。
PicoRV32 内核还提供“前瞻存储器接口”,该接口比正常接口早一个时钟周期提供有关下一个存储器传输的所有信息。
output mem_la_read
output mem_la_write
output [31:0] mem_la_addr
output [31:0] mem_la_wdata
output [ 3:0] mem_la_wstrb
在变高之前的时钟周期中mem_valid
,该接口将在mem_la_read
或上输出一个脉冲mem_la_write
,以指示下一个时钟周期中读或写事务的开始。
注:信号mem_la_read
、mem_la_write
、 和mem_la_addr
由 PicoRV32 内核内的组合电路驱动。使用前瞻接口可能比使用上述普通存储器接口更难实现时序收敛。
Pico 协处理器接口 (PCPI) 可用于在外部内核中实现非分支指令:
output pcpi_valid
output [31:0] pcpi_insn
output [31:0] pcpi_rs1
output [31:0] pcpi_rs2
input pcpi_wr
input [31:0] pcpi_rd
input pcpi_wait
input pcpi_ready
当遇到不支持的指令并且 PCPI 功能被激活(请参阅上面的 ENABLE_PCPI)时,然后pcpi_valid
被断言,指令字本身在 上输出pcpi_insn
,rs1
和rs2
字段被解码,并且这些寄存器中的值在pcpi_rs1
和上输出pcpi_rs2
。
然后,外部 PCPI 内核可以解码指令、执行指令,并
pcpi_ready
在指令执行完成时断言。可以选择写入pcpi_rd
并pcpi_wr
断言结果值。然后,PicoRV32 内核将对rd
指令字段进行解码,并将值写入pcpi_rd
相应的寄存器。
当 16 个时钟周期内没有外部 PCPI 内核确认该指令时,将引发非法指令异常并调用相应的中断处理程序。需要多个周期来执行指令的 PCPI 内核应pcpi_wait
在指令成功解码后立即断言,并保持断言直至其断言pcpi_ready
。这将防止 PicoRV32 内核引发非法指令异常。
注意:PicoRV32 中的 IRQ 处理功能不遵循 RISC-V 特权 ISA 规范。相反,使用一小组非常简单的自定义指令以最小的硬件开销实现 IRQ 处理。
仅当通过参数启用 IRQ 时,才支持以下自定义指令ENABLE_IRQ
(见上文)。
PicoRV32 内核具有一个内置中断控制器,具有 32 个中断输入。可以通过irq
置位内核输入中的相应位来触发中断。
当中断处理程序启动时,eoi
所处理中断的中断结束 (EOI) 信号变高。eoi
当中断处理程序返回时,信号再次变低。
IRQ 0-2 可以通过以下内置中断源在内部触发:
中断请求 | 中断源 |
---|---|
0 | 定时器中断 |
1 | EBREAK/ECALL 或非法指令 |
2 | 总线错误(未对齐内存访问) |
该中断也可以由外部源触发,例如通过 PCPI 连接的协处理器。
内核有 4 个额外的 32 位寄存器q0 .. q3
,用于 IRQ 处理。当调用 IRQ 处理程序时,寄存器q0
包含返回地址以及q1
要处理的所有 IRQ 的位掩码。这意味着当 中设置了多个位时,对中断处理程序的一次调用需要服务多个 IRQ q1
。
当启用对压缩指令的支持时,当中断的指令是压缩指令时,q0 的 LSB 被设置。如果 IRQ 处理程序想要解码中断指令,则可以使用此方法。
寄存器q2
和q3
未初始化,可在 IRQ 处理程序中保存/恢复寄存器值时用作临时存储。
以下所有指令均编码在custom0
操作码下。所有这些指令中 f3 和 rs2 字段都被忽略。
请参阅firmware/custom_ops.S,了解实现本指令助记符的GNU 汇编器宏。
有关中断处理程序汇编器包装器的示例实现,请参阅固件/start.S ,有关实际中断处理程序的固件/irq.c 。
该指令将值从 q 寄存器复制到通用寄存器。
0000000 ----- 000XX --- XXXXX 0001011
f7 rs2 qs f3 rd opcode
例子:
getq x5, q2
该指令将值从通用寄存器复制到 q 寄存器。
0000001 ----- XXXXX --- 000XX 0001011
f7 rs2 rs f3 qd opcode
例子:
setq q2, x5
从中断中返回。该指令将值复制q0
到程序计数器并重新启用中断。
0000010 ----- 00000 --- 00000 0001011
f7 rs2 rs f3 rd opcode
例子:
retirq
“IRQ Mask”寄存器包含屏蔽(禁用)中断的位掩码。该指令将新值写入 irq 掩码寄存器并读取旧值。
0000011 ----- XXXXX --- XXXXX 0001011
f7 rs2 rs f3 rd opcode
例子:
maskirq x1, x2
处理器在禁用所有中断的情况下启动。
当非法指令或总线错误中断被禁用时,非法指令或总线错误将导致处理器停止。
暂停执行,直到中断变为待处理状态。待处理 IRQ 的位掩码被写入rd
。
0000100 ----- 00000 --- XXXXX 0001011
f7 rs2 rs f3 rd opcode
例子:
waitirq x1
将定时器计数器重置为新值。计数器对时钟周期进行倒计数,并在从 1 转换到 0 时触发定时器中断。将计数器设置为零会禁用定时器。计数器的旧值被写入
rd
。
0000101 ----- XXXXX --- XXXXX 0001011
f7 rs2 rs f3 rd opcode
例子:
timer x1, x2
TL;DR:运行以下命令来构建完整的工具链:
make download-tools
make -j$(nproc) build-tools
riscv-tools构建脚本中的默认设置将构建可以针对任何 RISC-V ISA 的编译器、汇编器和链接器,但这些库是针对 RV32G 和 RV64G 目标构建的。按照以下说明构建针对纯 RV32I CPU 的完整工具链(包括库)。
以下命令将为纯 RV32I 目标构建 RISC-V GNU 工具链和库,并将其安装在/opt/riscv32i
:
# Ubuntu packages needed: sudo apt-get install autoconf automake autotools-dev curl libmpc-dev \ libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \ gperf libtool patchutils bc zlib1g-dev git libexpat1-dev
sudo mkdir /opt/riscv32i sudo chown $USER /opt/riscv32i
git clone https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-rv32i cd riscv-gnu-toolchain-rv32i git checkout 411d134 git submodule update --init --recursive
mkdir build; cd build ../configure --with-arch=rv32i --prefix=/opt/riscv32i make -j$(nproc)
libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo
gperf libtool patchutils bc zlib1g-dev git libexpat1-dev
sudo mkdir /opt/riscv32i sudo chown $USER /opt/riscv32i
git clone https://github.com/riscv/riscv-gnu-toolchain riscv-gnu-toolchain-rv32i cd riscv-gnu-toolchain-rv32i git checkout 411d134 git submodule update --init --recursive
mkdir build; cd build ../configure --with-arch=rv32i --prefix=/opt/riscv32i make -j$(nproc)" tabindex="0" role="button">
这些命令都将使用 prefix 命名riscv32-unknown-elf-
,这样可以轻松地将它们与常规 riscv-tools 并排安装(riscv64-unknown-elf-
默认情况下使用名称前缀)。
或者,您可以简单地使用 PicoRV32 的 Makefile 中的以下 make 目标之一来构建RV32I[M][C]
工具链。您仍然需要安装所有先决条件,如上所述。然后在 PicoRV32 源目录中运行以下任意命令:
命令 | 安装目录 | ISA |
---|---|---|
make -j$(nproc) build-riscv32i-tools |
/opt/riscv32i/ |
RV32I |
make -j$(nproc) build-riscv32ic-tools |
/opt/riscv32ic/ |
RV32IC |
make -j$(nproc) build-riscv32im-tools |
/opt/riscv32im/ |
RV32IM |
make -j$(nproc) build-riscv32imc-tools |
/opt/riscv32imc/ |
RV32IMC |
或者只需运行即可make -j$(nproc) build-tools
构建并安装所有四个工具链。
默认情况下,调用任何这些 make 目标都会(重新)下载工具链源。
提前运行一次make download-tools
下载源。/var/cache/distfiles/
注意:这些说明适用于 riscv-gnu-toolchain 的 git rev 411d134 (2018-02-14)。
工具链(请参阅最后一节的安装说明)附带一个版本的 newlib C 标准库。
使用链接器脚本firmware/riscv.ld将二进制文件链接到newlib 库。使用此链接描述文件将创建一个入口点为 0x10000 的二进制文件。 (默认的链接器脚本没有静态入口点,因此需要一个适当的 ELF 加载器来在加载程序时确定运行时的入口点。)
Newlib 附带了一些系统调用存根。您需要提供您自己的这些系统调用的实现,并将您的程序与此实现链接起来,覆盖 newlib 中的默认存根。请参阅scripts/cxxdemo/syscalls.c
中的
示例来了解如何执行此操作。
以下评估是使用 Vivado 2017.3 进行的。
picorv32_axi
已启用的模块已TWO_CYCLE_ALU
针对所有速度等级的 Xilinx Artix-7T、Kintex-7T、Virtex-7T、Kintex UltraScale 和 Virtex UltraScale 器件进行布局和布线。二分搜索用于查找设计满足时序的最短时钟周期。
请参阅make table.txt
script /vivado/。
设备 | 设备 | 速度等级 | 时钟周期(频率) |
---|---|---|---|
赛灵思 Kintex-7T | xc7k70t-fbg676-2 | -2 | 2.4 纳秒(416 兆赫) |
赛灵思 Kintex-7T | xc7k70t-fbg676-3 | -3 | 2.2 纳秒(454 兆赫) |
赛灵思 Virtex-7T | xc7v585t-ffg1761-2 | -2 | 2.3 纳秒(434 兆赫) |
赛灵思 Virtex-7T | xc7v585t-ffg1761-3 | -3 | 2.2 纳秒(454 兆赫) |
Xilinx Kintex UltraScale | xcku035-fbva676-2-e | -2 | 2.0 纳秒(500 兆赫) |
Xilinx Kintex UltraScale | xcku035-fbva676-3-e | -3 | 1.8 纳秒(555 兆赫) |
赛灵思 Virtex UltraScale | xcvu065-ffvc1517-2-e | -2 | 2.1 纳秒(476 兆赫) |
赛灵思 Virtex UltraScale | xcvu065-ffvc1517-3-e | -3 | 2.0 纳秒(500 兆赫) |
Xilinx Kintex UltraScale+ | xcku3p-ffva676-2-e | -2 | 1.4 纳秒(714 兆赫) |
Xilinx Kintex UltraScale+ | xcku3p-ffva676-3-e | -3 | 1.3 纳秒(769 兆赫) |
Xilinx Virtex UltraScale+ | xcvu3p-ffvc1517-2-e | -2 | 1.5 纳秒(666 兆赫) |
Xilinx Virtex UltraScale+ | xcvu3p-ffvc1517-3-e | -3 | 1.4 纳秒(714 兆赫) |
下表列出了以下三个核心在区域优化综合中的资源利用率:
-
PicoRV32(小):该
picorv32
模块没有计数器指令,没有两级移位,具有外部锁存mem_rdata
,并且不捕获未对齐的内存访问和非法指令。 -
PicoRV32(常规):
picorv32
处于默认配置的模块。 -
PicoRV32(大):
picorv32
启用了 PCPI、IRQ、MUL、DIV、BARREL_SHIFTER 和 COMPRESSED_ISA 功能的模块。
请参阅make area
script /vivado/。
核心变体 | 切片 LUT | LUT 作为内存 | 切片寄存器 |
---|---|---|---|
PicoRV32(小) | 第761章 | 48 | 第442章 |
PicoRV32(常规) | 917 | 48 | 第583章 |
PicoRV32(大) | 2019年 | 88 | 1085 |