cv32e40p系列<1>

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信号定义在配置和接口核心中起着至关重要的作用。

参数

  1. COREV_PULP: 启用 PULP ISA 扩展。这包括自定义的 CSR 和硬件循环功能,但不包括 cv.elw 指令。
  2. COREV_CLUSTER: 激活 PULP 集群接口,包括 cv.elw
  3. FPU: 启用浮点单元,通过 APU 接口进行接口。
  4. FPU_ADDMUL_LAT: 指定浮点加法/乘法通道的流水线寄存器数量。
  5. FPU_OTHERS_LAT: 定义浮点比较/转换通道的流水线寄存器数量。
  6. ZFINX: 启用通用寄存器中的浮点扩展。
  7. 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_icore_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 的接口信号

  1. clk: 时钟信号。它同步核心和 FPU 之间的操作。

  2. apu_req: 从核心到 FPU 的信号,表明有一个执行操作的请求。

  3. apu_operands: 这是一个多位总线,用于从核心携带操作数到 FPU。这个总线的大小由 APU_NARGS_CPU 确定,它指定 FPU 可以接受的参数数量。

  4. apu_op: 该信号携带代表 FPU 应执行的特定操作的操作码(opcode)。这个信号的宽度由 APU_WOP_CPU 定义。

  5. apu_flags: 这些是从核心发送到 FPU 的附加标志,表明操作的特定条件或模式。标志的数量由 APU_NDSFLAGS_CPU 确定。

FPU 到核心的接口信号

  1. apu_gnt: 从 FPU 到核心的授权信号。它表明 FPU 已接受操作请求。

  2. apu_rvalid: 该信号表明 FPU 的结果已经准备好并且有效。

  3. apu_rdata: FPU 操作的结果数据通过这个 32 位的总线发送回核心。

  4. apu_rflags: 类似于 apu_flags,这些是从 FPU 到核心的结果标志,指示操作结果的各种状态或条件。这个总线的宽度由 APU_NUSFLAGS_CPU 定义。

功能和集成

  • 当核心需要执行浮点操作时,它通过在 apu_operandsapu_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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值