敏捷设计 | Chisel,再回首
上次接触 Chisel 是大三上,当时望 Scala 晦涩不堪的语法而却步。这一年多 Chisel 经过几次大版本更新,FIRRTL 后端从 Scala FIRRTL Compiler 切换到 MLIR Firrtl Compiler[1],生成 HDL 代码可读性提升一大截;更有小道消息最新 VCS 新增支持 Chisel,看来是时候重新入坑了。
同为 Scala 打底的 Spinal HDL,语法比 Chisel 赏心多了。奈何 Chisel UC Berkey 名门出身,和自家 RISCV 架构工具紧密绑定,生态上差太多。唉,若是 Synopsys 下场为真,Spinal 真是输麻了!
甜腻腻的 Scala
入坑 Chisel 最容易被劝退的便是 Scala 那有点糖腻了的语法。Scala 语法主要有俩处诟病,一是过多的语法糖,导致多种不同的语法实现之间摩棱两可;二是过度符号化,符号化是一柄双刃剑,过多的符号化会带来大幅提升上手门槛(想想 Vim 就知道),所以一般只对常用操作符号化,比如加减乘除调用,Scala 的符号化明显是有些过头了不过这也使得他被选为 Chisel 的基底。
对于这种甜了吧唧的语言,最好地不要陷入语法的沼泽。从实际例子出发理解。好在 Chisel 的入门教程写得非常不错(甚至比很多 Verilog 教程更加详细友好),强烈安利把 Chisel Bootcamp [2] 过一遍。
Agile Developing
观望 Chisel 出发点大概率是期望能提高开发效率。不过先泼一桶冷水,语言的选择只占开发时间的很小部分,真正加速在于直接的代码挪用。用 Verilog 改一下开源的核还是 Chisel 重新写一个新核,效率孰快一看便知——直接抄当然是最快的啦。期望换上 Chisel 开发效率就能天然之别显然不现实。
Chisel 全称 Constructing Hardware In a Scala Embedded Language。没错,Chisel 一直宣称自己既不是 HDL(Hardware Description Language),也不是 HLS(High-Level Synthesis),而是 HCL(Hardware Constructed Language)。Chisel 定位是 hardware generator,但相比 HLS 软件思维,Chisel 还是使用硬件思维编程,在不上不下的位置,捏了 HCL 这一种新定义。
Hardware generator 的核心在于 parameterized,抽象化设计概念从而提高代码复用。那这和 Verilog 的 parameterized 有何不同呢?Verilog 是直接描述硬件本身,参数是量变而非质变,也就是说通过这个参数,我只能控制硬件单元的规模,而不能控制这个单元有没有,甚至改变单元功能;而 Chisel 的描述硬件生成的逻辑,是质变。附之 Scala Option 的概念,更自然地设计硬件提高复用度。这是 HCL 的核心概念。
此外 Chisel 还优化了 Verilog 一些落时诟病的地方,比如:
- 解耦硬件和软件逻辑。SystemVerilog 引入了大量的面对对象特性提高验证能力,但这个面对对象十分别扭。因为大多面对对象功能在验证里调用,而验证的编程思路更接近软件,SystemVerilog 继承了 Verilog 的很多语法风格,就导致 SystemVerilog 做验证写起来软不软硬不硬的。Chisel 这一点就处理得很好,硬件描述部分用一套 Chisel 的数据类型和关键字,其余部分则用 Scala 语法(比如不同的赋值符号
=和:=,不同的条件控制if和when),将硬件逻辑和软件逻辑解耦。 - 规范硬件描述语法。比如统一端口是
wire类型,接口强制命名io等等。将 Verilog 中代码风格做的事情规范成了语法强制要求。 - 节约 Verilog 一些重复的 “体力活” 的工作。比如实例化模块大量的连线、每个模块几乎都有 reset 和 clock 端口、验证时还要手动生成时钟逻辑等等。
- 提供一些自带的小模块。一些常见模块被设为了关键字,比如
RegNextShiftRegister等等。
至于 Chisel 的生态,我目前还没找到类似 Python 遍历的包管理。不过还有 Rocket SoC generator 这些 IP,再探再报。
(https://github.com/chipsalliance/chisel/blob/main/ROADMAP.md) ↩︎
(https://mybinder.org/v2/gh/freechipsproject/chisel-bootcamp/master) ↩︎