Clash - 一种功能性硬件描述语言
Clash 是一种功能性硬件描述语言,它借鉴了函数式编程语言 Haskell 的语法和语义。Clash 编译器将这些高级描述转换为低级的可综合 VHDL、Verilog 或 SystemVerilog。
Clash 的特性:
-
强类型,但具有很高程度的类型推断,通过简洁的描述实现安全和快速原型设计。
-
交互式 REPL:在解释器中加载设计,无需设置测试台即可轻松测试所有组件。
-
高阶函数,配合类型推断,默认情况下可以生成完全参数化的设计。
-
基于值流(称为
Signal
)的同步时序电路设计,自然地描述反馈循环。 -
支持多时钟域,具有类型安全的时钟域交叉。
社区
邮件列表:加入邮件列表 clash-language+subscribe@googlegroups.com 获取更新和提问,或阅读论坛
Slack:functionalprogramming.slack.com#clash(在 fpslack.com/ 自行邀请)
IRC:libera.chat#clash(网页聊天访问)(如果想使用普通 IRC 客户端,请使用 ircs://irc.libera.chat:6697/clash)
获取 Clash
查看 clash-lang.org/install 安装最新稳定版的 Clash,或设置 Clash 项目。
从源码获取 Clash
使用 Git 获取源代码并进入克隆的目录:
git clone git@github.com:clash-lang/clash-compiler.git
# 或者,如果你没有在 GitHub 上设置 SSH 密钥:
# git clone https://github.com/clash-lang/clash-compiler.git
cd clash-compiler
要检出已发布的版本,请使用:
git checkout v1.2.3
要检出发布分支,请使用:
git checkout 1.2
注意,发布分支可能包含未发布的补丁。
GHC 兼容性
Linux | Windows | macOS | Clash(已发布) | Clash(开发版本) | |
---|---|---|---|---|---|
8.6 | ✔️ | ✔️ | ✔️ | 1.0 - 1.8 | ❌ |
8.8 | ✔️ | ❌ | ✔️ | 1.0 - 1.8 | ❌ |
8.10 | ✔️ | ✔️ | ❌ | 1.2 - 1.8 | ✔️ |
9.0 | ✔️ | ✔️² | ✔️ | 1.4 - 1.8 | ✔️ |
9.2 | ⚠️¹ | ⚠️¹ | ⚠️¹ | 1.8 | ⚠️¹️ |
9.4 | ⚠️³ ️ | ⚠️³ | ️⚠️³ ️ | 1.8 | ✔️ |
9.6 | ✔️³ | ✔️³ | ✔️³ | 1.8 | ✔️ |
9.8 | ✔️ | ✔️ | ✔️ | 1.8 | ️✔️ |
¹ GHC 9.2 存在一个回归问题,导致 Clash 错误信息难以理解。这个变更在 9.4 中被撤销。
² Windows 上的 GHC 9.0.2 无法编译 clash-cores
。因此,我们不在 CI 中为这个组合运行 Clash 测试套件。
³ 使用 9.4.8 到 9.6.2(包括)编译的 Clash 启动极其缓慢。考虑降级到 9.4.7 或升级到 9.6.3 及以上版本。
Cabal
要使用 Cabal,你需要在系统上同时安装 Cabal 和 GHC。我们推荐使用 ghcup。更多信息,请参见 https://www.haskell.org/downloads/。
要运行 clash
,请使用:
cabal v2-run -- clash
如果失败,请确保你的包索引是最新的:
cabal update
Stack
安装 Stack 并运行:
stack run -- clash
Nix
或者使用 Nix 获取一个在 PATH 中包含 clash
和 clashi
二进制文件的 shell:
# 启动默认开发 shell
nix develop .
# 使用特定 GHC 版本启动开发 shell
nix develop .#ghc961
你需要一个支持新式 nix
命令和 flakes 的现代版本的 nix(2.4 或更新)。这些功能仍需手动启用,可以通过在 nix.conf
中设置以下内容来实现:
experimental-features = nix-command flakes
要在目录更改时自动进入和退出 nix
环境,你可以安装 direnv
和 nix-direnv
,并在此仓库的根目录下的 .envrc
文件中写入以下内容:
use flake
watch_file nix/*
添加或更改此文件后,你必须执行 direnv allow
,以便在项目变更时自动加载/重新加载文件。
还可以使用 nix build
和 nix run
命令构建或运行单个包/应用程序,例如:
nix build .#clash-ghc
nix run .#clashi
相关库和倡议
- Clashilator:将 Clash 与 Verilator 集成的工具。通过将 Clash 设计编译为 C++,实现快速、多线程仿真。
- Clash Protocols:用于编写具有双向通信的 Clash 电路的实验性库 - 如 AXI 或 Avalon。
- Clash Starters:快速上手的起始项目。
- Clash WaveDrom:使用 WaveDrom 从 Clash 生成波形图。
使用 Clash 构建的项目
- Contranomy:使用 RISC-V 形式验证框架 验证的 RISCV 实现。
- Space Invaders:使用 Clash 实现的 1978 年 Taito 公司的太空侵略者街机游戏。