LiteX/VexRiscv 简介与使用 (一) 太初有光

虽然之前musl-libc的部份尚有pthread的canceling point仍有bug,但是撑起基础的Linux userspace环境已经是勉强会动的状态。
为了避免这系列变成debug流水帐,我们在循环带过musl-libc porting的施作心法(使用qemu linux-user,配合不同层级的测试,一步一步逼进可以使用的状态),先暂时将主题拉向後续的topic:开放的RISC-V 32bit 平台。

如之前小弟任职的公司人员,与外面无数文章所述,RISC-V并不是「开放原始码」而是「开放的规格」,虽然很多人可能不以为意,但是一个订得好的CPU/指令集规格,会直接影响到硬体实做的方便与否、以及软件是否可以优雅地支援它。而这样的know-how,过去不仅为专利所束缚、也因为缺乏讨论而仅有少数人能掌握。但是现在RISC-V的出现,带来了新的一波开放原始码softcore实做,其中一套非常有名的,叫做VexRiscv,它由瑞士裔工程师 Charles Papon 在业外时间打造,为目前开放原始码RV32 CPU core实做中,唯一同时具有SMP扩展性与MMU支援的实做。其plugin的设计,也使得剪裁VexRiscv core变得非常方便而弹性,从最极简的RV32I、没有cache,到RV32GC-MSU w/ 32Kb L1/L2 cache,几乎各种使用性都能被囊括其中。

然而,有了CPU core本身是不足够的,一个完整的application processor/MCU上面,我们还会需要各种周边装置,例如最基本的 UART、 memory controller/phy,到SDC/MMC甚或是Ethernet MAC,然而,过去,这些peripheral IP多半都由商业公司所开发、其RTL code (Verilog/VHDL ......) 都是闭源的,也通常是非常绑死在特定phy上面。但这件事情,在法裔工程师 Florent Kermarrec 自己开的小工作室,enjoy-digital陆续开源自己的SoC实做时,获得了非常巨大的跃进。LiteX计画是Florent在接了各种案子後,对於Verilog/VHDL这类传统HDL的开发极为僵硬,很难在不同CPU core之间migration的深痛恶绝後,改以Migen这个Python-based的Hardware Domain specific languag而撰写的SoC builder与数种数位IP实做。(先以极为弹性的scripting language撰写好了行为定义、後续再转为synthesizable verilog) 它的设计是透过定义了一套CSR bus[1],来统合它上面的各式peripheral与CPU core的,另外它也提供自己的interrupt处理机制[2],让CPU core可以很轻松地被整合进去这样的SoC框架之中。而这计画的初试啼声,乃是香港一间硬体新创,在发现FPGA公司Lattice以相当宽松的授权释放出了其32bit的CPU core:Lattice Mico32时,决定用一套开放原始码的方式,来打造TV set top box,即便最後该计画没有达成商业目标,但也站稳了开发的完整度。

一如当年Linux kernel与GNU生态系的结盟,彼此因为互相有不同的背景知识与职能,最後在联合开发动能之下,我们获得了一个完整的作业系统,LiteX与VexRiscv;两个原本完全不同初衷的计画,最後结合成为了RISC-V 32bit世界中,打遍天下无敌手的终极开源方案。

然而,好听话也就说到这边XD

红标字样:有自己的〝interrupt 处理机制〞,是的没错,LiteX/VexRiscv这边有两个比较乱的状态,在单核时代时,它并不完全符合现行的RISC-V UNIX platform spec,他需要自己的irqchip driver支援[3]。设计上也非常的简单暴力,直接定义了两个custom CSR : 0xdc00x9c0 [3],分别代表pending的irq、以及irq enable mask,timer的部份则透过他自己SBI实做、来进行处理;但进入到VexRiscvSMP时,他们串接上了完整的PLIC/CLINT,这也造成了一些玩LiteX/VexRiscv的人对它的理解随着时期不一样而有差距的主因。笔者在作大纲规划时,刚好就在一个过渡期,所以在开篇引言时,有说道会有kernel platform conforming的问题要处理。但这件事情在此时已经获得缓解。

结束了这次的简介,我们在下一章将会带过如果建置一个完整的开源EDA + Litex/VexRiscv 环境来打造一开属於你的RV32 Linux-capable SoC.

[1] https://github.com/enjoy-digital/litex/wiki/CSR-Bus
[2] https://github.com/enjoy-digital/litex/wiki/LiteX-for-Hardware-Engineers#interrupts-aka-events
[3] https://github.com/litex-hub/linux/blob/2669e46c615f2029c81d247c3782d004decac4b0/drivers/irqchip/irq-litex-vexriscv.c


<<:  Day 17 移除照片中的人物

>>:  D2 - 先生 帮您带位元运算子

[Day6] [笔记] React Component (下)

前言 昨天我们知道 Component 是什麽,与其优点。那我们今天就接续介绍在 Component...

开始写CRUD的 C 吧! - day04

在前一篇文里提到,VoK希望开发者专注於 Kotlin code 的开发,所以Karibu-DSL ...

Day35 | WebView元件开发 - Webpack打包工具整合地雷陷阱排除

大家好,今天继续来开发元件,并动手解决实务上我们遇到的设定配置的问题。在昨天的练习里,我们可以使用b...

AWS资料仓储

当有大量资料需要分析处理时, AWS也提供了云端资料仓储分析Redshift. 在 Redshift...

DAY27 - [React] useEffect

今日文章目录 前言 参考文章 之前提到,useState方法可以让我在component内部操作资...