---
title: 実践的！FPGA開発セミナー vol.16 （2022/11/24）
tags:  #fpga #fpga開発 #fpga開発シリーズ  
author: [株式会社フィックスターズ](https://convert.docswell.com/user/fixstars)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/G75Y6D1G74.jpg?width=480
description: フィックスターズならではの「FPGA」に関する高速化手法、効率的な開発ノウハウ、苦労話などについてお話しいたします。   ＜講演内容＞  １，FPGA の論理を Chisel でゴリゴリ開発してみた話 一般的に論理回路を記述するには VHDL や Verilog が使われますが、メジャーなプログラミング言語の開発支援環境と比較して貧弱であることは否めません。 高位合成ではなく、クロック単位での論理をゴリゴリ書きたいけれど、 VHDL も Verilog も書きたくない。 そこで、UC Berkeley が開発している Chisel3 を用いて開発を行った経験をもとに、そのメリットやデメリット、開発のノウハウをお伝えしたいと思います。  2、Vitisのアクセラレーション・アプリケーション開発をエッジで思う存分活用したい アブストラクト：Vitisのアクセラレーション・アプリケーション開発はデータセンターなどで主に使用されますが、エッジ開発に使う方法を試行錯誤しました。 プラットフォームに例えばカメラ・インターフェース回路とディスプレイ出力回路を搭載して、ハードウェア・カーネルで画像フィルタを実装することができれば、ソフトウェア技術者の方でも画像システムが構築できるようになると思います。 今回はその第1歩として、Vitisアプリケーション・アクセラレーション開発のハードウェア・デザインにaxi_dmaと、メディアン・フィルタIPを実装し、ハードウェア・カーネルとしてソーベルフィルタを実装しました。 KV260でノイズ入りの画像をプラットフォーム上のメディアン・フィルタでノイズを消して、ハードウェア・カーネルのソーベル・フィルタでエッジを検出する実例を示します。   ・当社技術ブログ 記事：　https://proc-cpuinfo.fixstars.com/  ・フィックスターズグループ／セミナー一覧：　https://www.fixstars.com/ja/seminar  ・フィックスターズのFPGAシステム開発：　https://www.fixstars.com/ja/services/fpga
published: November 24, 22
canonical: https://convert.docswell.com/s/fixstars/KJL9YE-20221124
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/G75Y6D1G74.jpg)

実践的！FPGA開発セミナー
vol.16
2022/11/24 18:00～
Copyright© Fixstars Group


# Page. 2

![Page Image](https://bcdn.docswell.com/page/9J2GM81DJR.jpg)

FPGA の論理を Chisel で
ゴリゴリ開発してみた話
Copyright© Fixstars Group


# Page. 3

![Page Image](https://bcdn.docswell.com/page/DEYVX6ZMEM.jpg)

Who I am
Yoshitaka
TAKEMOTO
竹本 義孝
ソリューション第四事業部
シニアエンジニア
Copyright© Fixstars Group


# Page. 4

![Page Image](https://bcdn.docswell.com/page/VJNM1Z3378.jpg)

Verilog しんどい
4
Copyright© Fixstars Group


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YE9N5Z9PE3.jpg)

Verilog 開発の不満
● Verilog 言語の機能が低い
○
System Verilog では assertion や interface やらいろいろ使える！！
■ SV の機能が使えるかどうか割と環境依存
● C社 で使えた SV が I社 でコンパイルできなかった思い出
■ Verilog ならどこでも安定
● Verilog の開発支援環境が貧弱
○ 現在は LSP を開発されている方もおられます
■ https://github.com/imc-trading/svlangserver
■ https://github.com/dalance/svls
○ VSCode 使いなんですけど、良い設定ないですかね
● 論理は楽しいけど Verilog は何も楽しくない
○ 個人の感想です。効果には個人差があります
Copyright© Fixstars Group
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GE8KY19X7D.jpg)

Chisel3 でゴリゴリ開発してみた話
● 最近 Vivado/Vitis HLS ばかりなので、クロック単位の論理を書きたかった
○
友人とちょっと FPGA 開発する話になりました（趣味）
● しかしVerilog は書きたくない
● System Verilog は環境ごとに何が使えるのか調べるの面倒くさい
● でも Verilog は書きたくない
そうだ、 Chisel 3 で開発すればいいじゃない
というわけで、テストコード含めて1万行ぐらい
ゴリゴリ書いてきた知見をお話しします
Copyright© Fixstars Group
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LELZ4QWNJR.jpg)

Chisel 3
7
Copyright© Fixstars Group


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4JMVK19QJW.jpg)

Chisel とは
● Verilog しんどいから作られた(たぶん) HDL を生成するための言語
○
○
言語というか、 Scala の 内部 DSL
JavaScript でいう CoffeeScript とか TypeScript
■ 他にも色々あるけど、RISC-V で使われているという実績がある
● 公式サイト: https://www.chisel-lang.org/
○
GitHub: https://github.com/chipsalliance/chisel3
Copyright© Fixstars Group
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PJR2XLGKE9.jpg)

Chisel のメリット
● Scala なので IDE がリッチ
● テストが書きやすい
● Verilog を生成できるのでどの環境でも動く
● Verilogでは面倒・難しいトリッキーな書き方が容易
○ 関数内でモジュールのインスタンス化
○ 関数内でFFの値を変更したり、論理を動的に生成したり
○ モジュール間の接続の関数化
○ バルク接続が超便利
● DPI-C が無くてもプログラミングやライブラリの機能を強力に使える
Copyright© Fixstars Group
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/PEXD6WX57X.jpg)

Chisel のデメリット
● Scala であるためか重い
○
Chisel3.6 の CIRCT でどの程度早くなるのか次第
● テストが書きにくい
● 出力された Verilog を人間が読むのは難しい
○ Chisel で書いたモジュールを Chisel がコンパイルして生成した論理を Chisel でテスト…
○ ところで Chisel には保障とかないですよね？お？
■ A 社とか C 社とか I 社のツールにバグがないってわけでもないけど
● メタな書き方してると割とバグ（？）を踏み抜いて悩む
○ implicite やら AST が多すぎて自分のコードがバグってるのか、 Chisel がバグってるのかも分からないこと
が割とある
● 間違えたときのエラーが不親切
○
○
C++のメタプログラミングの様なエラーは勘弁してほしい
何も言わずに轟沈する V よりはマシと言えなくもない
● negative reset が欲しい。切実に欲しい。
Copyright© Fixstars Group
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/3EKX1VWR7D.jpg)

Chisel の基本を超特急
11
Copyright© Fixstars Group


# Page. 12

![Page Image](https://bcdn.docswell.com/page/L735QM1GE5.jpg)

Chisel の開発環境
Scala が開発できれば環境は何でもOK
● 私の開発環境
○
○
○
○
OS： Ubuntu 20.04
■ シミュレーションに Verilator を使う場合は WSL か Linux が必要
● WSL2でも FPGA の書き込みに USB を使うのが正直面倒くさいので Ubuntu マシン用意する方が楽
● FIRRTL で済ませる場合は不要 (ちょっと巨大なロジックになってくると遅い）
JDK: Java 8 (apt で入れたんだったかな？）
sbt: 1.7.0 (apt で入れたんだったかな？）
■ Scala: 2.13.8
エディタ： VSCode
■ Metals: https://scalameta.org/metals/docs/editors/vscode
一昔前は IntelliJ しか Scala の開発環境はなかったが
現在はVSCode で大きな不満はなく開発可能
※個人の感想であり、効果・効能を保証するものではありません
Copyright© Fixstars Group
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/87DD96XN7G.jpg)

Chisel のディレクトリ構成
通常は Chisel 専用のプロジェクトを作るのが筋
でも面倒くさい
EDA 用のファイルなども一括したディレクトリ構成は以下の落ち着きました
13
Copyright© Fixstars Group


# Page. 14

![Page Image](https://bcdn.docswell.com/page/VJPXZYPN78.jpg)

Chisel のディレクトリ構成 (邪魔なディレクトリ）
Scala (Metals)が色々ディレクトリを作って、非常に邪魔くさいので
.vscode/settings.json で非表示にする方が良いと思います
14
Copyright© Fixstars Group


# Page. 15

![Page Image](https://bcdn.docswell.com/page/2EVLWG2YJQ.jpg)

Chisel プロジェクトの初期化
build.sbt を作成してプロジェクトの初期化（Metals 任せ）
● build.sbt は以下を参考に作成（ルートディレクトリが異なる程度）
● https://github.com/freechipsproject/chisel-template/blob/main/build.sbt
15
保存してこのようなポップアップが出たら、
Import build を押せばOK
Copyright© Fixstars Group


# Page. 16

![Page Image](https://bcdn.docswell.com/page/57GXD8RWEL.jpg)

Chisel のサンプルを作ってみる
package sample
import chisel3._
import chisel3.util._
class Sample extends Module {
val io = IO(new Bundle {
val in = Input(Bool())
val out = Output(Bool())
})
16
val reg = RegInit(false.B)
reg := io.in
}
io.out := reg
Copyright© Fixstars Group


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4EQ819VQJP.jpg)

Chisel から Verilog へ
Sample.scala に以下を追加
object Sample extends App {
val dir = &quot;rtl/chisel&quot;
// どんなオプションがあるか知りたければ、
// 最初に &quot;--help&quot; を入れて実行する
val option = Array(
// &quot;--help&quot;,
&quot;-td=&quot; + dir, // 出力ディレクトリの設定
&quot;--emission-options=disableMemRandomization,disableRegisterRandomization&quot;
)
(new chisel3.stage.ChiselStage).emitVerilog(
new Sample,
option
)
}
Copyright© Fixstars Group
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/KJ42RXMYE1.jpg)

Chisel から Verilog へ
ターミナルを開き、 sbt を実行する
sbt は起動が遅いので、ターミナルを占有して立ち上げっぱなしにしておく
デフォルトでは chisel ディレクトリのプロジェクトが選択されていないので
「project chisel」で選択
run で実行
18
※ ワンライナーで実行する場合は 「 sbt &quot;project chisel&quot; run 」
Copyright© Fixstars Group


# Page. 19

![Page Image](https://bcdn.docswell.com/page/LE1MQN8N7G.jpg)

Chisel から Verilog へ
19
Copyright© Fixstars Group


# Page. 20

![Page Image](https://bcdn.docswell.com/page/GEW3M4GME2.jpg)

Chisel から Verilog へ
20
同期リセットになってる
Copyright© Fixstars Group


# Page. 21

![Page Image](https://bcdn.docswell.com/page/47ZVQ2LME3.jpg)

Chisel を非同期リセットにする
package sample
import chisel3._
import chisel3.util._
class Sample extends Module
with RequireAsyncReset {
val io = IO(new Bundle {
val in = Input(Bool())
val out = Output(Bool())
})
val reg = RegInit(false.B)
reg := io.in
21
}
io.out := reg
ASIC な人でも実際安心
Copyright© Fixstars Group


# Page. 22

![Page Image](https://bcdn.docswell.com/page/YJ656VW57V.jpg)

Chisel と Verilog の簡易比較
Verilog
Chisel
数値
100
32’d0
65’h1FFFFFFFFFFFFFFFF
true false
100.U(unsigned) / 100.S (signed)
0.U(32.W) / 0.S(32.W)
“h1FFFFFFFFFFFFFFFF”.U(65.W)
true.B false.B
FF
logic ff;
always_ff @(posedge clk)
if (!rst) ff &lt;= 1’b0;
else ff &lt;= 1’b1;
val ff = RegInit(0.U(1.W))
ff := 1.U(1.W)
三項演算子
c? a : b
Mux(c, a, b)
if - else if - else
if (cond1) begin
end else if (cond2) begin
end else begin
end
when(cond1) {
}.elsewhen(cond2) {
}.otherwise {
}
a == b
a != b
a === b
a =/= b
比較演算子
Copyright© Fixstars Group
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/GJ5Y6DMGJ4.jpg)

Chisel と Verilog の簡易比較
Verilog
Chisel
port 宣言
module X (
input [1:0] a,
output [2:0] b
);
val io = IO( new Bundle {
val a = Input(UInt(2.W))
val b = Output(UInt(3.W))
})
三項演算子連打
logic x;
assign x = c1 ? a1:
c2 ? a2:
c3 ? a3:
x_default;
val x = WireInit( xDefault )
when(c1) { x := a1 }
when(c2) { x := a2 }
when(c3) { x := a3 }
MuxCaseというのもあるにはある
switch 文
instance 化
case (state)
X:
endcase
when().elsewhen().otherwise が良い
my_module i1 (
.x(x),
.y(y)
);
val i1 = Module(new MyModule)
i1.io.x := x
i1.io.y := y
MuxLookupやswitch-is があるにはあるが…
Copyright© Fixstars Group
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/9E2GM89DER.jpg)

Chisel と Verilog の簡易比較
Verilog
Chisel
結合
assign x = {a, b, c};
x := Cat(a, b, c)
bit 取得
if (x[1]) begin
end
when( x(1) ) {
}
[msb: lsb]
x[3: 1]
x(3, 1)
2次元配列
logic [7:0] array[0: 99]
val array = Vec(100, UInt(8.W))
1要素の長さが異なる配
列の定義とアクセス
簡単にはできない
…と思う
Scala の Seq と for を使って割と簡単に記述できる
val array = Seq(Wire(UInt(8.W)), Wire(UInt(16.W),...
for((w, i) &lt;- array.zipWithIndex ) {
when( logicIndex === i.U ) {
value := w
}
}
Copyright© Fixstars Group
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/D7YVX64M7M.jpg)

Chisel の Bundle
今まで何度か出てきた Bundle は SystemVerilog の interface の様なものです
SystemVerilog
interface X;
logic [7:0] a;
logic
b;
endinterface
Chisel
class X extends Bundle {
val a = UInt(8.W)
val b = Bool()
}
X という名前を付けずにインスタンスを作成する場合
25
new Bundle {
val a = UInt(8.W)
val b = Bool()
}
Copyright© Fixstars Group


# Page. 26

![Page Image](https://bcdn.docswell.com/page/VENM1ZY3J8.jpg)

Chisel の Bundle
今まで何度か出てきた Bundle は SystemVerilog の interface の様なものです
SystemVerilog
interface X;
logic [7:0] a;
logic
b;
//※ modport で宣言しなくても使える
modport o (
output a,
output b
);
modport i (
input a,
input b
);
endinterface
Chisel
class X extends Bundle {
val a = UInt(8.W)
val b = Bool()
}
// IO として使う時
val io = IO( new Bundle {
val o = Output(new X)
val i = Input(new X)
})
Copyright© Fixstars Group
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/Y79N5ZPP73.jpg)

Chisel の Bundle
今まで何度か出てきた Bundle は SystemVerilog の interface の様なものです
SystemVerilog
interface X;
logic [7:0] a;
logic
b;
modport main (
output a,
input b
);
modport secondary (
input a,
output b
);
endinterface
Chisel
class X extends Bundle {
val a = Output(UInt(8.W))
val b = Input(Bool())
}
// IO として使う時
val io = IO( new Bundle {
val main = new X
val secondary = Flipped(new X)
})
Copyright© Fixstars Group
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/G78KY1DXJD.jpg)

Chisel の Bundle
今まで何度か出てきた Bundle は SystemVerilog の interface の様なものです
SystemVerilog
X x;
ModuleA a (
.portX(x)
);
ModuleB b (
.portX(x)
)
Chisel
val a = Module( new ModuleA )
val b = Module( new ModuleB )
a.io.portX &lt;&gt; b.io.portX
&lt;&gt; を バルク 接続演算子と呼びます。
:= と違い、output/input をいい感じに繋いでくれま
す
Chisel では Bundle と バルク接続 をうまく利用して記述を圧縮することが基本
Copyright© Fixstars Group
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/L7LZ4QMNER.jpg)

Bundle間で バルク接続（１）
例： 継承関係で接続したい
例： AXI-Stream のサブチャネルのありなしとか
29
Copyright© Fixstars Group


# Page. 30

![Page Image](https://bcdn.docswell.com/page/4EMVK1YQEW.jpg)

Bundle間で バルク接続（１）
viewAsSupertype で変換してからバルク接続
30
Copyright© Fixstars Group


# Page. 31

![Page Image](https://bcdn.docswell.com/page/PER2XL9K79.jpg)

Bundle間で バルク接続（１）
viewAsSupertype で変換してからバルク接続
31
Copyright© Fixstars Group


# Page. 32

![Page Image](https://bcdn.docswell.com/page/P7XD6WQ5JX.jpg)

Bundle間で バルク接続（２）
例： 他人が作った Bundle と自分の Bundle が実質同じなので接続したい
例： ValidIO と AXI-Stream とか
32
Copyright© Fixstars Group


# Page. 33

![Page Image](https://bcdn.docswell.com/page/37KX1V9RJD.jpg)

Bundle間で バルク接続（２）
DataView で Xbundle と YBundle のフィールド対応を定義し、 viewAs で変換
33
Copyright© Fixstars Group


# Page. 34

![Page Image](https://bcdn.docswell.com/page/LJ35QMWG75.jpg)

Bundle間で バルク接続（２）
DataView で Xbundle と YBundle のフィールド対応を定義し、 viewAs で変換
34
詳細は https://www.chisel-lang.org/chisel3/docs/cookbooks/dataview.html 参
照
Copyright© Fixstars Group


# Page. 35

![Page Image](https://bcdn.docswell.com/page/8JDD96KNJG.jpg)

Bundle間で バルク接続（１）
半月ほど前のコミット見ると、次のリリースからはこう書けるようになるみたい
35
https://github.com/chipsalliance/chisel3/commit/251d454a224e5a961438ba
0ea41134d7da7a5992
Copyright© Fixstars Group


# Page. 36

![Page Image](https://bcdn.docswell.com/page/VEPXZYKNJ8.jpg)

Chisel Enum
● まだ 実験段階だが、 ChiselEnum で列挙型を定義可能
36
Copyright© Fixstars Group


# Page. 37

![Page Image](https://bcdn.docswell.com/page/27VLWGVYEQ.jpg)

Chisel の基本
まとめ
● 開発環境
○
○
OS は Linux の実機がお勧め
エディタは VSCode で十分
● ディレクトリ構成
○
EDA ツールと一緒に開発する場合の私の構成について（基本からは外れている）
● Chisel の初期化
○
build.sbt を書いたら後は Metals や sbt にお任せ
● シンプルなデザインの作成と Verilog への変換方法
○
非同期リセットの作り方もついでに紹介
● Chisel と Verilog で大きく違う基本的な構文についての比較
● Chisel の Bundle に関する基本項目
○
○
○
Chisel の Bundle はおおよそ SystemVerilog の interface
Chisel のバルク接続は強力
おまけ：supertype が実装されるらしいよ
● Chisel の列挙型について
Copyright© Fixstars Group
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/5JGXD8LW7L.jpg)

Chisel でテスト
38
Copyright© Fixstars Group


# Page. 39

![Page Image](https://bcdn.docswell.com/page/47Q819YQEP.jpg)

Chisel でテスト
Chisel のテストは、シミュレータを操作することで値を入力したり、値が正しいかの確認を行う
39
Copyright© Fixstars Group


# Page. 40

![Page Image](https://bcdn.docswell.com/page/KE42RXWY71.jpg)

Chisel でテストを作る
40
Copyright© Fixstars Group


# Page. 41

![Page Image](https://bcdn.docswell.com/page/L71MQNYNJG.jpg)

Chisel でテストを作る
sbt で test とタイプするとテストを実行できる
以下のように[success]と出て終了する
41
Copyright© Fixstars Group


# Page. 42

![Page Image](https://bcdn.docswell.com/page/G7W3M41M72.jpg)

Chisel でテストを作る
sbt で test とタイプするとテストを実行できる
以下のように[success]と出て終了する
42
Copyright© Fixstars Group


# Page. 43

![Page Image](https://bcdn.docswell.com/page/4JZVQ2PM73.jpg)

Chisel でテストを作る
it should “テスト名” test(new テストベンチモジュール) { tb =&gt; }
を追加してテストを増やしていく
43
Copyright© Fixstars Group


# Page. 44

![Page Image](https://bcdn.docswell.com/page/YE656VM5JV.jpg)

Chisel でテストを作る
………いや、何で失敗すんのよ
波形、波形をくれ
44
Copyright© Fixstars Group


# Page. 45

![Page Image](https://bcdn.docswell.com/page/GE5Y6DZGE4.jpg)

Chisel でテストを作る
波形を取得する為に 「testOnly * – -DwriteVcd=1」を実行
コマンドの意味は、全てのテスト実行する（* のワイルドカード）。
オプションとしてwriteVcd=1（波形ファイルの書き出し）を渡す
ということ
45
test_run_dirに 「〇_should_●」ディレクトリがあり
その中に vcd ファイルが保存される
GTKWave などで波形を確認
Copyright© Fixstars Group


# Page. 46

![Page Image](https://bcdn.docswell.com/page/972GM8RD7R.jpg)

Chisel assertion
Verilog の assertion の様に毎クロック値を確認する、というようなテストをモジュール内に書ける
46
Copyright© Fixstars Group


# Page. 47

![Page Image](https://bcdn.docswell.com/page/DJYVX6DMJM.jpg)

Chisel assertion
Verilog の assertion の様に毎クロック値を確認する、というようなテストをモジュール内に書ける
47
Copyright© Fixstars Group


# Page. 48

![Page Image](https://bcdn.docswell.com/page/V7NM1Z63E8.jpg)

Chisel assertion
出力される Verilog が汚くなるのはご愛敬………?
何とかならない？
48
Copyright© Fixstars Group


# Page. 49

![Page Image](https://bcdn.docswell.com/page/YJ9N5ZLPJ3.jpg)

Chisel のテストを Verilator で実行
論路規模が大きくなってくると、 FIRRTL のシミュレーションでは時間がかかりすぎて待っ
てられない
時間がかかるな、と思ったら Verilator でシミュレーションすることを検討すると良い
.withAnnotations(Seq(VerilatorBackendAnnotation))
49
Verilator のコンパイルに時間はかかるけど、
シミュレーションは非常に早い
Copyright© Fixstars Group


# Page. 50

![Page Image](https://bcdn.docswell.com/page/GJ8KY1XXED.jpg)

Verilator がおかしくなったら
Verilator が成功するはずのテストで失敗することがある
-
FIRRTL でテストをすると成功する
ポート名などを変更しても VCD に反映されない
Verilator の VCD 波形が出ないこともよくある
sbt を閉じて、target （targetとchisel/target）とtest_run_dirを削除すると、うまくいく。
何が・どれが悪いのかはよくわからない。
50
Copyright© Fixstars Group


# Page. 51

![Page Image](https://bcdn.docswell.com/page/LJLZ4Q8N7R.jpg)

Chisel でテスト
メリット
● 書くのが簡単
○ shell script とか用意しなくても実行集計すぐできる
○ 補完が効くのは偉大
● 外部のライブラリなどをそのまま使える
○ CRC計算の結果があってるかとか、一度ファイルに出すとかせずにライブラリ呼び出した結
果を直接使える
● Scala の強力な構文が色々使える
○ for とか
○ match とか
51
Copyright© Fixstars Group


# Page. 52

![Page Image](https://bcdn.docswell.com/page/47MVK16Q7W.jpg)

Chisel でテスト
デメリット
● 書くのが辛い
○
○
○
Verilog で言ってしまえば、テストベンチの initial 内で全部のテストを記述するようなもの
always の様な時間の並列化や、 @(posedge 信号) みたいな記述が簡単にできない
■ 時間の分岐： fork｛｝.join() で分岐
■ 毎クロックチェック： assert
内部の信号に簡単にアクセスできない
● マルチ ドメイン クロックのテストが辛い
○
○
RTL 側は withClock で CDC は割と簡単に書ける
テスト側はテストベンチのクロック単位でしか時間が進まないので CDC が書けない
■ 私はテストベンチ用 モジュールでカウンタを使ってクロックを作るようなやり方で記述した
● it should “” の単位でテストを実行できない
○ tag というのを使えばなんかできるみたいだけど
○ scala 力が足りないだけ？よくわからない
● 入力がクロックの立ち下がりに同期してるのが辛い
○
信号が増えると目がバグるのでエッジをそろえないでほしい…
Copyright© Fixstars Group
52


# Page. 53

![Page Image](https://bcdn.docswell.com/page/P7R2XLPKJ9.jpg)

Chisel でテスト
まとめ
● Chisel でテストする方法について
○ 基本的には poke で値を突っ込んで expect で確認
■ peek〇 で値として読みだすこともできます
○ assert を使えば毎クロック勝手にチェック可能
● Chisel のテストを Verilator で走らせる方法について
○ VerilatorBackendAnnotation をつける
○ よく変になるので target ディレクトリとtest_run_dir を削除して sbt 再起動
● Chisel のメリット ・ デメリット
○ 割とテスト書くのしんどい
53
Copyright© Fixstars Group


# Page. 54

![Page Image](https://bcdn.docswell.com/page/PJXD6W35EX.jpg)

閑話休題
論理どうやって設計してる？
54
Copyright© Fixstars Group


# Page. 55

![Page Image](https://bcdn.docswell.com/page/3JKX1VYRED.jpg)

論理どうやって設計してる？
● VSCode + Markdown + mermaid + Draw.io +
タイミングチャート清書サービス(改造)
55
Copyright© Fixstars Group


# Page. 56

![Page Image](https://bcdn.docswell.com/page/LE35QM9GJ5.jpg)

論理どうやって設計してる？
● VSCode
○
昨今独り勝ち状態のエディタ。Atomさん…
● Markdown
○ いわずもがな
● mermaid
○ 状態遷移図作成等に利用
○ GitHub で Markdown に埋め込んでそのまま表示できる
○ VSCode には Markdown Preview Mermaid Support を導入すれば Markdown に組み込める
■ https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid
● Draw.io
○ HTML5/JavaScript で作られた Visio みたいなもの
○ VSCode では Draw.io Integration で VSCode 上で使うことができる
■ https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio
○ *.drawio.svg という拡張子にして保存すれば、Markdown に組み込めて、Draw.io で編集できるので便利
Copyright© Fixstars Group
56


# Page. 57

![Page Image](https://bcdn.docswell.com/page/8EDD96GNEG.jpg)

論理どうやって設計してる？
● WaveDrom
○ https://wavedrom.com/editor.html
○ 美しいタイミング図が作れる
○ 最近はこれが使われていることが多い印象
■ 正直タイミング図を書くならこれ一択
■ GitHub 対応してくれないかな…
でも書くの面倒くさい
※個人の感想です。用法容量を守って正しくお使いください
57
Copyright© Fixstars Group


# Page. 58

![Page Image](https://bcdn.docswell.com/page/V7PXZY3NE8.jpg)

論理どうやって設計してる？
● タイミングチャート清書サービス
○ 何も考えずに書ける
○
https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3
%82%A2%2F%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%81%E3%83%A3%E3%83
%BC%E3%83%88%E6%B8%85%E6%9B%B8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9
58
Copyright© Fixstars Group


# Page. 59

![Page Image](https://bcdn.docswell.com/page/2JVLWG4Y7Q.jpg)

論理どうやって設計してる？
● タイミングチャート清書サービス（改造）
○
こんな感じに2カラム化して出力ファイル名を変えれるようにしてる
○ SVG の先頭にオリジナルデータが格納されてるので復元できるようにしてる
○ SVG なので Markdown でそのまま表示できる。便利
○ 信号名が調整しないと見切れるのは如何なものか…
■ タイミグチャート清書サービス記法→WaveDrom→SVG の仕組みを作ろうと思い早や幾年
59
Copyright© Fixstars Group


# Page. 60

![Page Image](https://bcdn.docswell.com/page/5EGXD81WJL.jpg)

Chisel 開発ノウハウ
（あくまで個人のノウハウ）
60
Copyright© Fixstars Group


# Page. 61

![Page Image](https://bcdn.docswell.com/page/4JQ819DQ7P.jpg)

FFの作り方
あれこれ
61
Copyright© Fixstars Group


# Page. 62

![Page Image](https://bcdn.docswell.com/page/K742RXZYJ1.jpg)

FFの作り方
あれこれ
62
Copyright© Fixstars Group


# Page. 63

![Page Image](https://bcdn.docswell.com/page/LJ1MQNRNEG.jpg)

FFの作り方
あれこれ
63
Copyright© Fixstars Group


# Page. 64

![Page Image](https://bcdn.docswell.com/page/GJW3M4YMJ2.jpg)

Chisel と コンストラクタ と フィールド
● Chisel でロジックを書くこの部分はコンストラクタ
● ここにモジュールや信号なども定義していくのがチュートリアル的なスタイル
○ 定義した信号などはフィールドとなり外部からアクセス可能
● io.portName の様に毎回 io. を書くのが面倒になってくる
○ val portName = io.portName として横着することを覚えた
64
Copyright© Fixstars Group


# Page. 65

![Page Image](https://bcdn.docswell.com/page/4EZVQ2XMJ3.jpg)

Chisel と コンストラクタ と フィールド
そして悲劇は起こった
65
Copyright© Fixstars Group


# Page. 66

![Page Image](https://bcdn.docswell.com/page/Y7656V45EV.jpg)

Chisel と コンストラクタ と フィールド
そして悲劇は起こった
66
Copyright© Fixstars Group


# Page. 67

![Page Image](https://bcdn.docswell.com/page/G75Y6DQG74.jpg)

Chisel と コンストラクタ と フィールド
● 極力 private val にするようにした
● private をつけるのも面倒になって {} でくくるようになった
67
Copyright© Fixstars Group


# Page. 68

![Page Image](https://bcdn.docswell.com/page/9J2GM8PDJR.jpg)

Chisel と IO Bundle
チュートリアルでは、入出力が反転するポートは Flipped を使って書かれる
val primary = new HogeBundle
val secondary = Flipped(new HogeBundle)
Stream の様に入出力がはっきりしてる Bundle なら覚えやすいが、
複雑な Bundle になってくるとどちらで反転するのかわからなくなる
Copyright© Fixstars Group
68


# Page. 69

![Page Image](https://bcdn.docswell.com/page/DEYVX65MEM.jpg)

Chisel と IO Bundle
結局 SystemVerilog の modport をまねる形に落ち着いた
class HogeBundle extends Bundle {
val moge = Output(略)
val piyo = Input(略)
}
val ctrl = HogeBundle.ctrl
object HogeBundle {
def apply() = new HogeBundle
def ctrl = new HogeBundle
def func = Flipped(new HogeBundle)
}
val func = HogeBundle.func
69
Copyright© Fixstars Group


# Page. 70

![Page Image](https://bcdn.docswell.com/page/VJNM1ZN378.jpg)

Chisel ノウハウ
まとめ
● FFの作り方
○ RegNextPair という object を作って使ってます
● 内部信号にアクセスする悲劇
○ private val を使いましょう
○ 面倒なら { } で囲いましょう
● IO Bundle の Flipped
○ 結局 SystemVerilog の modport は良いスタイルだと思う
70
Copyright© Fixstars Group


# Page. 71

![Page Image](https://bcdn.docswell.com/page/YE9N5ZRPE3.jpg)

最後に
71
Copyright© Fixstars Group


# Page. 72

![Page Image](https://bcdn.docswell.com/page/GE8KY1WX7D.jpg)

Chisel は救いになるか。
● 個人的には Verilog よりもずっと好きだし、書いていて楽しい
● 趣味用途には今日からの使用をお勧めします
● 仕事に使えるかどうかは、微妙
○ 万人が使える物ではない
■ 非プログラマとプログラマで書きあがるコードに大きな差が確実に出る
○ エラーがきつい
○ 保証がないことにどう向き合うか？
● 既存モジュール接続のためのグルーロジックとしては仕事に使える
○ 読める程度の Verilog コードしか出てこないなら問題は何もない
● 小さなロジックで社外に出ないコードなら活用可能
Copyright© Fixstars Group
72


# Page. 73

![Page Image](https://bcdn.docswell.com/page/LELZ4QNNJR.jpg)

最後に
● Scala の資を容易に取り込めるのは強い
○
一方で、 Scala の上に構築されているが故の問題点があるのも事実
● メタ プログラミング的な話もしたかったけど、時間足りないので削った
○
Vivado IP を生成する話も削った
● 私が思う Chisel の最大の成果は FIRRTL
○
○
そして時代は LLVM-CIRCT へ
今後もっと LLVM-CIRCT を介してトランスパイルする言語が増えると面白いですね
● Chisel は今後も安泰？
○
○
○
RISC-V の流れ的に十分安泰
後はユーザー数の問題かと
むろん、JavaScript で言う Chisel = CoffeeScript で今後 TypeScript が出てくる可能性も
■ でも、 CoffeeScript は今でも俺たちの心の中で輝いてるよね？
みんなぜひ Chisel を使ってみましょう！
Copyright© Fixstars Group
73


# Page. 74

![Page Image](https://bcdn.docswell.com/page/4JMVK1XQJW.jpg)

Thank you!
お問い合わせ窓口 : hr-seminar@fixstars.com
Copyright © Fixstars Group


