はじめに
slangは包括的なSystemVerilogフロントエンドで、パース、型チェック、エラボレーション機能を提供します。
自作のSystemVerilogシミュレータの開発に最適なツールです。
このガイドでは、mrun(仮)の開発の経験を元に、ステップバイステップの手順を提供します。
Ubuntu 24.04で必要な依存パッケージ
Ubuntu 24.04には必要なツールのほとんどが、slangと互換性のあるバージョンで含まれていますが、いくつかのパッケージをインストールする必要があります。
良い事としては、Ubuntu 24.04にはGCC 13.2.0とCMake 3.28.3が含まれており、どちらもC++20を完全にサポートしていることです。
まず、必要なすべての依存関係をインストールします:
# パッケージリストを更新
sudo apt update
# 必須ビルドツールとコンパイラをインストール
sudo apt install -y build-essential g++ gcc cmake git python3
# オプション(推奨):代替ビルドツールをインストール
sudo apt install -y ninja-build clang-17 clang++-17
slangは、CMakeのFetchContent機能を使用してビルドプロセス中にサードパーティの依存関係(fmtライブラリ、boostコンテナ)を自動的にダウンロードするため、手動でのインストールは不要です。
ゼロからの完全なビルド手順
ビルドプロセスは簡単で、一般的なシステムでは約5-10分かかります。以下が正確なコマンドシーケンスです:
# 1. 公式リポジトリをクローン
git clone https://github.com/MikePopoloski/slang.git
cd slang
# 2. 別のビルドディレクトリを作成(推奨される方法)
mkdir build
cd build
# 3. CMakeで設定(C++20を明示的に有効化)
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=20 \
-DSLANG_INCLUDE_TESTS=ON \
..
# 4. 利用可能なすべてのCPUコアを使用してビルド
cmake --build . -j$(nproc)
# 5. ビルドを検証するためのテスト実行(オプションだが推奨)
ctest --output-on-failure
# 6. システムにインストール(オプション)
sudo cmake --install .
RAMが限られたシステムでコンパイル中にメモリの問題が発生した場合は、並列ジョブを減らしてください:cmake --build . -j2
slang開発のためのCMakeの基礎
CMakeは設定ファイルを読み込んでネイティブビルドファイルを生成するビルドシステムジェネレータです。
slang開発では、3つの重要な概念を理解する必要があります:ソースディレクトリ(コードが存在する場所)、ビルドディレクトリ(コンパイルされたファイルが置かれる場所)、ターゲット(ビルドする実行ファイルまたはライブラリ)。
C++20プロジェクトのための重要なCMake変数:
-
CMAKE_CXX_STANDARD=20
- C++20標準を設定 -
CMAKE_BUILD_TYPE=Release
- 最適化ビルド(開発時はDebug) -
CMAKE_CXX_COMPILER=g++
- 使用するコンパイラを指定
slangをライブラリとして使用するプロジェクトをビルドする場合、CMakeLists.txt
ファイルを作成します:
cmake_minimum_required(VERSION 3.20)
project(my_sv_simulator)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 方法1:インストール済みのslangを使用
find_package(slang REQUIRED)
# 方法2:または自動的にslangを取得
include(FetchContent)
FetchContent_Declare(
slang
GIT_REPOSITORY https://github.com/MikePopoloski/slang.git
GIT_TAG v8.1
)
FetchContent_MakeAvailable(slang)
add_executable(my_simulator main.cpp)
target_link_libraries(my_simulator PRIVATE slang::slang)
SystemVerilogの例でslangをテスト
ビルドが完了したら、簡単なSystemVerilogモジュールを作成してslangが正しく動作することを確認します:
// test_counter.sv
module counter #(
parameter WIDTH = 8
) (
input logic clk,
input logic rst_n,
output logic [WIDTH-1:0] count
);
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)
count <= '0;
else
count <= count + 1;
end
endmodule
パーサーをテスト:
# 基本的な構文チェック
./build/tools/slang/slang test_counter.sv
# 期待される出力:
# Top level design units: counter
# Build succeeded: 0 errors, 0 warnings
# 解析用のASTを生成
./build/tools/slang/slang --ast-json test_counter.sv > ast.json
# すべての警告を有効にしてチェック
./build/tools/slang/slang -Wall test_counter.sv
エラー検出のテストには、意図的なミスのあるファイルを作成します:
// error_test.sv
module error_test;
logic [7:0] data;
assign data = data + "string"; // 型の不一致エラー
endmodule
slangは問題の正確な場所と性質を示す詳細なエラーメッセージを提供します。
よくあるビルドエラーと解決策
CMakeバージョンの問題はUbuntu 24.04ではほとんど発生しませんが、新しいバージョンが必要な場合:
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc | sudo apt-key add -
echo 'deb https://apt.kitware.com/ubuntu/ jammy main' | sudo tee /etc/apt/sources.list.d/kitware.list
sudo apt update && sudo apt install cmake
メモリ不足エラーはコンパイル中に「c++: internal compiler error: Killed」として表示されます。解決策:-j2
で並列ジョブを減らすか、スワップ領域を追加:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
依存関係の欠落はCMakeが自動的に取得するため発生しないはずです。問題が続く場合は、キャッシュをクリア:
rm -rf CMakeCache.txt CMakeFiles/
cmake ..
プロジェクトでslangをライブラリとして使用
SystemVerilogシミュレータを開発するには、slangをC++プロジェクトに統合します。以下はSystemVerilogコードを解析して分析する最小限の例です:
#include <slang/syntax/SyntaxTree.h>
#include <slang/compilation/Compilation.h>
#include <iostream>
int main() {
using namespace slang;
// SystemVerilogファイルを解析
auto tree = syntax::SyntaxTree::fromFile("design.sv");
if (!tree) {
std::cerr << "ファイルの解析に失敗しました\n";
return 1;
}
// コンパイルユニットを作成
Compilation compilation;
compilation.addSyntaxTree(tree);
// エラーをチェック
auto diagnostics = compilation.getAllDiagnostics();
for (auto& diag : diagnostics) {
std::cout << diag.toString() << "\n";
}
// デザイン階層にアクセス
auto& root = compilation.getRoot();
std::cout << "デザイン: " << root.getDesignName() << "\n";
return diagnostics.empty() ? 0 : 1;
}
より高度な使用法として、カスタムASTビジターを実装:
#include <slang/ast/ASTVisitor.h>
class ModuleAnalyzer : public slang::ast::ASTVisitor<ModuleAnalyzer, true> {
public:
void handle(const slang::ast::ModuleInstanceSymbol& module) {
std::cout << "モジュール: " << module.name << " は "
<< module.body.members().size() << " 個のメンバーを持っています\n";
visitDefault(module);
}
};
重要なリソースとドキュメント
slangプロジェクトは優れたドキュメントとツールを維持しています:
- 公式ドキュメント: https://sv-lang.com - 包括的な言語サポートの詳細
- ユーザーマニュアル: https://sv-lang.com/user-manual.html - 詳細な使用ガイド
- 開発者ガイド: https://sv-lang.com/building.html - ビルドシステムの詳細
- インタラクティブエクスプローラー: https://sv-lang.com/explore/ - オンラインでSystemVerilogの解析をテスト
-
サンプルプロジェクト:
- https://github.com/MikePopoloski/slang_package_example - CMakeパッケージ統合
- https://github.com/MikePopoloski/slang_subproject_example - サブプロジェクト統合
SystemVerilogシミュレータ開発のために、以下も探索してください:
-
Pythonバインディング
pip install pyslang
でスクリプトと高速プロトタイピング - sv-testsリポジトリで包括的なSystemVerilog準拠テスト
- GitHubディスカッションでコミュニティサポートと高度な使用パターン
パフォーマンス最適化のヒント
シミュレータ開発では、ビルドパフォーマンスが重要です。Makeの代わりにNinjaを使用してより高速なビルドを実現:
cmake -GNinja -DCMAKE_BUILD_TYPE=Release ..
ninja
リンク時最適化を有効にし、より良いランタイムパフォーマンスのためにmimallocを使用:
cmake -DCMAKE_BUILD_TYPE=Release \
-DSLANG_USE_MIMALLOC=ON \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \
..
これらの最適化により、slangは本番のSystemVerilogツールに適した優れた解析パフォーマンスを提供します。
まとめ
Ubuntu 24.04でのslangのビルドは、C++20互換のコンパイラと最新のCMakeを含むディストリビューションの現代的なツールチェーンのおかげで簡単です。
自動化された依存関係管理と明確なビルドプロセスにより、CMakeに不慣れな人でもアクセスしやすくなっています。
包括的なSystemVerilogサポート、優れたエラーメッセージ、強力なパフォーマンスを備えたslangは、教育用SystemVerilogシミュレータ開発の理想的な基盤を提供します。
詳細なドキュメント、活発な開発、有益なコミュニティの組み合わせにより、洗練されたSystemVerilogツールを構築するために必要なリソースが確保されます。
提供された簡単な例から始めて、徐々にAST機能を探索し、広範なテストスイートを活用してSystemVerilogのセマンティクスを深く理解してください。