1、实现功能
基于官方提供的demo nice的硬件代码,设计一个基于e203 nice协处理的加法器。
2NICE协处理器理论学习
nice协处理器的作用主要是用于控制通路的管理
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
去年国一的协处理器应用
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
(1) 概念
领域特定架构(Domain SpecificArchitecture,DSA),使用特定的硬件做特定的事情[18],也就是说,将主处理器和协处理器加速器适当扩展到某些特定领域可以非常明显地提高能效比。NICE协处理器(Nuclei Instruction Co-unitExtension,蜂鸟内核指令协处理器扩展机制)是一个独立于蜂鸟E203内核的一块运算单元[24],它能根据指令去控制系统内的资源去实现一些操作,例如利用协处理器源操作数实现内存与缓存的数据交换、累加值、乘法、加密等操作,从而提高RISC-V处理器特定领域的性能,同时降低功耗。NICE协处理器的调用需要创建用户自定义RISC-V的指令。
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png
(2) 如何调用NICE协处理器
调用NICE接口有4个通道,请求通道、存储器请求通道、反馈通道、和存储器反馈通道。请求通道:主处理器在流水线的EXU级时,将指令的编码信息和源操作数传输到协处理器。反馈通道:协处理器告诉主处理器其已完成了该指令,并将结果反馈到主处理器。存储器请求通道:协处理器向主处理器发起存储器读写请求。存储器反馈通道:主处理器向协处理器写回存储器读写结果。
Nice请求通道(request channel)
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
Nice存储器请求通道(memoryrequest channel)
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
Nice存储器反馈通道(memory response channel)
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg
Nice 反馈通道(response channel)
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg
调用协处理器的方法:扩展一个用RTL级代码编写的协处理器,想个办法调用这个独立于流水线的计算单元,即在MCU层面,在编译器里编写C语言主函数中包含指定汇编指令的调用,完成驱动的配置。在nuclei-board-labs-mastere203_hbirdv2commondemo_nice里的insc.h给了调用的示例。
(3) 如何设计NICE协处理器扩展指令
1. 思路
官方提供的demo nice的硬件代码,难以阅读,这里可以删除掉了lbuf、sbuf仅保留rowsum指令,等该代码成功运行后,以此为模板,设计加法器
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg
对于nice demo的nice请求通道 和 nice相应通道的波形如下:
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg
该波形发送的是rowsum指令:
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image020.png
其rowsum的信息实际应该是 opcode:1111011 ; fun3 110 ; fun7 0000110与波形相匹配。
2. 对于芯来比赛而言,所有的nice指令最好都只用于控制,相关信号可仅有rs1、rs2(写)和rd(读)传递,不需要读取存储器的数据(这样可精简化协处理器的控制代码)
在官方案例的基础上 新增一个简单的add指令 c= a + b(主要是将内联汇编弄清楚,使用rs2)
https://bbs.elecfans.com/file:///C:/Users/13773/AppData/Local/Temp/msohtmlclip1/01/clip_image022.png