CNRV

为推广RISC-V尽些薄力

View the Project on GitHub

RISC-V 双周简报 (2017-10-12)

要点新闻:

RV新闻

SiFive发布第一款多核支援Linux的RISC-V IP

上周SiFive推出了U54-MC Coreplex,是RISC-V 生态圈中第一款支援Linux及多核的64bit RISC-V IP。SiFive将其和 ARM的A35比较。同时,SiFive也将在2018 Q1推出对应的开发版。其实讨论区和小编期待有这样的版子很久了。终於有个多核且64bit可以跑Linux的版子可以玩了。期待接下来有越来越多64bit和多核的RISC-V CPU或版子可以玩 :)

Links:

Dover microsystems发布CoreGuard

Dover Microsystems发布了CoreGuard,一款基於RISC-V的硬件安全方案。RISC-V的一个优势在於,各个独特技术的小公司能基於RISC-V做各种创新。Dover Microsystems 先前还在Medium写了一篇 CoreGuard 跟Trustzone的比较。对硬件安全有兴趣的朋友可以参考。

RISC-V @ 15th International SoC conference

本周在 Irvine 举办的SoC Conference有六场关於RISC-V的演讲。Microsemi, SiFive, Imperas Software, Codasip, UltraSoC, 和 prpl foundation都会来给关於RISC-V的演讲。比较特别的是prpl foundation,将带来主题为 “RISC-V and prpl: Why RISC-V will become the most secure processor architecture.”。prpl foundation 以前一直是以MIPS为主,小编也很好奇它新的走向。期待 Art Swift 前辈的演讲 : )

连结:http://t.cn/ROKkAsg

技术讨论

SiFive召集工具链的版本测试贡献者

SiFive的Palmer是RISC-V Linux Kernel和GCC工具链的主要维护者,他正在向社区征集意见,希望能有一套更好的测试框架。目前GNU工具链已经进入主线,各种商业化芯片相继出炉的大环境下,人们对工具链的要求已经越来越高,而且社区对于工具链稳定性的抱怨也越来越多。

Palmer对新的测试框架/系统提出了不少要求,比如是支持尽可能多的硬件和仿真器,或是能对GNU工具链的各分支主线做每夜构建并且能够及时和简明的报告状态等。

详细的召集邮件列表:https://goo.gl/568WYH

在LR/SC之间应禁止所有中断

LR/SC是RISC-V支持复杂原子操作的方式。LR指令读一个地址并对该地址上锁。上锁后,处理器有16个周期完成一段小的原子操作片段。片段完成后,SC指令尝试写原上锁地址,如果锁没有被破坏,则写操作成功。否则,原子操作片段重新执行。任何对锁的直接操作,或者执行时间超过16个周期都会导致锁丢失。同时,在LR/SC之间也禁止任何中断服务。这里不是说主动禁止中断服务,而是任何中断都会导致锁丢失。

这就引发了关于两个问题的确认:

相关讨论: https://goo.gl/UAciir

代码更新

LLVM 进度更新

LLVM的RISC-V开发有了实质进展。现在RV32I已经通过了所有的GCC测试,可以识别RV32IMAFD的汇编指令并能生成RV32IM的汇编代码。并且更值得一提的是,现在RV64I也已经通过所有GCC测试。在合作方面,Andes正在向Alex的LLVM开发中加入RVC支持。现在的riscv-llvm工程包含了48个补丁,修改了128个文件,超过1.1万行代码。8个补丁已经被LLVM接受,还有5个正在审核中。

lowRISC的Alex写了一个非常详细的进度更新报告,更多细节请查阅http://t.cn/ROKDgXp

Rocket-Chip支持使用dontTouch属性保留端口

最近接个月,Chisel和FIRRTL的自动常数推断和信号去除功能不断完善,已经能较好地自动去掉电路中未被使用的信号和常量信号。 但是这导致了整体Rocket-Chip自动生成的一个问题。在顶部未被连接的端口会被自动去除,导致很多端口丢失。 现在我们终于可以使用Chisel的一个实验属性:dontTouch来确保需要保留的端口不被自动去除。

TileLink拆分Acquire报文类型为AcquireBlock和AcquirePerm

Acquire是TileLink总线协议中TL-C兼容级别定义的一个报文类型,用于低级缓存向高级缓存申请一个缓存块的数据或者写权限。 根据不久之前讨论的关于显式缓存操作指令的支持, 有些内存写操作会完全覆盖原有数据,因而在申请缓存块时并不需要从高级缓存读回数据。 为了支持这种优化,现在Acquire报文被拆分为AcquireBlock和AcquirePerm类型,其中AcquireBlock为原有的Acquire操作。 AcquirePerm则只提高写权利但是不从高级缓存读回数据。

Rocket 处理器的一级数据缓存发现疑似数据丢失错误

感谢sxu55同学,lowRISC最近又修复了一个疑似错误(还未被上游Rocket确认)。 这个错误发生在一级数据缓存。 假设使用MESI一致性协议,处理器在对一个缓存块进行第一次写操作时需要将状态从E状态升级为M状态,该状态改变只需在本地完成。 在这个修改的同时,如果二级缓存向该一级缓存发出请求失效该内存块,即申请将状态从E降为I,这里就出现了竞争。 如果降级先完成,写操作应当失败,并向二级缓存重新申请E状态。 如果升级先完成,二级缓存的降级请求仍然会成功,但是数据应当被返回至二级缓存。 为了避免冲突,一级数据缓存有相应的互锁机制。这里起作用的互锁机制是如果升级正在执行,二级缓存的降级请求应该被阻塞。 可是现在的硬件仿真发现,该锁晚了一个周期,导致降级操作以为自己先完成,同时写操作也完成,但是状态已经被改为I,写入数据丢失。 现在lowRISC版本的一级缓存将锁提前一个周期,避免了该冲突。

详细的讨论和修复参见:

手动重定时(retiming)为Rocket处理器的FPU提速

带FPU的Rocket处理器在FPGA上的时钟频率一直较低,其中一个原因是FPGA软件不能很好地对FPU中的关键路径进行重定时优化。 为了提高FPGA实现的性能,SiFive的Henry Styles对FPU模块进行了手动寄存器优化。 现在带FPU的Rocket处理器已经可以在VC707(Virtex-7 485t)上跑到100MHz。

Rocket-Chip: 分离通用处理器相关配置和Rocket专有配置

Rocket-chip最近将Rocket处理器的专有配置从处理器配置中剥离。 此举更好地抽象了Rocket-Chip的处理器接口,有利于复用Rocket-Chip片上总线结构来链接非Rocket的处理器实现。 同时对于处理器相关的配置寄存器,建议的实现方式是使用一个和单个处理器紧相关的MMIO映射空间而不使用CSR。 使用CSR增加了汇编的难度,同时现在CSR的地址空间有限。

告别Chisel cloneType 重载

cloneType是Chisel中关于类型复制的重定义函数。 所有需要放入列表型数据类型,比如Vec和Seq的Bundle类型对象,都需要对cloneType进行重载。 这基本是一个重复性工作,但是忘记则会编译出错。 现在,Chisel将能够自己生成对应cloneType函数,终于不再需要设计者手动重载了!

实用资料

RISC-V 资源整理页面 @ CNRV

CNRV编辑部正在逐步整理RISC-V的各个资源,包括开源 RISC-V处理器实现 (现在已经找到23个repo了!)丶编译器丶Formal tool丶文档和教学课程的网站连结。有兴趣学RISC-V的都可以从这里找资料。有空帮忙整理的或看到漏掉的也可以帮小编发个pull request或 issue :)

资源整理页面: https://cnrv.io/resource

BOOM v2 的技术文档 (from Berkeley)

BOOM v2的论文出炉了。这次的提升同时从 micro-arch 及 physical design两方面进行优化。论文中整理了BOOM v1到v2的三个变化:

详细的设计理念可参考文档:http://t.cn/ROKDay3

RISC-V GCC的重定位支持 (Palmer的 All aboard Part2)

在 Part2中 Palmer 继续介绍 toolchain,并提到了重定位(relocation)这个概念。在编译时,编译器并无法知道(外部)全局变量/函数的确切地址,需要链接器在链接目标文件时确定这些地址并填充到适当位置。如同Palmer在这段所提到的:

Relocations resolve this discrepancy: when the compiler is unable to know the bits that should be emitted as part of a particular instruction, in instead just emits arbitrary bits for that instruction and also emits a relocation entry. This relocation entry points to the bits that will be emitted and contains enough information for the linker to fill out those bits.

介绍完链接时重定位这个概念后,文章最后利用一个摆的太远的例子,来解释重定位地址截位错误(relocation truncated to fit) 这个gcc 会出现的错误信息。( 具体的说,R_RISCV_HI20+R_RISCV_LO12_I 这个relocation pair 最大只能产生0x7FFFFFFF这样的绝对位址,因为使用lui/ld这样的组合只能直接寻址0地址正负2GB的地址范围。要跳到更远,就会出现这个错误。)

更多细节可参考 All aboard part2:http://t.cn/ROKDqQY

暴走事件

十月

十一月

招聘简讯

CNRV提供为行业公司提供公益性质的一句话的招聘信息发布,若有任何体系结构、IC设计、软件开发的招聘信息,欢迎联系我们!


整理编集: 宋威、黄柏玮、郭雄飞


欢迎关注微信公众号CNRV,接收最新最时尚的RISC-V讯息!

CNRV微信公众号


知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。