最近在安路的FPGA上跑RISC-V软核,外设中断一直进不去,软件里中断使能也开了,寄存器也配了,但就是触发不了。有没有大佬遇到过类似问题?从硬件到软件,排查顺序应该怎么走?是先查中断引脚约束还是先查CPU核的中断控制器配置?求一个系统的排查思路。
2026年了,FPGA工程师用国产安路FPGA做RISC-V软核,外设中断老是进不去,排查顺序是什么?
4 个回答

先别急着翻软件,建议按物理信号流动的顺序来。第一步看安路工程的引脚约束,确认外设中断脚和软核的中断输入脚在同一个bank、电平标准一致,而且没被复用成普通IO。第二步用ILA挂在软核的中断请求总线上,看这个信号到底有没有从外设走到CPU核的入口。如果ILA里能看到脉冲,但CPU就是没反应,那问题基本在PLIC或者CLINT的配置上;如果ILA里压根没信号,那就是引脚约束或者外设中断源没使能。软件和寄存器配置反而该放最后查,因为安路配套的软核SDK一般会把中断向量表初始化好,出错概率相对低。你用的是安路自带的软核IP还是自己移植的香山或者蜂鸟E203?这个对排查路径影响挺大的。

我之前在安路平台上踩过类似的坑,给你说个容易被忽略的点:先确认你的软核中断是「边沿触发」还是「电平触发」。很多RISC-V软核默认要求电平触发,但外设寄存器配出来的是脉冲,那就永远进不去。排查顺序上,我自己的习惯是先看硬件链路再碰软件:第一步用ILA抓外设中断源输出,确认信号确实产生了;第二步看它有没有进到CPU核的中断输入引脚,这里要注意安路FPGA的引脚约束里有没有误加IOSTANDARD或上下拉,有时候综合器会悄悄把信号优化掉;第三步才轮到PLIC,重点看每个中断源的pending位有没有置1,如果pending是1但never置位,那通常是优先级寄存器或者使能寄存器没写对;最后再查软件的中断服务程序地址,确认链接脚本里向量表基址和CPU核取指地址一致。另外有个小技巧,安路的在线逻辑分析仪可以直接挂到PLIC的输入输出上,比反复改代码快得多。你用的是哪个型号的安路芯片?不同系列的软核集成方式差别挺大。

顺着你的描述捋一下,我觉得最关键的是先建立「信号链路」的概念,而不是一上来就分硬件还是软件。RISC-V软核的中断路径本质上是:外设产生中断请求,经过引脚或内部互联进入CPU核的中断控制器(PLIC或CLINT),再由核内的CSR寄存器决定是否跳转到异常向量地址。你提到寄存器也配了但进不去,这恰恰说明问题可能出在「信号是否真的到达」这一层,而不是配置逻辑本身。
我建议的排查主线是:第一,用ILA抓外设的中断源输出信号,确认它确实在电平或脉冲上满足软核的要求。这一步能排除「外设根本没产生中断」的可能性,比如某些外设的中断使能位在复位后默认关闭,或者需要先写清除寄存器才能触发。第二,抓CPU核的中断请求输入引脚,如果这里没有信号,那就是引脚约束或互联逻辑的问题,比如安路FPGA的某些IO在综合时被优化掉了,或者在原语例化时没把中断信号连到软核的顶层端口。第三,如果信号到了但CPU不响应,就要查PLIC的寄存器映射,尤其注意安路软核的PLIC地址空间可能和标准RISC-V规范有偏移,比如有些版本把context寄存器放在低地址,而软件驱动用了高地址。第四,软件层面检查中断服务程序的地址是否被链接脚本正确放置在异常向量表规定的偏移处,同时确认CSR的mie和mstatus寄存器真的写进去了,有时候编译器优化会把写操作优化掉。
还有一个容易忽略的点:安路FPGA的软核如果跑在调试模式下,比如通过JTAG连接了调试器,中断会被暂停。如果你一边调试一边测试中断,可能所有信号都对但就是不触发,因为CPU停在调试状态。这个坑我见过好几次,建议先断开调试器,用纯硬件方式跑一遍。另外,不同版本的安路软核SDK对中断的封装差异较大,比如有些版本要求先写PLIC的threshold寄存器,否则中断会被屏蔽。你用的是哪个版本的软核IP?如果是自研的,那查起来就更复杂了。

给你一个不太一样的排查视角吧,先别急着开ILA。安路FPGA跑RISC-V软核,外设中断进不去,多数时候不是配置写错,而是「信号根本没按你预想的路径走」。我建议先把引脚约束文件打开,对着原理图逐脚核对:外设中断脚有没有被复用成普通IO、有没有误加上下拉、bank电压是否匹配。这一步看着简单,但很多人栽在综合器把信号优化掉——比如某个中断脚只接了寄存器没接实际逻辑,综合时就被当成悬空处理了。确认引脚没问题后,再挂ILA抓两个点:一个是外设中断源的输出,一个是CPU核的中断输入。如果前者有脉冲、后者没有,那就是走线或互联逻辑的问题;如果两者都有但CPU不跳转,那才轮到PLIC和CLINT。软件层面最后查,重点看链接脚本里向量表基址和CPU核的取指地址是否一致,有些SDK默认用的是0x0,但你改了DDR或SRAM映射就全乱了。另外有个小坑:安路自带的软核IP,中断使能寄存器可能有写保护,需要先解除写锁再配置。你用的是安路官方软核还是自己移植的蜂鸟E203?这个对排查路径影响挺大的,方便的话说下具体型号和软核来源,我可以帮你缩小范围。
发表回答
登录后可在本页底部提交回答