一、NICE接口的概念
NICE(Nuclei Instruction Co-unit Extension)接口是蜂鸟E203处理器中用于扩展自定义指令的协处理器接口,基于RISC-V标准协处理器扩展机制设计。它允许用户在不修改处理器核流水线的情况下,通过外部硬件加速特定计算任务。NICE接口通过一组握手信号与处理器核交互,支持标量指令的同步执行。其核心思想是将复杂或频繁使用的操作(如加密、DSP计算)卸载到专用硬件,从而提升能效比。该接口遵循RISC-V的模块化扩展原则,确保兼容性,同时为开发者提供低延迟的硬件加速路径。
NICE接口的主要特点是轻量化、低功耗和同步阻塞式设计。它采用单发射流水线机制,每次仅处理一条指令,通过ready信号实现严格的流控,确保指令顺序执行。接口的数据通道宽度与RISC-V处理器核一致(通常为32位),支持标准的加载/存储操作和自定义运算。其低功耗特性源于精简的状态机设计,避免复杂的多线程调度逻辑。NICE接口的核心作用是扩展处理器功能,弥补通用CPU在特定领域(如信号处理、AI推理)的性能短板。通过将关键计算任务(如矩阵乘法、FFT)委托给协处理器,可显著减少指令开销和内存访问延迟。例如,在IoT设备中,NICE接口可加速传感器数据的实时滤波或加密算法,从而降低主CPU负载。此外,该接口支持用户自定义指令集,允许开发者针对垂直场景(如边缘AI)优化硬件,而无需改动RISC-V核心架构。这种灵活性使其在嵌入式和高能效计算中具有广泛的应用潜力。
NICE接口的处理机制基于同步请求-响应模型。当处理器核解码到自定义指令时,会通过nice_req_valid信号触发协处理器,并等待nice_req_ready信号确认。NICE接口采用严格的两级流水线握手协议,处理器核与协处理器之间的交互必须至少跨越两个时钟周期,以避免组合逻辑环路。当核心发出请求时,协处理器不能在同一周期直接返回响应(即禁止nice_rsp_valid = nice_req_valid的组合逻辑连接),否则会形成时序环路,导致电路振荡或亚稳态问题。协处理器必须在下一个时钟周期才能断言nice_rsp_valid,确保信号通过寄存器打拍。这一设计是蜂鸟E203的硬性约束,所有自定义协处理器必须遵守。例如,即使协处理器的计算是纯组合逻辑,也需额外插入一级寄存器延迟,强制将响应推迟到第二周期返回。
二、NICE接口的四个通道
蜂鸟E203的NICE接口包括4个通道,分别是请求通道、反馈通道、存储器请求通道和存储器反馈通道。当主处理器在译码阶段遇到任意一种预定义指令组时,会将指令和源操作数通过请求通道派发给协处理器,协处理器接收指令后做进一步译码并执行指令,执行完毕后通过反馈通道将结果反馈给主处理器。协处理器执行NICE指令时,可以通过存储器请求和反馈通道对主处理器中的数据进行连续读写,且读写过程与执行过程完全独立,具有较高的读写效率。
1. 请求通道
请求通道用于主处理器向协处理器发起执行自定义指令的请求,具体包含的信号如下表,注意表中的信号方向是站在协处理器角度的方向。当主处理器通过指令的操作码识别到自定义指令时,会将nice_req_valid信号拉高,当nice_req_ready信号也是高电平时,即完成一次握手,此时协处理器会根据自定义指令的机器码判断需要进行什么操作,同时结合rs1和rs2的值进行计算。
通道 | 方向 | 位宽 | 信号名 | 描述 |
请求通道 | Input | 1 | nice_req_valid | 该信号为1时表示主处理器发出了一个请求 |
Output | 1 | nice_req_ready | 该信号为1时表示NICE协处理器可以接收一个请求 | |
Input | 32 | nice_req_inst | 自定义指令的机器码 | |
Input | 32 | nice_req_rs1 | 源寄存器1的值 | |
Input | 32 | nice_req_rs2 | 源寄存器2的值 |
2. 反馈通道
当协处理器执行完自定义指令后,需要通过反馈通道向主处理器返回计算结果,具体包含的信号如下表。当协处理器计算完成时,会将nice_rsp_valid信号拉高,当nice_rsp_ready信号也是高电平时,即完成一次握手,此时主处理器会接收nice_rsp_data数据,并写回到rd寄存器中。
通道 | 方向 | 位宽 | 信号名 | 描述 |
反馈通道 | Output | 1 | nice_rsp_valid | 该信号为1时表示NICE协处理器发送了一个响应 |
Input | 1 | nice_rsp_ready | 该信号为1时表示主处理器可以接收一个响应 | |
Output | 32 | nice_rsp_data | 来自NICE协处理器的计算结果 | |
Output | 1 | nice_rsp_err | 该信号为1时表示在NICE协处理器执行过程中检测到错误 |
值得注意的是,当nice_req_valid信号拉高时不能立即就将nice_rsp_valid信号拉高,即直接将nice_req_valid信号连接到nice_rsp_valid信号,如下面的Verilog代码所示。即便协处理器只需要完成一个很简单的操作,仅需少量纯组合逻辑即可完成,也不能这样赋值。因为在主处理器核中,nice_req_valid信号本身依赖nice_rsp_valid信号,直接赋值会形成组合逻辑环,即时序环路。这意味着协处理器中执行的指令至少需要两个时钟周期才能执行完毕,NICE接口硬性约束了自定义指令不能是单周期指令。
assign nice_rsp_valid = nice_req_valid;
3. 存储器请求通道
当协处理器需要额外的数据参与运算时,即除了rs1和rs2寄存器提供的数据还需要其他数据时,可以通过存储器请求通道直接访问主处理的内存,而不需要设置额外的指令来专门传递数据。此外,协处理器可以通过存储器请求通道向主处理器连续发起多个读写请求,这种设计大大提高的访问效率。并且数据访问完全可以和其他运算并行执行,这些设计使得蜂鸟处理器可以适用于实时性较高、需要处理大量数据流的场景。
存储器请求通道的具体信号如下表,当协处理器识别到自定义指令需要访问数据时,首先会将nice_mem_holdup拉高,并保持高电平,直到完成所有内存访问。这种机制阻塞了后面的加载和存储指令,可以避免一些死锁场景。在nice_mem_holdup的帮助下,协处理器可以在NICE指令完成之前的任何时间启动一次或多次内存访问。
nice_mem_holdup拉高后,当任何时候需要访问主处理器内存时,只需要将nice_icb_cmd_valid拉高,并设置好地址、操作类型、写入数据和访问数据长度四个信号,当nice_icb_cmd_ready信号也为高时,访问请求便发送成功。一段时间后,主处理器会自动反馈访问请求的结果,因此协处理器也需要做好接收数据和反馈结果的准备。
通道 | 方向 | 位宽 | 信号名 | 描述 |
存储器请求通道 | Output | 1 | nice_icb_cmd_valid | 该信号为1时表示协处理器发出了一个内存访问请求 |
Input | 1 | nice_icb_cmd_ready | 该信号为1时表示主处理器可以接收内存访问请求 | |
Output | 32 | nice_icb_cmd_addr | 存储器访问请求的地址 | |
Output | 1 | nice_icb_cmd_read | 内存访问请求的读或写操作 0: 写 1: 读 | |
Output | 32 | nice_icb_cmd_wdata | 存储器写请求的写入数据 | |
Output | 2 | nice_icb_cmd_size | 存储器访问请求的数据长度 2’b00: 字节 2’b01: 半字 2’b10: 字 2’b11: 保留 | |
Input | 1 | nice_mem_holdup | 该信号为1时表示协处理器占用了主处理器的LSU流水线,用于暂停后续的加载和存储指令执行 |
4. 存储器反馈通道
存储器反馈通道的具体信号如下表,当协处理器发起存储器访问请求的一段时间后,主处理器会向协处理器发起反馈请求,即将nice_icb_rsp_valid信号拉高,并等待协处理器做好接收数据的准备。协处理器准备好后将nice_icb_rsp_ready拉高,将nice_icb_rsp_valid和nice_icb_rsp_ready同时为高时完成一次握手,如里时读取数据的访问请求,协处理器会保存或处理nice_icb_rsp_rdata中的数据。如果是向内存写入数据的请求,同样需要通过存储器反馈通道的握手信号进行执行的反馈,只是协处理器不需要接收数据。
通道 | 方向 | 位宽 | 信号名 | 描述 |
存储器反馈通道 | Input | 1 | nice_icb_rsp_valid | 该信号为1时表示主处理器发出了一个内存访问反馈 |
Output | 1 | nice_icb_rsp_ready | 该信号为1时表示协处理器可以接收内存访问反馈 | |
Input | 32 | nice_icb_rsp_rdata | 读存储器访问的读取数据 | |
Input | 1 | nice_icb_rsp_err | 该信号为1时表示在内存访问期间检测到错误 |
三、总结
NICE接口是蜂鸟E203处理器扩展自定义指令的协处理器接口,基于RISC-V标准设计,通过四通道机制实现高效硬件加速。其核心特性包括:1)采用请求、反馈、存储器请求和反馈四个独立通道,支持指令派发、结果返回和内存访问;2)强制两周期延迟设计,避免组合逻辑环路;3)允许协处理器直接访问主存,实现并行数据流处理。该接口通过卸载复杂计算(如加密、DSP)到专用硬件,显著提升能效比,特别适用于IoT和边缘计算场景,同时保持RISC-V架构的兼容性和灵活性。