一个 407 个门的 UART 网表,不用画图纸,也不用逐个模块翻,几行脚本就能数出三样东西:258 个触发器,143 个 LUT,还有一条常数 0 的线挂着 211 个门。

一、HAL 是什么?
emsec/hal,全名 HAL(The Hardware Analyzer),是波鸿鲁尔大学硬件安全组和马普所(MPI-SP)联合开发的门级网表分析框架。目前 835 星,MIT 许可证。
它解决的场景非常直接:你手里只有一堆 LUT 和触发器,没有源码、没有注释、没有模块边界,该怎么看?HAL 的做法是把网表读成一张图,再挂上 Python 绑定。这样一来,“看”和“查”就不是一回事了:查可以写脚本。官方自己的定位也很有意思——做硬件界的 IDA 或 Ghidra。
二、抽象层是门库,不是网表格式
HAL 的第一层抽象不是支持哪些网表格式,而是门库能不能换。
网表里每个单元是什么、几个输入输出、真值表长什么样,全由一份 .hgl 门库定义。仓库自带 11 份,从 Xilinx 的 UNISIM(单份接近 30 MB)和 SIMPRIM,到 Lattice 的 iCE40 Ultra,再到做 ASIC 的 NanGate 15nm 和 lsi_10k。
UART 示例使用通用 LUT 库,407 个门里 258 个是带复位的触发器 FFR,剩下的逻辑是 LUT 1 到 LUT6,一共 143 个。simple_alu 则直接吃 Xilinx 的网表,45 个门里 16 个 LUT、18 个 IBUF、8 个 OBUF。有意思的是,一个 8 位 ALU 的加法居然没落在 LUT 上,反而落在 2 个 CARRY4 进位链里。
第二层是 29 个插件,名字连起来就是一条逆向流水线:DANA 从无结构的网表里把高层次寄存器找回来,clock_tree_extractor 抽时钟树,module_identification 认模块,solve_fsm 解状态机,sequential_symbolic_execution 配 z3_utils 做符号执行。图论那套算法,igraph 也已经接进来了。
三、两个真能跑的场景

代码没了,只剩网表。 老项目交接过来,源码丢了,只留一份综合结果。先把网表读进来,跑一遍模块识别和时钟树提取,把骨架画出来,再从关键输出往回追扇出锥。这活儿以前是拿着纸笔在图上一根线一根线走,现在一段脚本就能跑完。上面那张图就是例子。一开始我也以为那些模块名是网表自带的,拆开官方示例才发现,toy_cipher 只有 1 个 top 模块,图上那几个可读的名字,全是插件现场聚出来的。
看设计里有没有不该在的东西。 仓库自带 5 个示例,其中一个就叫 crypto_trojan。用布尔影响分析挑出那些既不在正常数据通路上、又不驱动任何输出的逻辑,是硬件木马检测的常规切入点。IEEE TDSC 2018 那篇 HAL 论文,标题里就写着 Trojan Detection。
顺手还能当尺子量。那 1,606 条连接里,285 条接了常数 0 或常数 1,占 17.7%。扇出最高的不是数据线,是时钟,258;第二是常数 0,211。RTL 里一行隐式的复位,到了门级就是一根真有 211 个分叉的线。
四、怎么用上?有哪些坑?
不用板子,纯软件。但它不吃行为级 RTL,你得先有综合后的网表。两个示例就是证据:一个是从综合结果导出的门级 Verilog,一个是 Vivado write_vhdl 导出的后综合 VHDL。
坑一,没有 Windows 版。 它的 CI 只跑 Ubuntu 22.04、24.04、26.04 和 macOS,Windows 连编译目标都不是。两条绕法:上 WSL2,或者直接用仓库根目录自带的 Dockerfile 和 docker-compose.yml。
坑二,自己编不轻。 CMake 拉起来的是 Qt、boost、igraph 一串依赖。我在 Windows 上没编成,这篇里所有数字,是我离线拆它序列化的网表算出来的。它跑起来快不快,我不评价。官方在 packaging/deb 里给了 Debian 打包脚本,容器里装最省事。
许可 MIT,商用没负担。但有件事得说清楚:这个工具是用来读别人设计的。HAL 自己在 README 里写了,不鼓励恶意使用。还有一句更实在的原话:
HAL is at most alpha-quality software. Use at your own risk.
把这句话摆在显眼处,比藏着好。
五、仓库信息卡
- 仓库:github.com/emsec/hal
- Stars / Forks:835 / 99(抓取 2026-10-11);语言 C++,带 Python 绑定
- 首个提交 / 最近提交:2019-04-20 / 2026-10-06(累计 5,580 次提交,当前版本 4.5.0)
- 许可证:MIT(© 2019 Ruhr University Bochum, Chair for Embedded Security)
- 出身:MPI-SP 嵌入式安全组,波鸿鲁尔大学的硬件逆向工程导论课拿它当教学工具
- 门库:Xilinx UNISIM / SIMPRIM、Lattice iCE40 Ultra、NanGate 15nm、lsi_10k 等 11 份
适合谁?要读别人网表的人——IP 评估、安全审计、论文复现都算;还有想给自己综合完的设计加一层可写脚本视图的人。这类门级网表工具在云栈社区偶尔也有人讨论,如果你有更顺手的逆向流程,不妨分享出来。