← 講義ポータルへ戻る 連携編(任意)

第7章:【連携編】LibreLane(ASIC)との行き来

この章は“おまけ”です。FPGAだけ学びたい方は、読み飛ばして構いません。 本編(第1〜6章)だけで、FPGAの学習は完結しています。本章は、ASIC設計講座(LibreLane)にも興味がある方に向けて、FPGAとASICの間で設計データを行き来させる2つの道を紹介します。

本講座で書いてきたRTL(回路の設計図)は、FPGAだけのものではありません。まったく同じRTLが、ASIC(自分専用に焼く本物のチップ)の設計にも使えます。本章では、その行き来を「本講座で実際に作った題材」を使って具体的に示します。

7.1 行き来の地図 ― 2つの動線

FPGAとASICは、どちらも同じRTLから出発します(第1章で見たとおり、違うのは「LUT+FFで実現するか/専用ゲートに焼くか」だけ)。行き来には2方向あります。

                       同じ RTL(回路の設計図)
                              │
        ┌─────────────────────┴─────────────────────┐
        │                                            │
   【動線A:FPGA → ASIC】                    【動線B:ASIC → FPGA】
   FPGAで書いて固めたRTLを、              LibreLane用に書いたRTLを、
   殻でTiny Tapeoutに合わせ、             殻でBasys 3 に合わせ、
   LibreLaneで焼く(製造へ)              FPGAで先に動作確認(事前検証)
        │                                            │
        ▼                                            ▼
   「作ったものを本物のチップに」          「焼く前にFPGAで確かめる」

どちらの動線も、やることは同じ一言に尽きます――「中身(RTL)は無改造のまま、行き先に合わせて“殻”だけ着せ替える」。本編で「殻」を使わずに済んだのは、FPGA単体で完結させたからです。連携では、相手の世界の作法に合わせる殻が要る、というだけのことです。

7.2 共通の鍵 ― Tiny Tapeout の「固定の足」

ASIC側(LibreLane講座)では、Tiny Tapeout という相乗り製造サービスを使います。Tiny Tapeoutに載せる回路は、決まったかたちの足(インターフェース)を持つ約束になっています。両方向の殻は、この固定の足と、自分のRTLやBasys 3 のピンとを“翻訳”する役割を担います。

   Tiny Tapeout の固定インターフェース(トップは tt_um_ で始まる名前)
 ───────────────────────────────────────────────────────────
   ui_in  [7:0]   汎用入力      uio_in  [7:0]  双方向ピン入力
   uo_out [7:0]   汎用出力      uio_out [7:0]  双方向ピン出力
   ena            有効化        uio_oe  [7:0]  双方向ピンの出力許可
   clk            クロック      rst_n          リセット(0で有効=負論理)

これらはASIC(Tiny Tapeout)の都合で決まった足です。Basys 3 の世界には ui_inuio もありません。だから、行き来には必ず「この固定の足」と「相手の世界」をつなぐ殻が要ります。

7.3 動線A:FPGAで作ったRTLを、ASICへ渡す

シナリオ: 本講座(FPGA)で blink(第4章のネイティブLチカ)を作って動作に満足した。これを Tiny Tapeout 経由で本物のチップに焼きたい

やること: blink は無改造のまま、Tiny Tapeoutの固定の足に合わせる殻 tt_um_* を1枚かぶせます。中で blink を呼び出し、足を対応づけるだけです。

`default_nettype none

// 動線A:本編のネイティブ blink を、Tiny Tapeout の固定I/Fに合わせる殻
module tt_um_myblink (
    input  wire [7:0] ui_in,
    output wire [7:0] uo_out,
    input  wire [7:0] uio_in,
    output wire [7:0] uio_out,
    output wire [7:0] uio_oe,
    input  wire       ena,
    input  wire       clk,
    input  wire       rst_n
);
    wire led;

    // 第4章で書いた blink を「無改造で」呼び出す
    blink u_blink (
        .clk (clk),
        .rst (~rst_n),     // TTは負論理rst_n、blinkは正論理rst。殻で極性を合わせる
        .led (led)
    );

    assign uo_out  = {7'b0, led};   // blinkの出力を uo_out[0] へ
    assign uio_out = 8'b0;
    assign uio_oe  = 8'b0;

    // 今回使わない入力をまとめて消費(未使用警告の抑制)
    wire _unused = &{ena, ui_in, uio_in, 1'b0};

endmodule

あとは、この tt_um_myblink.vblink.v を Tiny Tapeout のプロジェクトに入れ、LibreLane講座の手順(info.yaml 設定 → ハードニング → 物理検証 → テープアウト提出)に沿って進めれば、FPGAで動かしたのと同じ回路が、ASICのレイアウト(GDSII)になります。

※ASIC側の具体手順は LibreLane講座 に: 論理合成・配置配線・DRC/LVS・テープアウト提出といったASIC側の流れは、LibreLane講座が本筋です。本章は「FPGAで作ったRTLを、殻1枚でそのまま渡せる」という橋渡しの考え方を示すところまでとします。これで、本章末で触れた「自分のオリジナルチップをテープアウトする夢」への、最初の一歩がつながります。

7.4 動線B:ASIC向けの設計を、FPGAで先に検証する

シナリオ: LibreLane講座で tt_um_example(Tiny Tapeout用のLチカ)を書いた。焼くのは一発勝負なので、その前にFPGAで動作を確かめておきたい

やること: tt_um_example は無改造のまま、今度はBasys 3 に合わせる殻をかぶせます。固定の足を、Basys 3 のクロック・ボタン・LEDへ翻訳します。

`default_nettype none

// 動線B:Tiny Tapeout用の tt_um_example を、Basys 3 で動かす殻
module basys3_top (
    input  wire clk,    // 100MHz(W5)
    input  wire btnC,   // 中央ボタン(U18)→ リセット
    output wire led0    // LED0(U16)
);
    wire [7:0] uo_out;
    wire [7:0] uio_out;   // 未使用(ピンに出さない)
    wire [7:0] uio_oe;    // 未使用(ピンに出さない)

    // tt_um_example を「無改造で」呼び出す
    tt_um_example u_core (
        .ui_in   (8'b0),
        .uo_out  (uo_out),
        .uio_in  (8'b0),
        .uio_out (uio_out),
        .uio_oe  (uio_oe),
        .ena     (1'b1),
        .clk     (clk),      // 100MHzをそのまま渡す
        .rst_n   (~btnC)     // ボタン押下(1)→ rst_n=0(リセット)。殻で極性を合わせる
    );

    assign led0 = uo_out[0];

endmodule

ピン制約は、本編第4章とまったく同じ3本(信号名も clkbtnCled0)で済みます。

## 動線B:basys3_top 用ピン制約
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property -dict { PACKAGE_PIN W5  IOSTANDARD LVCMOS33 } [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports btnC]
set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports led0]

あとは本編第4章と同じVivadoの手順で書き込めば、ASIC用に書いた回路が、焼く前にFPGA上で動きます。これが「事前検証」です。FPGAなら何度でも書き換えて試せるので、ASICの一発勝負に臨む前に、安心して設計を固められます。

※点滅が速い場合: tt_um_example は内部で counter[23] をLEDに出すため、100MHzでは約6Hzの速い点滅に見えます(クロックが速いほど点滅も速い、というだけで正常です)。事前検証としては「リセットで止まり、離すと点滅する」など、動作の確認ができれば十分です。

7.5 この章のまとめ

FPGAとASICは、同じRTLを共有する仲間です。FPGAで自在に試して固め、ここぞというときにASICで焼く――この行き来ができれば、設計の選択肢は大きく広がります。本講座で身につけたFPGAの力は、その第一歩です。残る第8章は、困ったときに引く用語集とトラブル対処のリファレンスです。