RISC-V 架构的显著特性之一就是可扩展性。其提供了预留的指令编码空间以及预定义的指令,这里对此部分内容不做过多介绍,详情可以查询 RISC-V Manual 。
RISC-V 在32位的指令中包括了4组预定义指令类型,每种预定义指令都有对应的操作码。”custom-0”对应0001011,”custom-1”对应0101011,”custom-2”对应1011011,”custom-3”对应1111011。
蜂鸟 E203 允许用户将预定义指令扩展成自定义的协处理器指令。32位 NICE 指令的编码格式如图所示,它属于 RISC-V 的 R 类指令。

NICE 协处理器的接口信号:
module e203_subsys_nice_core (
// System
input nice_clk ,
input nice_rst_n ,
output nice_active ,
output nice_mem_holdup ,
// output nice_rsp_err_irq ,
// Control cmd_req
input nice_req_valid ,
output nice_req_ready ,
input [`E203_XLEN-1:0] nice_req_inst ,
input [`E203_XLEN-1:0] nice_req_rs1 ,
input [`E203_XLEN-1:0] nice_req_rs2 ,
// Control cmd_rsp
output nice_rsp_valid ,
input nice_rsp_ready ,
output [`E203_XLEN-1:0] nice_rsp_rdat ,
output nice_rsp_err ,
// Memory lsu_req
output nice_icb_cmd_valid ,
input nice_icb_cmd_ready ,
output [`E203_ADDR_SIZE-1:0] nice_icb_cmd_addr ,
output nice_icb_cmd_read ,
output [`E203_XLEN-1:0] nice_icb_cmd_wdata ,
// output [`E203_XLEN_MW-1:0] nice_icb_cmd_wmask , //
output [1:0] nice_icb_cmd_size ,
// Memory lsu_rsp
input nice_icb_rsp_valid ,
output nice_icb_rsp_ready ,
input [`E203_XLEN-1:0] nice_icb_rsp_rdata ,
input nice_icb_rsp_err
);
由上述代码可以看出,NICE 协处理器的接口主要包括四个通道:
蜂鸟 E203 提供了一个协处理器示例。该协处理器的实现需求为:计算一个3*3矩阵的逐行以及逐列的累加和。其软硬件实现可参考:
开源蜂鸟e203协处理器demo资料汇总_全国大学生集成电路创新创业大赛_RISC-V论坛讨论_RISC-V MCU中文社区
测试结果:在 optimization level 设置为二级时,执行该矩阵运算的指令数由454减少到103,周期数从546减少到151.

不同编译器优化等级下的测试结果:
| 优化等级 | 指令数 | 周期数 | NICE指令数 | NICE周期数 |
|---|---|---|---|---|
| O0 | 638 | 800 | 206 | 273 |
| O1 | 452 | 599 | 103 | 151 |
| O2 | 454 | 546 | 103 | 151 |
| O3 | 454 | 544 | 103 | 152 |