RISC-V技术论坛
直播中

klysa

14年用户 1336经验值
私信 关注
[问答]

e203添加中断源,中断源无法使能怎么解决?

大家好:
    硬件平台为arty a7,我们给E203添加了一个以太网外设,按照顺序把中断源设置为53号,可是发现外设的确产生了中断信号(边沿),可是plic模块的plic_ext_irq并没有被拉高。
    担心是由于添加中断的时候plic模块的修改有问题,我们直接把52号中断(IIC),接到了以太网外设的中断信号上,发现plic模块的plic_ext_irq还是没有被拉高。
    我们在对应的c程序中读了一下发现,虽然我们调用了中断使能函数,可是读回来的plic对应中断源的中断使能寄存器还是0。不知道是为什么?有人遇到同样的问题吗,PLIC中断源使能无效。
    我们最后把button 2对应的中断接口连到了以太网外设上(39号),发现这次就可以使能中断源了?真的好奇怪,现在在阅读plic_man的源码,希望能发现原因吧。最后版本的C和verilog代码。

// platform.h#define PLIC_INT_EMAC_BASE   39  // TODO: add plic_int_emac_base#define PLIC_NUM_INTERRUPTS 54 // TODO: change 52 to 54// main.cvoid register_plic_irqs (){   /**************************************************************************   * Set up the PLIC   *   *************************************************************************/  PLIC_init( g_plic,            PLIC_CTRL_ADDR,            PLIC_NUM_INTERRUPTS,            PLIC_NUM_PRIORItiES);  for (int ii = 0; ii < PLIC_NUM_INTERRUPTS; ii ++){    g_ext_interrupt_handlers[ii] = no_interrupt_handler;  }  g_ext_interrupt_handlers[PLIC_INT_EMAC_BASE] = emac_re_handler;  g_ext_interrupt_handlers[PLIC_INT_DEVICE_BUTTON_1] = button_1_handler;  PLIC_enable_interrupt ( g_plic, PLIC_INT_EMAC_BASE);  PLIC_enable_interrupt ( g_plic, PLIC_INT_DEVICE_BUTTON_1);  PLIC_set_priority( g_plic, PLIC_INT_EMAC_BASE, 1);  PLIC_set_priority( g_plic, PLIC_INT_DEVICE_BUTTON_1, 1);}

// e203_subsys_plic.vwire plic_irq_i_38 = ip2intc_irpt;


                                                                                

回帖(1)

硕达科讯

2025-11-11 18:18:46

针对您在添加中断源时遇到的PLIC中断使能问题,以下是系统的解决方案和排查步骤:




1. 核心问题定位



  • 现象:中断使能寄存器无法置位,PLIC未收到中断信号。

  • 根本原因

    • PLIC寄存器地址计算错误(尤其是多上下文场景)。

    • 顶层模块中断信号连接错误。

    • 中断触发方式冲突(PLIC仅支持电平触发)。

    • 全局中断未开启或优先级设置缺失。





2. 硬件连接排查


(1) 中断信号连接


在SoC顶层模块(如e203_soc_top.v)中,确保PLIC中断输入正确映射:


// 示例:将中断53连接到PLIC
e203_plic_top u_plic (
    .int_src    ({..., eth_irq, ...}),  // 确保eth_irq在53位置
    ...
);


  • 验证:确认PLIC输入信号列表长度覆盖新中断号(如53)。

  • 调试建议:使用SignalTap或仿真检查int_src[53]是否随外设中断触发变化。


(2) 中断触发方式



  • 关键点:PLIC仅支持高电平触发,非边沿触发。


  • 解决方案


    // 将边沿中断转换为电平信号
    reg eth_irq_level;
    always @(posedge eth_irq_edge) begin
      eth_irq_level <= 1'b1;    // 中断到来拉高
    end

    // 中断处理完成后由软件清除电平
    assign eth_irq_to_plic = eth_irq_level;


    • 外设需提供中断状态寄存器,供软件清除中断源电平。






3. 软件配置纠正


(1) 中断使能寄存器地址


PLIC上下文偏移计算(以HART 0 M模式为例):


#define PLIC_BASE        0x0C000000
#define PLIC_ENABLE_OFFSET  0x2080   // 上下文0使能寄存器偏移

void enable_plic_irq(int irq_num) {
    uint32_t *enable_reg = (uint32_t*)(PLIC_BASE + PLIC_ENABLE_OFFSET + (irq_num/32)*4);
    uint32_t mask = 1 << (irq_num % 32);
    *enable_reg |= mask;  // 写使能位
}


  • 验证:读取enable_reg的值,确认目标bit被置1。


(2) 优先级与阈值设置


// 设置中断优先级(>0)
volatile uint32_t *priority_reg = (uint32_t*)(PLIC_BASE + 4 * irq_num);
*priority_reg = 1;  // 优先级至少为1

// 设置M模式阈值
volatile uint32_t *threshold_reg = (uint32_t*)(PLIC_BASE + 0x200000);
*threshold_reg = 0;  // 阈值=0允许所有中断

(3) 全局中断使能


在startup代码中开启全局中断:


csrr a0, mstatus
ori a0, a0, 0x8   // 置位MIE位
csrw mstatus, a0



4. PLIC内部信号检查


在PLIC RTL中(e203_plic_top.v)添加调试逻辑:


// 监视中断53的状态
always @(posedge clk) begin
    if (int_src[53] && gw_enable[53] && (gw_priority[53] > threshold))
        $display("IRQ53 triggered at %t", $time);
end


  • 关键信号

    • int_src[53]:中断输入信号。

    • gw_enable[53]:内部使能状态。

    • plic_irq:最终输出到CPU的中断信号。





5. 软件处理流程


(1) 中断服务例程(ISR)


void irq_handler() {
    uint32_t irq_id = *((volatile uint32_t*)(PLIC_BASE + 0x200004)); // Claim中断
    switch(irq_id) {
        case 53: handle_eth_irq(); break;
    }
    *((volatile uint32_t*)(PLIC_BASE + 0x200004)) = irq_id; // Complete中断
}

(2) 清除外设中断


void handle_eth_irq() {
    eth_regs->STATUS = ETH_IRQ_PENDING; // 写1清除外设中断标志
    eth_irq_level = 0;                  // 清除电平信号(若硬件转换)
}



6. 验证步骤



  1. 寄存器写入验证

    • 在写PLIC寄存器后立即读取,确认值正确。


  2. 中断信号传递

    • 仿真中检查int_src[53]plic_gatewayplic_irq信号链。


  3. 中断响应

    • CPU收到中断后跳转至ISR,并正确读取Claim值。





通过以上步骤,重点排查地址计算错误电平转换缺失上下文偏移问题,即可解决中断无法使能的问题。实际开发中建议结合仿真波形(如VCS/Icarus)和硬件调试器(如JTAG)进行联合验证。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分