源码编译安装 yosys 在 ubuntu 上

1. 安装依赖

1.1. 安装常用依赖

bash 复制代码
$ 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

bash 复制代码
sudo apt install libgtest-dev libgmock-dev

2. 编译 yosys

下载源码:

bash 复制代码
$ 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

bash 复制代码
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. 构建命令

后边会安装依赖,等依赖安装就绪后,执行如下构建命令:

bash 复制代码
$ 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

编译:

bash 复制代码
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
bash 复制代码
2.2.2. 源码装 tomlplusplus

Yosys 新版本的 CMake 构建系统依赖 tomlplusplustomlplusplus 是一个 header-only 的 C++17 TOML 解析库。Yosys 的 CMake 构建会通过 find_package(tomlplusplus) 来查找它,找不到就会报 tomlplusplus_DIR-NOTFOUND

以下是几种解决方法,按推荐程度排序:


方法 1:二进制安装 tomlplusplus

Ubuntu 24.04+ 可能有包,但旧版本 ubuntu 通常没有。可以尝试:

bash 复制代码
sudo apt install libtomlplusplus-dev

如果没有这个包,请使用方法 2。

vcpkg:

bash 复制代码
vcpkg install tomlplusplus

方法 2:手动编译安装 tomlplusplus

tomlplusplus 使用 Meson 构建系统,编译安装后会生成 CMake 配置文件,Yosys 就能找到了。

bash 复制代码
# 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 时手动指定:

bash 复制代码
cd yosys
cmake -B build . \
  -Dtomlplusplus_DIR=/usr/local/lib/cmake/tomlplusplus \
  -DCMAKE_BUILD_TYPE=Release

把路径换成你系统中 tomlplusplusConfig.cmake 所在的实际目录。


2.2.3. 验证 tomlplusplus 的安装

安装完 tomlplusplus 后,先验证 CMake 能否找到它:

bash 复制代码
cmake --find-package -DNAME=tomlplusplus -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=EXIST

总结: 最推荐的方法是 方法 1 (包管理器安装)或 方法 2(手动编译安装)。

2.2.4. 编译安装 fmt
bash 复制代码
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 文件中的数据:

PPA 维度 依赖 Liberty 中的数据 说明
P (Power) internal_powerleakage_powerswitching_power 每个单元的动态功耗和静态漏电
P (Performance) cell_risecell_fallsetuphold 门的传播延迟和时序约束
A (Area) area 每个标准单元的硅面积(通常以 μm² 或等价门数表示)

2. 在 Yosys 中验证 PPA 的流程

tcl 复制代码
# 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 等),此时:

  • Areastat 只能报告"逻辑门数量",无法换算为实际硅面积
  • Performance:无法计算真实延迟,只能做逻辑级数估算
  • Power:完全无法评估
tcl 复制代码
# 没有 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 文件通常包含以下层级:

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_lookupcmos_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 文件被用于两个关键步骤:

tcl 复制代码
# 1. 将 D 触发器映射到库中的具体单元
dfflibmap -liberty mycells.lib

# 2. 用 ABC 将组合逻辑映射到库中的具体门单元
abc -liberty mycells.lib
  • dfflibmap :扫描网表中的 $dff(通用 D 触发器),根据 Liberty 文件中定义的 ff 单元,映射为具体的 DFF 单元(如 DFF_X1DFF_X2 等)
  • abc:将组合逻辑(与或非门等)映射到库中的标准门单元(INV、NAND、NOR、AOI 等),同时进行逻辑优化和时序优化

4. Liberty 文件类型

类型 说明
.lib 人类可读的 ASCII 文本格式(上面示例)
.db Synopsys 二进制格式(由 lcLibrary Compiler 编译 .lib 生成,读取更快)
CCS / ECSM 更先进的电流源模型,用于纳米级工艺的高精度时序分析

5. 免费开源 Liberty 库资源

你提到的链接是 VLSI Technology 提供的开源库,适合学习和实验:

此外,著名的开源 PDK 也提供 Liberty 文件:

  • SkyWater 130nm (SKY130)sky130_fd_sc_hd__tt_025C_1v80.lib
  • GF180MCU(GlobalFoundries 180nm)

6. 简单示例解析

以 Yosys 自带的 examples/cmos/cmos_cells.lib 为例:

liberty 复制代码
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_risecell_fallrise_transition 等查找表。


7. 总结

Liberty 文件是连接 RTL 设计和物理实现的桥梁------它告诉综合工具"我的工艺库有哪些门、每个门有多大、多快、功耗多少"。Yosys 通过读取 Liberty 文件,才能将抽象的 RTL 映射到具体的、可制造的标准单元上。

5. README.md 参考: Yosys ------ Yosys 开源综合套件

这是一个 RTL 综合工具的框架。目前它对 Verilog-2005 提供了广泛的支持,并为各种应用领域提供了一套基本的综合算法。

Yosys 使用 sv-elabslang 库来提供全面的 SystemVerilog 支持。

它支持(非正式定义的)可综合的 SystemVerilog 子集,版本为 IEEE 1800-2017 或 IEEE 1800-2023。

Yosys 可以通过组合现有的处理流程(算法)来执行任何综合任务,使用综合脚本,并根据需要通过扩展 Yosys C++ 代码库来添加额外的处理流程。

Yosys 是在 ISC 许可证下发布的自由软件(一种与 GPL 兼容的许可证,在条款上类似于 MIT 许可证或 2 条款 BSD 许可证)。

与本软件一起分发的第三方软件在兼容的许可证下获得许可。

请参阅 abclibs 子目录以了解其许可条款。

网站及其他资源

更多信息和文档可以在 Yosys 网站上找到:

如果您有任何与 Yosys 相关的问题,请发布到 Discourse 讨论组:

来自本仓库的文档会自动构建并在 Read the Docs 上提供:

对形式验证感兴趣的用户可能希望使用 Yosys 的形式验证前端 SBY:

Yosys 博客上有来自用户的新闻和文章:

安装

Yosys 是 Tabby CAD SuiteOSS CAD Suite 的一部分!使用 Yosys 最简单的方法是安装二进制软件套件,其中包含所有必需的依赖项和相关工具。

如果您需要行业级 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 子模块包含在内。确保执行例如:

bash 复制代码
$ 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 的所有先决条件:

bash 复制代码
$ 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 用于构建配置,并且需要一个单独的构建目录:

bash 复制代码
$ cmake -B build .

生成后,可用的构建变量可以通过 ccmake 或打开生成的 build/CMakeCache.txt 文件来检查和修改:

bash 复制代码
$ ccmake build              # 或者..
$ vi build/CMakeCache.txt

设置一次性变量时,CMake 提供 -D <var>=<value> 命令行选项。例如,禁用 zlib 支持:

bash 复制代码
$ cmake -B build . -DYOSYS_WITHOUT_ZLIB=ON

对于更持久的配置,我们建议在根 yosys 目录中创建并使用 CMakeUserPresets.json 文件。下面是一个示例文件,当调用 cmake --preset clang 时启用 ccache 并将默认编译器设置为 clang:

json 复制代码
{
    "version": 1,
    "configurePresets": [
        {
            "name": "default",
            "binaryDir": "build",
            "generator": "Unix Makefiles",
            "cacheVariables": {
                "CMAKE_C_COMPILER": "clang",
                "CMAKE_CXX_COMPILER": "clang++",
                "YOSYS_COMPILER_LAUNCHER": "ccache"
            }
        }
    ]
}

生成后,构建系统可以按如下方式运行:

bash 复制代码
$ cmake --build build       # 或者..
$ cd build
$ cmake --build .

要使用默认设置快速安装 Yosys:

bash 复制代码
$ cmake -B build . -DCMAKE_BUILD_TYPE=Release
$ cmake --build build --config Release --parallel $(nproc)
$ sudo cmake --install build --strip

测试位于 tests 子目录中,可以使用 test 目标执行。请注意,您需要 gawk、较新版本的 iverilog 和 gtest。

通过以下方式执行测试:

bash 复制代码
$ cmake --build build --target test --parallel $(nproc)

快速入门

Yosys 可以与交互式命令 shell、综合脚本或命令行参数一起使用。让我们使用交互式命令 shell 执行一个简单的综合任务:

bash 复制代码
$ ./build/yosys
yosys>

help 命令可用于打印所有可用命令的列表,help <command> 可用于打印指定命令的详细信息:

bash 复制代码
yosys> help help

使用 Verilog 前端读取和细化设计:

bash 复制代码
yosys> read -sv tests/simple/fiedler-cooley.v
yosys> hierarchy -top up3down5

以 Yosys 内部使用的 RTLIL 格式将设计写入控制台:

bash 复制代码
yosys> write_rtlil

将进程(always 块)转换为网表元素并执行一些简单的优化:

bash 复制代码
yosys> proc; opt

使用 xdot 显示设计网表:

bash 复制代码
yosys> show

使用 gv 作为 PostScript 查看器执行相同操作:

bash 复制代码
yosys> show -format ps -viewer gv

将网表转换为门级逻辑并执行一些简单的优化:

bash 复制代码
yosys> techmap; opt

将设计网表写入新的 Verilog 文件:

bash 复制代码
yosys> write_verilog synth.v

或者使用简单的综合脚本:

bash 复制代码
$ 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 中给出了单元库,则以下综合脚本将为给定的单元库进行综合:

tcl 复制代码
# 读取设计
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 文件下载和信息可以在这里找到:

synth 命令提供了一个很好的默认综合脚本(参见 help synth):

tcl 复制代码
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 的包之外,构建网站还需要以下包:

bash 复制代码
$ sudo apt install pdf2svg faketime

或者在 MacOS 上使用 homebrew:

bash 复制代码
$ brew install pdf2svg libfaketime

大多数 LaTeX 发行版中包含的 PDFLaTeX 在构建网站期间也需要。或者,运行以下命令:

bash 复制代码
$ sudo apt install texlive-latex-base texlive-latex-extra latexmk

或者在 MacOS 上使用 homebrew:

bash 复制代码
$ brew install basictex
$ sudo tlmgr update --self
$ sudo tlmgr install collection-latexextra latexmk tex-gyre

需要 Python 包 Sphinx,以及 docs/source/requirements.txt 中列出的包:

bash 复制代码
$ pip install -U sphinx -r docs/source/requirements.txt

文档(例如):

bash 复制代码
$ cmake --build build --target docs-html --parallel

这将根据需要构建/重建 yosys,然后从 yosys 帮助命令生成网站文档。要构建 pdf 而不是 html,请使用 docs-latexpdf 目标。

相关推荐
Eloudy1 天前
X 功能的 docker 配置
eda
泛联新安3 个月前
国产化FPGA测试工具链--让你的FPGA设计验证更高效、更安全、更自主
fpga·eda·半导体
泛联新安3 个月前
VHawk-Lint——军工FPGA/ASIC设计质量自主可控的基石
fpga·芯片设计·eda
DarrenHChen_EDA4 个月前
【Backend Flow工程实践 27】Backend Script Template:一个可维护的后端脚本体系应该如何组织?
eda·log·tcl·parameter·regression·backend flow·script template
DarrenHChen_EDA4 个月前
【Backend Flow工程实践 21】DRC / Antenna / Metal Fill:为什么 route 之后还远没有结束?
antenna·eda·routing·apr·drc·backend flow·metal fill
DarrenHChen_EDA4 个月前
【Backend Flow工程实践 23】Backend-to-PV Handoff:从 DEF/GDS 到物理验证,后端如何完成签核交接?
lvs·eda·pv·gds·drc·backend flow·def
DarrenHChen_EDA4 个月前
【Backend Flow工程实践 16】从 Scan Chain 到 Placement:测试结构为什么会影响后端布局?
eda·dft·apr·placement·scan chain·backend flow·可测性设计
DarrenHChen_EDA4 个月前
【Backend Flow工程实践 19】CTS:从 skew group 到 clock route rule,时钟树综合到底在综合什
eda·apr·cts·backend flow·skew group
DarrenHChen_EDA4 个月前
【Backend Flow工程实践 12】Collection / Property / Filter:为什么对象查询能力决定 Backend 脚本工程上限?
eda