关注RISC-V和Chisel以及开源IC和EDA在中国的发展
newlib 的 RISC-V port 已经被正式合并。详情可见https://goo.gl/37oeZG。
最近,FreeBSD更新至 RISC-V priv. spec 1.10,现在支持Spike和Rocket-chip。详情可以参考这裡:https://wiki.freebsd.org/riscv和https://svnweb.freebsd.org/changeset/base/322361
另外11月的BSDTW17, 也会有两个关于RISC-V的报告。Ruslan Bukin、Arun Thomas 都会出席,有兴趣的可以参加。
Alex Bradbury在https://github.com/lowRISC/riscv-llvm/issues上发布了一系列的LLVM子工程,以便更多的人参与到RISC-V的LLVM支持工作中。
当前正在进行的是让LLVM支持RV32I,相关的补丁已经送到LLVM社区进行审议,其中7个已经被接受,8个正在征求意见。
正在开发中的RISC-V LLVM现在已经通关过了1352个GCC测试集中的1315个,未能通过的测试例子中32个编译时错误,5个运行时错误。
具体信息请参考Alex Bradbury的邮件:https://goo.gl/sGeWcy
此次发布的分档比较详细地介绍了当前被使用于Rocke-Chip的第二版TileLink片上总线。
TileLink片上总线是Rocke-Chip用于连接各级缓存和外设的总线,相比AMBA, Wishbone, Avalon, CoreConnect等等片上总线,TileLink直接在总线协议的层面上支持缓存一致性的各种操作,是基于缓存的各种要求而重新设计的片上总线。
相比TileLink第一版,第二版有以下几点改进:
具体信息请参见说明文档:https://www.sifive.com/documentation/tilelink/tilelink-spec/
另外:CNRV社区也正在积极的筹备翻译这个Spec,欢迎各位关注和参与
在刚刚结束的Hot Chips 2017上,有不少关于RISC-V的消息,分别是
EETime对Celerity做了简短的报道:
Of three academic papers on machine learning chips, the most intriguing was Celerity. Teams of grad students spread across four universities went from delivery of a 16nm TSMC PDK to tapeout of a 25mm2 device in nine months.
Celerity packs into its 360 million transistors 511 RISC-V cores and a custom neural network accelerator. The cores are split into a 496-unit array running at 1.05 GHz and five Linux-capable Rocket cores along with the accelerator running at 625 MHz.
Link: http://t.cn/RNVaTIK
值得注意的是,其具有神经网络功能的加速器是基于RoCC接口标准实现的。后续编辑部会持续关注这个项目。
关于GRVI处理器,Jan Gray主要列出了未来的一些规划和进行中的工作,包括支持更多的FPGA开发平台(如PYNQ等)、一些性能优化。
对于大家所关注的这么多的核心软件如何开发的问题,在其poster页面中这样提到:
Accelerated parallel programming models
- SPMD/MIMD code w/ small kernels, local or PGAS shared memory, message passing, memcpy/RDMA DRAM
- Current: multithread C++ with message passing runtime, built with GCC for RISC-V RV32IMA
- Future: OpenCL, ‘Gatling gun’ packet processing / P4, message passing / streaming data / KPNs
- Accelerated with plug-in-custom FUs, RAMs, AXI cores
Link: http://t.cn/RNVaizC
Dover的产生来源于美国国防部国防高等研究计划(DARPA)下的CRASH(Clean-Slate Re-design of Adaptive, Secure Hosts)计划。
该计划致力于回答一个问题:如果我们能抛开现有计算机体系结构的研究成果,重新设计一个本质上就安全的计算机,我们该怎么做? 基于这个问题,世界上的多个研究小组开展了多年的研究,提出了多种新的计算机架构。 其中源自于MIT的DRAPER实验室设计了Inherently Secure Processor(ISP)。 现在,DRAPER将ISP分离出来,成立了新的Dover Microsystems公司,用ISP来服务于商业应用。 Dover最新的Dover芯片在开源RISC-V处理器内部添加了一个协处理器来加强处理器的安全特性(小编注:该协处理器使用tagged memory进行同步的meta-data processing)。
The Inherently Secure Processor can be implemented with any Reduced Instruction Set Computer (RISC) processor and is currently optimized for the latest generation RISC-V architecture as a co-processor solution. It can be easily customized for individual customer’s embedded systems, and features adaptable and updatable technology, providing customers with longevity and resiliency into the future.
估计大多数人和我一样都觉得,难道不是吗?嗯,还真不一定是。
GNU MCU Eclipse RISC-V Embdedded GCC的作者Liviu Ionescu最近就提出了这么个问题,然后引起了激烈的讨论。 看起来,现在RISC-V提供的两个GCC工具链其实是这个样子的:
如果某一个嵌入式平台需要实现自己的底层调用,现在的办法一般是替换底层的ABI实现,但保留由libgloss定义的接口。
如果希望进一步连ABI都彻底抛弃而直接调用硬件,现在只能通过附加的gcc参数来实现,比如-nostdlib -lc
(不使用标准库但是用libc)。
为了提供针对最基础嵌入式平台的bare-metal环境,SiFive的Palmer Dabbelt现已着手提供一个新的gcc工具链,暂且命名为riscv**-unknown-none。
相关讨论:
在C代码中如何读写CSR?这个问题其实很简单,使用预提供的嵌入式汇编代码。 但是,这就够了吗?不一定哦。让我们来看看下面的代码:
__asm__ volatile ("csrci mstatus, 0x8"); // Disable interrupt (mie = 0)
mtime_value = *MTIME_PTR;
__asm__ volatile ("csrsi mstatus, 0x8"); // Enable interrupt (mie = 1)
看起来没啥问题。不过Benjamin Herrenschmidt提问,GCC或者处理器可能调换指令顺序把MTIME_PTR
的读取挪到CSR读写外吗?呃,还真的可以!
为了解决这个问题,Palmer Dabbelt把预提供的嵌入式汇编改成了:
#define csr_set(csr, val) \
({ \
unsigned long __v = (unsigned long)(val); \
__asm__ __volatile__ ("csrs " #csr ", %0" \
: : "rK" (__v) \
: "memory"); \
})
在汇编中添加了”memory”这个clobber
。clobber
是嵌入式汇编的可选参数,用于标注那些非输入或输出但是被嵌入的汇编修改的寄存器,这样编译器就可以避免使用这些寄存器。”memory”是一个特殊选项,用于说明嵌入的汇编中有内存操作,所以编译器不能将代码随意调换顺序,相当于针对编译器的memory barrier。但是,这里只是避免了编译器调换指令顺序,乱发处理器仍然可能在运行时调换指令顺序,这个就得依赖于处理器内部的依赖检查逻辑了。对于上面的例子,依赖关系是内存读写依赖于CSR读写。这看来还真的不是个简单问题哦。
sxu55最近向lowRISC提出一个问题,认为lowRISC所使用的L2实现存在死锁。 在多核系统中,假设一个L2为了回写缓存块A而询问所有L1,同时一个核正在回写缓存块B,并且A和B属于同一个set,有可能由于互相等待造成死锁。 这里的关键问题就是在缓存一致控制器的具体实现时,所有的缓存操作都不再是书本上原子操作,而被拆分成多个子步骤的操作序列。 如果两个操作序列发生交织,则可能造成死锁或数据丢失。最后讨论的结果是这个死锁的条件是不成立的,lowRISC的L2考虑到了这个具体的死锁状况。 不过相关的讨论还是很有意义的,特别是关于基于TileLink的一致性L2的实现。
具体信息请查阅lowRISC issue #67 https://git.io/v5YAb
为了代码的可读性,我们一般会在硬件设计中保留可选端口和常熟定义,将相关的优化扔给综合软件完成。 Chisel/FIRRTL将更高抽象级别的Chisel转化为Verilog的同时,也可以做相关优化。 Chisel/FIRRTL已经默认去除无连接的端口。最新的FIRRTL也已经开始支持关于常数的跨模块边界优化。
具体信息请查阅:
SiFive的Freedom平台在沉寂了很久之后终于得到了更新(尽管是一位实习生完成的),其变化包括:
Repo: https://github.com/sifive/freedom
The Bk-1 processor was designed to provide impressive 32-bit performance, small code size, and minimal power, area, and cost. In its basic configuration, the Bk-1 starts at 9k gates while delivering a maximum clock frequency of up to 350 MHz in a 55nm process. The Bk-1 has an optional power management unit, JTAG debug controller, and bridges to the AMBA buses so it can be easily integrated into existing Arm designs.
相关报道
Michael Welling在Hackaday.io上开始了一个新的项目,名为LoFive。是一块搭载SiFive FE310 MCU的迷你小板,有兴趣的可以去关注下。
Link: https://hackaday.io/project/26909
CNRV社区最近发起了两个小的翻译项目,欢迎关注:
CNRV提供为行业公司提供公益性质的一句话的招聘信息发布,若有任何体系结构、IC设计、软件开发的招聘信息,欢迎联系我们!
整理编集: 宋威,郭雄飞,黄柏玮
欢迎关注微信公众号CNRV,接收最新最时尚的RISC-V讯息!
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行许可。