第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_in も uio もありません。だから、行き来には必ず「この固定の足」と「相手の世界」をつなぐ殻が要ります。
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.v と blink.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本(信号名も clk・btnC・led0)で済みます。
## 動線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 この章のまとめ
- 動線A(FPGA→ASIC): 本編の
blinkを無改造のまま、Tiny Tapeoutの固定I/Fに合わせる殻tt_um_myblinkをかぶせ、LibreLaneへ渡せることを示した。 - 動線B(ASIC→FPGA): Tiny Tapeout用の
tt_um_exampleを無改造のまま、Basys 3 用の殻basys3_topをかぶせ、焼く前にFPGAで検証できることを示した。 - 共通の考え方: どちらも「中身(RTL)は無改造、行き先に合わせて殻だけ着せ替える」。
FPGAとASICは、同じRTLを共有する仲間です。FPGAで自在に試して固め、ここぞというときにASICで焼く――この行き来ができれば、設計の選択肢は大きく広がります。本講座で身につけたFPGAの力は、その第一歩です。残る第8章は、困ったときに引く用語集とトラブル対処のリファレンスです。