1. 安装依赖
1.1. 安装常用依赖
$ sudo apt-get install gawk git make python3 lld bison clang flex \\
libffi-dev libfl-dev libreadline-dev pkg-config tcl-dev zlib1g-dev \\
graphviz xdot
1.2. 安装 gtest
sudo apt install libgtest-dev libgmock-dev
2. 编译 yosys
下载源码:
$ git clone https://github.com/YosysHQ/yosys.git
$ cd yosys
$ git checkout v0.68
$ git submodule update –init
2.1. 方案1: 依赖使用内嵌库 -DYOSYS_USE_BUNDLED_LIBS=ON
cd ~/ex_yosys/yosys
rm -rf build
# 先确保所有内嵌子模块都拉完整了
git submodule update –init –recursive
# 强制使用内嵌依赖,跳过所有系统包查找
cmake -B build . –fresh \\
-DYOSYS_USE_BUNDLED_LIBS=ON \\
-DCMAKE_BUILD_TYPE=Release
cmake –build build –parallel $(nproc)
sudo cmake –install build
2.2. 方案2: 依赖使用系统库 安装依赖
2.2.1. 构建命令
后边会安装依赖,等依赖安装就绪后,执行如下构建命令:
$ cmake -B build .
# 查看 tcl 的配置:
$ grep -E "YOSYS_WITHOUT_TCL|tcl_INCLUDE_DIRS|tcl_VERSION|tcl_FOUND" build/CMakeCache.txt
# 输出为:
# YOSYS_WITHOUT_TCL:BOOL=OFF
# tcl_FOUND:INTERNAL=1
# tcl_INCLUDE_DIRS:INTERNAL=/usr/include/tcl8.6;/usr/include
# tcl_VERSION:INTERNAL=8.6.12
编译:
cd ~/ex_yosys/tmp01/yosys
# 编译
cmake –build build -j$(nproc)
#检查
./build/yosys –version
#输出类似:
# Yosys 0.68 (git sha1 38e001a6f, GNU /usr/bin/c++ 11.4.0)
# 安装
sudo cmake –install build
# 验证 Tcl 支持
yosys -h | grep -i tcl
# 应显示:
# -c, –tcl-scriptfile <tcl_scriptfile>
# execute the commands in the TCL <tcl_scriptfile>
# 确认版本
yosys -V
2.2.2. 源码装 tomlplusplus
Yosys 新版本的 CMake 构建系统依赖 tomlplusplus 库。tomlplusplus 是一个 header-only 的 C++17 TOML 解析库。Yosys 的 CMake 构建会通过 find_package(tomlplusplus) 来查找它,找不到就会报 tomlplusplus_DIR-NOTFOUND。
以下是几种解决方法,按推荐程度排序:
方法 1:二进制安装 tomlplusplus
Ubuntu 24.04+ 可能有包,但旧版本 ubuntu 通常没有。可以尝试:
sudo apt install libtomlplusplus-dev
如果没有这个包,请使用方法 2。
vcpkg:
vcpkg install tomlplusplus
方法 2:手动编译安装 tomlplusplus
tomlplusplus 使用 Meson 构建系统,编译安装后会生成 CMake 配置文件,Yosys 就能找到了。
# 1. 下载源码
git clone https://github.com/marzer/tomlplusplus.git
cd tomlplusplus
git checkout v3.4.0 # 建议用稳定版本
# 2. 编译安装(需要 meson 和 ninja)
meson setup build
meson compile -C build
sudo meson install -C build
安装后,CMake 配置文件通常会在:
- /usr/local/lib/cmake/tomlplusplus/
- 或 /usr/lib/cmake/tomlplusplus/
方法 3:手动指定 tomlplusplus 路径
如果你已经安装了 tomlplusplus 但 CMake 找不到(比如装到了非标准路径),可以在配置 Yosys 时手动指定:
cd yosys
cmake -B build . \\
-Dtomlplusplus_DIR=/usr/local/lib/cmake/tomlplusplus \\
-DCMAKE_BUILD_TYPE=Release
把路径换成你系统中 tomlplusplusConfig.cmake 所在的实际目录。
2.2.3. 验证 tomlplusplus 的安装
安装完 tomlplusplus 后,先验证 CMake 能否找到它:
cmake –find-package -DNAME=tomlplusplus -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST
总结: 最推荐的方法是 方法 1(包管理器安装)或 方法 2(手动编译安装)。
2.2.4. 编译安装 fmt
cd ~/ex_yosys
git clone https://github.com/fmtlib/fmt.git
cd fmt
git checkout 12.2.0 # 或最新稳定版
mkdir build && cd build
cmake .. \\
-DCMAKE_BUILD_TYPE=Release \\
-DFMT_TEST=OFF \\
-DBUILD_SHARED_LIBS=ON
cmake –build . –parallel $(nproc)
sudo cmake –install .
3. Liberty 文件与 PPA
Liberty 文件是 PPA(Power, Performance, Area)验证的基础数据输入。没有它,综合工具就无法量化评估这三个指标。
1. 为什么 Liberty 文件是 PPA 验证的前提?
PPA 三个维度都依赖 Liberty 文件中的数据:
| P (Power) | internal_power、leakage_power、switching_power | 每个单元的动态功耗和静态漏电 |
| P (Performance) | cell_rise、cell_fall、setup、hold | 门的传播延迟和时序约束 |
| A (Area) | area | 每个标准单元的硅面积(通常以 μm² 或等价门数表示) |
2. 在 Yosys 中验证 PPA 的流程
# 1. 综合并映射到标准单元库
read -sv design.v
synth -top top_module
dfflibmap -liberty mycells.lib
abc -liberty mycells.lib
# 2. 生成 PPA 报告
# 面积报告
stat -liberty mycells.lib
# 时序报告(需要额外的 SDC 约束文件)
# Yosys 本身时序分析能力有限,通常导出到 OpenSTA
write_verilog netlist.v
3. stat -liberty 输出示例
=== top_module ===
Number of wires: 123
Number of cells: 89
mylib_INV_X1 23
mylib_NAND2_X1 15
mylib_NOR2_X1 12
mylib_DFF_X1 39
Estimated area: 156.3 <– 来自 Liberty 中各 cell 的 area 字段累加
4. 仅有 Liberty 文件够吗?
不够。 完整的 PPA 验证还需要:
| Liberty (.lib) | 标准单元电气/时序/功耗特性 | 晶圆厂或开源 PDK |
| SDC 约束 | 定义时钟频率、输入/输出延迟、虚假路径 | 设计者编写 |
| SPEF/DSPF | 互连线 RC 寄生参数(后布局布线) | 提取工具(如 OpenROAD、Magic) |
| VCD/SAIF | 实际开关活动率(用于动态功耗) | 仿真器(如 Verilator、Icarus) |
5. 各阶段的 PPA 精度
| RTL 综合后 | Yosys + Liberty | ✅ 准确(已知 cell area) | ⚠️ 估算(无互连线延迟) | ⚠️ 估算(无开关活动) |
| 布局后 | OpenROAD / OpenLane | ✅ 准确 | ⚠️ 较准(有线载模型) | ⚠️ 较准 |
| 布线后 | OpenROAD + SPEF | ✅ 准确 | ✅ 准确(含寄生参数) | ✅ 准确(含 SAIF) |
6. 如果没有 Liberty 文件会怎样?
Yosys 默认使用 内部通用单元库($lut、$dff、$and 等),此时:
- Area:stat 只能报告"逻辑门数量",无法换算为实际硅面积
- Performance:无法计算真实延迟,只能做逻辑级数估算
- Power:完全无法评估
# 没有 Liberty 文件时
stat
# 输出:
# Number of cells: 100
# $and: 30
# $or: 20
# $dff: 50
# 但没有面积、延迟、功耗数据
7. 开源 PPA 验证完整工具链
如果你要做完整的开源 ASIC 流程 PPA 验证:
RTL (Verilog)
↓
Yosys (综合, Liberty 输入)
↓
OpenROAD / OpenLane (布局布线, DEF/LEF 输入)
↓
OpenSTA (静态时序分析, Liberty + SDC + SPEF)
↓
OpenRoad / ptpx (功耗分析, Liberty + VCD/SAIF)
8. 总结
Liberty 文件是 PPA 验证的必要条件,但不是充分条件。
- 有 Liberty → 可以做面积估算和粗略时序分析
- 要准确验证 Performance → 还需要 SDC + SPEF
- 要准确验证 Power → 还需要 VCD/SAIF 开关活动数据
在纯 Yosys 综合阶段,Liberty 文件至少能让你得到相对可靠的面积数据和基于线载模型的粗略时序估计,这已经足够用于早期设计空间探索(DSE)。
4. Liberty 文件介绍
Liberty(通常以 .lib 为扩展名)是 ASIC 设计中最核心的标准单元库描述文件格式,由 Synopsys 开发并已成为业界事实标准(IEEE 1801 相关)。它用类似 Tcl 的语法描述一个工艺节点下所有标准单元(Standard Cells)的电气特性、时序特性、功耗特性和物理特性。
1. 基本结构
一个 Liberty 文件通常包含以下层级:
library (mylib) {
// 库级属性
technology (cmos);
delay_model : table_lookup;
voltage_unit : "1V";
time_unit : "1ns";
capacitive_load_unit (1, pf);
// 工作条件
operating_conditions (typical) {
process : 1.0;
temperature : 25;
voltage : 1.0;
}
// 标准单元定义
cell (INV_X1) {
area : 1.2;
pin(A) {
direction : input;
capacitance : 0.001;
}
pin(Y) {
direction : output;
function : "!A";
timing() {
related_pin : "A";
cell_rise(table_1) { … } // 上升延迟查找表
cell_fall(table_1) { … } // 下降延迟查找表
}
}
}
cell (DFF_X1) {
area : 3.5;
ff(IQ, IQN) { … }
pin(CLK) { … }
pin(D) { … }
pin(Q) {
direction : output;
timing() {
related_pin : "CLK";
timing_type : rising_edge;
cell_rise(table_1) { … }
}
}
}
}
2. 关键内容
| 库属性 | 工艺节点、电压/时间单位、延迟模型(如 table_lookup、cmos_linear) |
| Operating Conditions | PVT(Process/Voltage/Temperature)角,如 tt(典型)、ss(慢角)、ff(快角) |
| Wire Load Model | 互连线延迟估算模型(用于综合阶段,尚未布线时) |
| Cell 定义 | 每个标准单元的完整描述 |
| Pin 定义 | 引脚方向、电容、驱动能力、功能表达式 |
| 时序表 (Timing Tables) | 基于输入转换时间(slew)和输出负载(load)的二维查找表,描述延迟和转换时间 |
| 功耗数据 | 内部功耗、漏电功耗、开关功耗 |
| Sequential Cell | 触发器/锁存器的 setup/hold 时间、时钟到输出延迟 |
3. 在 Yosys 中的作用
在你贴出的脚本中,Liberty 文件被用于两个关键步骤:
# 1. 将 D 触发器映射到库中的具体单元
dfflibmap -liberty mycells.lib
# 2. 用 ABC 将组合逻辑映射到库中的具体门单元
abc -liberty mycells.lib
- dfflibmap:扫描网表中的 $dff(通用 D 触发器),根据 Liberty 文件中定义的 ff 单元,映射为具体的 DFF 单元(如 DFF_X1、DFF_X2 等)
- abc:将组合逻辑(与或非门等)映射到库中的标准门单元(INV、NAND、NOR、AOI 等),同时进行逻辑优化和时序优化
4. Liberty 文件类型
| .lib | 人类可读的 ASCII 文本格式(上面示例) |
| .db | Synopsys 二进制格式(由 lc 或 Library Compiler 编译 .lib 生成,读取更快) |
| CCS / ECSM | 更先进的电流源模型,用于纳米级工艺的高精度时序分析 |
5. 免费开源 Liberty 库资源
你提到的链接是 VLSI Technology 提供的开源库,适合学习和实验:
- vsclib013(130nm):http://www.vlsitechnology.org/synopsys/vsclib013.lib
- 还有其他工艺节点如 180nm、90nm 等
此外,著名的开源 PDK 也提供 Liberty 文件:
- SkyWater 130nm (SKY130):sky130_fd_sc_hd__tt_025C_1v80.lib 等
- GF180MCU(GlobalFoundries 180nm)
6. 简单示例解析
以 Yosys 自带的 examples/cmos/cmos_cells.lib 为例:
library(cmos_cells) {
cell(NOT) {
pin(A) { direction: input; }
pin(Y) { direction: output; function: "!A"; }
}
cell(NAND) {
pin(A) { direction: input; }
pin(B) { direction: input; }
pin(Y) { direction: output; function: "!(A&B)"; }
}
cell(DFF) {
pin(CLK) { direction: input; clock: true; }
pin(D) { direction: input; }
pin(Q) { direction: output; }
ff("IQ", "IQN") { clocked_on: CLK; next_state: D; }
}
}
这是一个极度简化的 Liberty 文件,只定义了逻辑功能,没有时序和功耗数据。实际的工艺库会有复杂的 cell_rise、cell_fall、rise_transition 等查找表。
7. 总结
Liberty 文件是连接 RTL 设计和物理实现的桥梁——它告诉综合工具"我的工艺库有哪些门、每个门有多大、多快、功耗多少"。Yosys 通过读取 Liberty 文件,才能将抽象的 RTL 映射到具体的、可制造的标准单元上。
5. README.md 参考: Yosys —— Yosys 开源综合套件
这是一个 RTL 综合工具的框架。目前它对 Verilog-2005 提供了广泛的支持,并为各种应用领域提供了一套基本的综合算法。
Yosys 使用 sv-elab 和 slang 库来提供全面的 SystemVerilog 支持。 它支持(非正式定义的)可综合的 SystemVerilog 子集,版本为 IEEE 1800-2017 或 IEEE 1800-2023。
Yosys 可以通过组合现有的处理流程(算法)来执行任何综合任务,使用综合脚本,并根据需要通过扩展 Yosys C++ 代码库来添加额外的处理流程。
Yosys 是在 ISC 许可证下发布的自由软件(一种与 GPL 兼容的许可证,在条款上类似于 MIT 许可证或 2 条款 BSD 许可证)。
与本软件一起分发的第三方软件在兼容的许可证下获得许可。 请参阅 abc 和 libs 子目录以了解其许可条款。
网站及其他资源
更多信息和文档可以在 Yosys 网站上找到:
- https://yosyshq.net/yosys/
如果您有任何与 Yosys 相关的问题,请发布到 Discourse 讨论组:
- https://yosyshq.discourse.group
来自本仓库的文档会自动构建并在 Read the Docs 上提供:
- https://yosyshq.readthedocs.io/projects/yosys
对形式验证感兴趣的用户可能希望使用 Yosys 的形式验证前端 SBY:
- https://yosyshq.readthedocs.io/projects/sby/
- https://github.com/YosysHQ/sby
Yosys 博客上有来自用户的新闻和文章:
- https://blog.yosyshq.com
安装
Yosys 是 Tabby CAD Suite 和 OSS CAD Suite 的一部分!使用 Yosys 最简单的方法是安装二进制软件套件,其中包含所有必需的依赖项和相关工具。
- 联系 YosysHQ 获取 Tabby CAD Suite 评估许可证和下载链接
- 或者前往 https://github.com/YosysHQ/oss-cad-suite-build/releases 下载免费的 OSS CAD Suite
- 按照 GitHub 上的安装说明进行操作
如果您需要行业级 SystemVerilog 和 VHDL 解析器等功能,请务必获取 Tabby CAD Suite 评估许可证!
有关 Tabby CAD Suite 和 OSS CAD Suite 之间差异的更多信息,请访问 https://www.yosyshq.com/tabby-cad-datasheet
许多 Linux 发行版也提供 Yosys 二进制文件,有些比其他更新。请查看您的包管理器!
从源码构建
更多详细信息以及其他平台的说明,请查看 Read the Docs 上的从源码构建。
克隆 Yosys 时,一些必需的库作为 git 子模块包含在内。确保执行例如:
$ git clone https://github.com/YosysHQ/yosys.git
$ cd yosys
$ git submodule update –init
需要支持 C++20 的 C++ 编译器,以及一些标准工具,如 GNU Flex、GNU Bison (>=3.8)、CMake (>=3.28)、Make(或其他 CMake 生成器如 Ninja)和 Python (>=3.11)。一些额外的工具:readline、libffi、Tcl 和 zlib;如果可用将被使用,但它们是可选的。Graphviz 和 Xdot 被 show 命令用于显示原理图。
例如在 Ubuntu Linux 22.04 LTS 上,以下命令将安装构建 Yosys 的所有先决条件:
$ sudo apt-get install gawk git make python3 lld bison clang flex \\
libffi-dev libfl-dev libreadline-dev pkg-config tcl-dev zlib1g-dev \\
graphviz xdot
注意:默认情况下,Ubuntu 22.04 LTS 通过 apt 只能使用 CMake 3.22。要安装更新版本并满足构建 Yosys 的最低要求,请使用 sudo snap install cmake –classic。
CMake 用于构建配置,并且需要一个单独的构建目录:
$ cmake -B build .
生成后,可用的构建变量可以通过 ccmake 或打开生成的 build/CMakeCache.txt 文件来检查和修改:
$ ccmake build # 或者..
$ vi build/CMakeCache.txt
设置一次性变量时,CMake 提供 -D <var>=<value> 命令行选项。例如,禁用 zlib 支持:
$ cmake -B build . -DYOSYS_WITHOUT_ZLIB=ON
对于更持久的配置,我们建议在根 yosys 目录中创建并使用 CMakeUserPresets.json 文件。下面是一个示例文件,当调用 cmake –preset clang 时启用 ccache 并将默认编译器设置为 clang:
{
"version": 1,
"configurePresets": [
{
"name": "default",
"binaryDir": "build",
"generator": "Unix Makefiles",
"cacheVariables": {
"CMAKE_C_COMPILER": "clang",
"CMAKE_CXX_COMPILER": "clang++",
"YOSYS_COMPILER_LAUNCHER": "ccache"
}
}
]
}
生成后,构建系统可以按如下方式运行:
$ cmake –build build # 或者..
$ cd build
$ cmake –build .
要使用默认设置快速安装 Yosys:
$ cmake -B build . -DCMAKE_BUILD_TYPE=Release
$ cmake –build build –config Release –parallel $(nproc)
$ sudo cmake –install build –strip
测试位于 tests 子目录中,可以使用 test 目标执行。请注意,您需要 gawk、较新版本的 iverilog 和 gtest。 通过以下方式执行测试:
$ cmake –build build –target test –parallel $(nproc)
快速入门
Yosys 可以与交互式命令 shell、综合脚本或命令行参数一起使用。让我们使用交互式命令 shell 执行一个简单的综合任务:
$ ./build/yosys
yosys>
help 命令可用于打印所有可用命令的列表,help <command> 可用于打印指定命令的详细信息:
yosys> help help
使用 Verilog 前端读取和细化设计:
yosys> read -sv tests/simple/fiedler-cooley.v
yosys> hierarchy -top up3down5
以 Yosys 内部使用的 RTLIL 格式将设计写入控制台:
yosys> write_rtlil
将进程(always 块)转换为网表元素并执行一些简单的优化:
yosys> proc; opt
使用 xdot 显示设计网表:
yosys> show
使用 gv 作为 PostScript 查看器执行相同操作:
yosys> show -format ps -viewer gv
将网表转换为门级逻辑并执行一些简单的优化:
yosys> techmap; opt
将设计网表写入新的 Verilog 文件:
yosys> write_verilog synth.v
或者使用简单的综合脚本:
$ cat synth.ys
read -sv tests/simple/fiedler-cooley.v
hierarchy -top up3down5
proc; opt; techmap; opt
write_verilog synth.v
$ ./yosys synth.ys
如果在 Yosys 构建配置中启用了 ABC,并且 Liberty 文件 mycells.lib 中给出了单元库,则以下综合脚本将为给定的单元库进行综合:
# 读取设计
read -sv tests/simple/fiedler-cooley.v
hierarchy -top up3down5
# 高层级处理
proc; fsm; opt; memory; opt
# 映射到内部单元库
techmap; opt
# 将触发器映射到 mycells.lib
dfflibmap -liberty mycells.lib
# 将逻辑映射到 mycells.lib
abc -liberty mycells.lib
# 清理
clean
如果您没有 Liberty 文件但想测试此综合脚本,可以使用 yosys 源代码中的文件 examples/cmos/cmos_cells.lib 作为简单示例。
有关免费和开源 ASIC 标准单元库的 Liberty 文件下载和信息可以在这里找到:
- http://www.vlsitechnology.org/html/libraries.html
- http://www.vlsitechnology.org/synopsys/vsclib013.lib
synth 命令提供了一个很好的默认综合脚本(参见 help synth):
read -sv tests/simple/fiedler-cooley.v
synth -top up3down5
# 映射到目标单元
dfflibmap -liberty mycells.lib
abc -liberty mycells.lib
clean
prep 命令提供了一个很好的默认字级综合脚本,如基于 SMT 的形式验证中所使用的那样。
附加信息
默认情况下,当使用 Verilog 源输入调用 read 时使用的 read_verilog 命令不执行语法检查。您应该首先使用其他工具(如 [Verilator](https://www.veripool.org/verilator/)对源代码进行 lint 检查,例如通过调用 verilator –lint-only。
构建文档
请注意,如果您只是想阅读手册,则无需构建它。 只需访问 https://yosys.readthedocs.io/en/latest/ 即可。 如果您处于离线状态,可以阅读源代码,将 …/en/latest 替换为 docs/source。
除了上面列出的用于从源码构建 Yosys 的包之外,构建网站还需要以下包:
$ sudo apt install pdf2svg faketime
或者在 MacOS 上使用 homebrew:
$ brew install pdf2svg libfaketime
大多数 LaTeX 发行版中包含的 PDFLaTeX 在构建网站期间也需要。或者,运行以下命令:
$ sudo apt install texlive-latex-base texlive-latex-extra latexmk
或者在 MacOS 上使用 homebrew:
$ brew install basictex
$ sudo tlmgr update –self
$ sudo tlmgr install collection-latexextra latexmk tex-gyre
需要 Python 包 Sphinx,以及 docs/source/requirements.txt 中列出的包:
$ pip install -U sphinx -r docs/source/requirements.txt
文档(例如):
$ cmake –build build –target docs-html –parallel
这将根据需要构建/重建 yosys,然后从 yosys 帮助命令生成网站文档。要构建 pdf 而不是 html,请使用 docs-latexpdf 目标。