rtl/cv32e40p_top.sv
// https://github.com/openhwgroup/cv32e40p/tree/master:94acfbf
module cv32e40p_top #(
parameter COREV_PULP = 0, // PULP ISA Extension (incl. custom CSRs and hardware loop, excl. cv.elw)
parameter COREV_CLUSTER = 0, // PULP Cluster interface (incl. cv.elw)
parameter FPU = 0, // Floating Point Unit (interfaced via APU interface)
parameter FPU_ADDMUL_LAT = 0, // Floating-Point ADDition/MULtiplication computing lane pipeline registers number
parameter FPU_OTHERS_LAT = 0, // Floating-Point COMParison/CONVersion computing lanes pipeline registers number
parameter ZFINX = 0, // Float-in-General Purpose registers
parameter NUM_MHPMCOUNTERS = 1
) (
// Clock and Reset
input logic clk_i,
input logic rst_ni,
input logic pulp_clock_en_i, // PULP clock enable (only used if COREV_CLUSTER = 1)
input logic scan_cg_en_i, // Enable all clock gates for testing
// Core ID, Cluster ID, debug mode halt address and boot address are considered more or less static
input logic [31:0] boot_addr_i,
input logic [31:0] mtvec_addr_i,
input logic [31:0] dm_halt_addr_i,
input logic [31:0] hart_id_i,
input logic [31:0] dm_exception_addr_i,
// Instruction memory interface
output logic instr_req_o,
input logic instr_gnt_i,
input logic instr_rvalid_i,
output logic [31:0] instr_addr_o,
input logic [31:0] instr_rdata_i,
// Data memory interface
output logic data_req_o,
input logic data_gnt_i,
input logic data_rvalid_i,
output logic data_we_o,
output logic [ 3:0] data_be_o,
output logic [31:0] data_addr_o,
output logic [31:0] data_wdata_o,
input logic [31:0] data_rdata_i,
// Interrupt inputs
input logic [31:0] irq_i, // CLINT interrupts + CLINT extension interrupts
output logic irq_ack_o,
output logic [ 4:0] irq_id_o,
// Debug Interface
input logic debug_req_i,
output logic debug_havereset_o,
output logic debug_running_o,
output logic debug_halted_o,
// CPU Control Signals
input logic fetch_enable_i,
output logic core_sleep_o
);
cv32e40p_top
模块是基于 RISC-V 架构的 CV32E40P 核心的顶层模块,这是一个高性能的32位嵌入式处理器。这个模块的参数和I/O信号定义在配置和接口核心中起着至关重要的作用。
参数
COREV_PULP
: 启用 PULP ISA 扩展。这包括自定义的 CSR 和硬件循环功能,但不包括cv.elw
指令。COREV_CLUSTER
: 激活 PULP 集群接口,包括cv.elw
。FPU
: 启用浮点单元,通过 APU 接口进行接口。FPU_ADDMUL_LAT
: 指定浮点加法/乘法通道的流水线寄存器数量。FPU_OTHERS_LAT
: 定义浮点比较/转换通道的流水线寄存器数量。ZFINX
: 启用通用寄存器中的浮点扩展。NUM_MHPMCOUNTERS
: 设置机器硬件性能监视计数器的数量。
I/O 信号
时钟和复位
clk_i
,rst_ni
: 标准时钟和低电平有效复位。pulp_clock_en_i
: PULP的时钟使能,仅在启用COREV_CLUSTER
时相关。scan_cg_en_i
: 用于测试以启用所有时钟门。
核心配置
boot_addr_i
,mtvec_addr_i
,dm_halt_addr_i
,hart_id_i
,dm_exception_addr_i
: 这些输入提供了如引导地址、机器陷阱向量基地址、调试模块停止地址、硬件线程 ID 和调试模块异常地址等重要的静态信息。
指令内存接口
- 这组信号(
instr_req_o
,instr_gnt_i
等)管理着从指令内存中取出指令的过程。
数据内存接口
- 与指令内存接口类似,但用于数据。它包括读/写操作、数据地址和数据传输的信号。
中断
irq_i
,irq_ack_o
,irq_id_o
: 管理中断,包括确认和识别。
调试接口
- 这些信号(
debug_req_i
,debug_havereset_o
等)用于调试目的,指示诸如重置、运行或停止等状态。
CPU 控制信号
fetch_enable_i
和core_sleep_o
控制取指过程和核心的睡眠模式。
使用
这个模块封装了 CV32E40P 处理器的核心功能,包括内存接口、调试和处理中断。参数允许进行相当大的定制,根据嵌入式应用的要求启用或禁用诸如 FPU 或 PULP 特定扩展等功能。
将此模块集成到更大的系统中时,正确配置这些参数并确保所有I/O信号正确连接到系统的其余部分,如内存控制器、外围设备和调试工具,至关重要。为了可靠的操作,与系统的时钟和复位信号正确同步也非常重要。
import cv32e40p_apu_core_pkg::*;
// Core to FPU
logic clk;
logic apu_req;
logic [ APU_NARGS_CPU-1:0][31:0] apu_operands;
logic [ APU_WOP_CPU-1:0] apu_op;
logic [APU_NDSFLAGS_CPU-1:0] apu_flags;
// FPU to Core
logic apu_gnt;
logic apu_rvalid;
logic [ 31:0] apu_rdata;
logic [APU_NUSFLAGS_CPU-1:0] apu_rflags;
核心到 FPU 的接口信号
-
clk
: 时钟信号。它同步核心和 FPU 之间的操作。 -
apu_req
: 从核心到 FPU 的信号,表明有一个执行操作的请求。 -
apu_operands
: 这是一个多位总线,用于从核心携带操作数到 FPU。这个总线的大小由APU_NARGS_CPU
确定,它指定 FPU 可以接受的参数数量。 -
apu_op
: 该信号携带代表 FPU 应执行的特定操作的操作码(opcode)。这个信号的宽度由APU_WOP_CPU
定义。 -
apu_flags
: 这些是从核心发送到 FPU 的附加标志,表明操作的特定条件或模式。标志的数量由APU_NDSFLAGS_CPU
确定。
FPU 到核心的接口信号
-
apu_gnt
: 从 FPU 到核心的授权信号。它表明 FPU 已接受操作请求。 -
apu_rvalid
: 该信号表明 FPU 的结果已经准备好并且有效。 -
apu_rdata
: FPU 操作的结果数据通过这个 32 位的总线发送回核心。 -
apu_rflags
: 类似于apu_flags
,这些是从 FPU 到核心的结果标志,指示操作结果的各种状态或条件。这个总线的宽度由APU_NUSFLAGS_CPU
定义。
功能和集成
- 当核心需要执行浮点操作时,它通过在
apu_operands
和apu_op
上分别放置操作数和操作码,然后断言apu_req
来设置操作。 - FPU 在识别到请求后,断言
apu_gnt
以确认它。 - 处理完毕后,FPU 将结果放在
apu_rdata
上,并断言apu_rvalid
表明结果已准备好。 - 核心从
apu_rdata
读取结果,并注意apu_rflags
上的任何标志。
// Instantiate the Core
cv32e40p_core #(
.COREV_PULP (COREV_PULP),
.COREV_CLUSTER (COREV_CLUSTER),
.FPU (FPU),
.FPU_ADDMUL_LAT (FPU_ADDMUL_LAT),
.FPU_OTHERS_LAT (FPU_OTHERS_LAT),
.ZFINX (ZFINX),
.NUM_MHPMCOUNTERS(NUM_MHPMCOUNTERS)
) core_i (
.clk_i (clk_i),
.rst_ni(rst_ni)