Learn FPGA

Author

gentam

Status
draft
Date
2017-10-05
Category

learning

Tag

fpga, hdl, verilog, lattice, icestorm, xilinx

Updated

2018-08-01

FPGAで何かやりたいと思い,知識ゼロの段階から学んでいく過程と作業のメモ

Updates:

Contents

FPGA関連の情報収集(オンライン)

(2017-10-05)

情報ソース

情報源になりそうなところメモ

概要

  • FPGA: Field Programmable Gate Array

  • プログラマブル・ロジック・デバイス (PLD) という再構築可能な物理回路の一種であ り,要は(ほぼ)どんな回路でも作ることができる.

  • FPGAはよくCPU, GPU, ASICなどと比較される

    • この中で,再構築可能なのはFPGAだけ

    • ASICは,特定の用途に特化した電子回路で再構築はできない (e.g. ハッシュ計算をハードウェア実装したBitcoinのマイニング用ASIC)

    • CPUは汎用処理に特化したASIC, GPUは画像処理に特化したASICとも言える

    • 一方でFPGAはプログラムすれば何にでもなることができる (当然FPGAでCPUも作るこ とができる)

FPGA関連の文章によく出てくる略語などは 用語集 へ.

歴史・分類

FPGAはプログラム可能なスイッチによって回路情報を制御しているが, このプログラム可能性を実現する方法は複数存在する:

  • フラッシュメモリ

    (pos) 不揮発,小サイズ,LAPU (電源投入後の即動作),ソフトエラー耐性強. (neg) 書き換えに高い電圧が必要,微細化に向いていない,書き換え回数に制限あり, オン抵抗,負荷抵抗大.

  • アンチヒューズ

    (pos) 高密度,オン負荷,負荷容量小,リバースエンジニアリングがほぼ不可能, ソフトエラー耐性強. (neg) 書き換え不可,ワイヤ当たりに1,2個のトランジスタ,専用プログラマ+プログラ ミング時間,書き込み欠陥のテスト不可

  • スタティックメモリ

    (pos) CMOSの先端プロセスを使用可,再構成可,書き換え回数制限なし. (neg) メモリサイズ大,揮発性,セキュリティ確保困難,ソフトエラーに敏感, オン抵抗,負荷抵抗大

事例

  • High Frequency Trading (HFT)

  • 海底探査

  • インテリジェントスイッチ

  • memcachedの高速化

  • Microsoft Bing

  • Machine Learning/Deep Learning

  • 動画処理

FPGAでの開発

  • Write HDL

  • HDL Synthesis

    • in: HDL (Verilog or VHDL)

    • out: Netlist

  • Mapping

    • in: Netlist and ucf

    • out: FPGA specific logic and gates

  • Simulation

  • 書き込み

http://www.cse.iitd.ernet.in/~neeraj/doc/fpga.pdf

プロダクトの種類

どれを買うか選ぶ

開発している企業

  • Xilinx

  • Altera (Intel)

  • Lattice

  • Actel

  • Amtel

  • Quicklogic

FPGAシェアの8割は,XilinxとAlteraが握っているらしい.

Latticeのプロダクト

(Update: 2018-05-24)

完全にオープンな開発ツールチェインを試してみたくて Lattice iCEstick 1 という シリーズのFPGA評価ボードを買った.これには,Lattice の iCE40 HX1K 2 が載って いる.iCE40 には LP (Low Power), HX (High Performance), LM (Low Power, Embedded IP) というファミリーがある.

iCEstick は$25くらいで買える非常にお手軽なものだが,性能もお手軽なものになっている:

HX1K

HX4K

HX8K

Logic Cells

1280

3520

7680

NVCM

Yes

Yes

Yes

Static Power

296 uA

1140 uA

1140 uA

Embedded RAM Bits

64 K

80 K

128 K

Phase-Locked Loops

1

2

2

iCEstick のIOにはUSB, PMOD(2x6), IrDA, LEDx5 などがある.PMODには様々なコンバー タ 3 があるが,もう少しいろいろつなげたい場合には以下のようなボードも良さそう:

1

iCEstick Evaluation Kit <http://www.latticesemi.com/en/Products/DevelopmentBoardsAndKits/iCEstick>

2

iCE40 LP/HX/LM <http://www.latticesemi.com/Products/FPGAandCPLD/iCE40>

3

秋月電子 Pmod(Digilent) <http://akizukidenshi.com/catalog/c/cpmod/>

Xilinxのプロダクト

  • Xilinxが出しているFPGAは,Spartan, Artix, Virtex, Kintexなどがある.4

  • LUT数や,CLUの密度(e.g. 28 nm),用途などでによって種類とグレードが分かれている

  • SoCカテゴリーにあるZynq には,FPGAとARMの両方が乗っている 5

    • CPU側を,Processing System (PS)

    • FPGA側を,Programmable Logic (PL) と呼ぶ

ひとまずは今使っている MacBook Pro (Retina 13 Early 2015)上のVMで作業するつもり だったので,推奨メモリを満たせそうか一応確認 6 マシンが8GBなので,VMには最大4GBかなという想定.

選択肢にあったZynqはこんな感じ: "Zynq-7000 Memory Recommendations in GB for Vivado | Windows / Linux (64-bit)"

Device

Typical

Peak

XC7Z010

1

1.6

XC7Z020

1.3

1.9

これなら,どちらを買っても問題なさそう.

UltraScale+ とついてるやつとか,Virtex, Kintexになるとかなりのメモリが必要らしい が,そもそも買えない値段なので心配する必要はない.

Zybo Z7を買うことにした: http://store.digilentinc.com/zybo-z7-zynq-7000-arm-fpga-soc-development-board/

秋月に行くとZybo Z7-10の方は売り切れていたので,高くなるがZybo Z7-20を購入. とりあえず,USBケーブルをPROG UARTのところに,HDMLケーブルをTXの方に差して電源を 入れるとLEDが派手に光りながら,動く虹色の柄が画面に表示された.

4

FPGAs & 3D ICs <https://www.xilinx.com/products/silicon-devices/fpga.html>

5

SoCs, MPSoCs & RFSoCs <https://www.xilinx.com/products/silicon-devices/soc.html>

6

Memory Recommendations <https://www.xilinx.com/products/design-tools/vivado/memory.html>

開発環境の準備: Lattice + IceStorm編

(Update: 2018-05-24)

Clifford Wolf 7 が主導しているProject IceStorm のおかげで,Lattice iCE40 には おそらく唯一の完全にオープンソースなFPGA開発ツールチェインが存在している.これを 使うまでのメモ.

最初はZynqを買ったが,今からFPGAでいろいろ試行錯誤しなが遊ぶにはこっちから始める 方が向いている気がする.Xilinxのツールチェインは自分のような初心者にはヘビーすぎ るところがあるので.

ちなみにLattice純正のツールには

がある.がまだ使ってない.

Project IceStorm とは

Project IceStorm 8 はLattice iCE40 FPGAを完全にリバースエンジニアして,

  • ビットストリームのフォーマットのドキュメンテーションを作る

  • ビットストリームファイルを生成/分析できるツールを提供する

ことを目指している.(そして実現している)

Verilog HDL から Bitstream までの流れは IceStorm flow と呼ばれ以下のようなツール で構成されている:

  1. Yosys 9: 論理合成ツール.AKA "LLVM for hardware"

  2. Arachne-pnr 10: BLIFファイルからiCE40向けの配置とルーティング (Place and Route) を行うツール

    Note

    (2018-08-01) nextpnr <https://github.com/YosysHQ/nextpnr> の方が新しくて活発に開発されて るっぽい.

  3. IceStorm: Arachne-pnr が生成したファイルをバイナリに変換したり,実際に書き込 みを行うコマンド群(ice{pack, unpack, prog, time, ...})を提供する

なおこのフローと直接関係はないが,以下のシミュレータもオープンに開発され,広く利 用されている:

  • Icarus Verilog 11

    Icarus Verilog is a Verilog simulation and synthesis tool. It operates as a compiler, compiling source code written in Verilog (IEEE-1364) into some target format. For batch simulation, the compiler can generate an intermediate form called vvp assembly.

  • Verilator 12

    Verilator is the fastest free Verilog HDL simulator, and beats most commercial simulators. It compiles synthesizable Verilog (not test-bench code!), plus some PSL, SystemVerilog and Synthesis assertions into C++ or SystemC code. It is designed for large projects where fast simulation performance is of primary concern, and is especially well suited to generate executable models of CPUs for embedded software design teams.

7

Clifford Wolf <http://www.clifford.at/>

8

Project IceStorm <http://www.clifford.at/icestorm/>

9

Yosys <http://www.clifford.at/yosys/>

10

Arachne-pnr <https://github.com/cseed/arachne-pnr>

11

Icarus Verilog <http://iverilog.icarus.com>

12

Verilator <https://www.veripool.org/wiki/verilator>

Installing on OSX

Macの場合必要:

brew install libftdi0

基本的にはIceStorm のページに書いてある通りにやったらできる. もしビルドにこけた場合は Notes for Installing on OSX <http://www.clifford.at/icestorm/notes_osx.html> に従う.

  • IceStorm Tools (icepack, icebox, iceprog, icetime, chip databases):

    git clone https://github.com/cliffordwolf/icestorm.git
    cd icestorm
    make -j4
    sudo make install
  • Arachne-PNR (the place&route tool):

    git clone https://github.com/cseed/arachne-pnr.git
    cd arachne-pnr
    make -j4
    sudo make install
  • Installing Yosys (Verilog synthesis):

    git clone https://github.com/cliffordwolf/yosys.git
    cd yosys
    
    brew tap Homebrew/bundle
    brew bundle check
    brew bundle
    
    make -j4
    sudo make install

試してないけど,Mac用の便利なツール全部入りスクリプト <https://github.com/ddm/icetools> がある.

Icarus Verilog は brew install icarus-verilog Verilator は brew install verilator で入る.

Note

ビルドする場合 <https://www.veripool.org/projects/verilator/wiki/Installing>:

git clone http://git.veripool.org/git/verilator
cd verilator
# Each build:
unset VERILATOR_ROOT
git pull
autoconf && ./configure
make -j4
sudo make install
# Now see "man verilator" or online verilator.pdf's for the example tutorials

Using Ice Flow

LED点滅の例を動かす.

$ cd icestorm/examples/icestick
$ make
$ iceprog -t
init..
Can't find iCE FTDI USB device (vendor_id 0x0403, device_id 0x6010 or 0x6014).
ABORT.

これが表示される場合は以下のようにチェックして,カーネルエクステンションをアンロ ードする必要がある:

$ kextstat | grep FTDI
  158    0 0xffffff7f83433000 0x7000     0x7000     com.FTDI.driver.FTDIUSBSerialDriver (2.3) ECC3AF36-431D-370D-86F2-5237785E9CF8 <96 39 5 4 3 1>
  165    0 0xffffff7f837ea000 0x7000     0x7000     com.apple.driver.AppleUSBFTDI (5.0.0) D853EEF2-435D-370E-AFE3-DE49CA29DF47 <96 38 5 4 3 1>

$ sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
$ sudo kextunload -b com.apple.driver.AppleUSBFTDI

$ iceprog -t
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x71 0x85 0x32 0x11 0x00 0x27 0x00 0x22 0x11 0x06 0x17 0xEA 0x57
cdone: high
Bye.

$ iceprog example.bin
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x71 0x85 0x32 0x11 0x00 0x27 0x00 0x22 0x11 0x06 0x17 0xEA 0x57
file size: 32220
erase 64kB sector at 0x000000..
programming..
reading..
VERIFY OK
cdone: high
Bye.

これでプログラムが完了し,LEDが点滅する. vim example.vmake && make prog だけでできてしまうという,まるでソフトウェア開発.

Makefileの中で実際に個別のツールが行っていることとは以下:

  1. まずVerilogのソースがある. example.v の中身:

    module top ( input clk, output LED1, LED2, LED3, LED4, LED5);
        localparam BITS = 5;
        localparam LOG2DELAY = 22;
        reg [BITS+LOG2DELAY-1:0] counter = 0;
        reg [BITS-1:0] outcnt;
        always @(posedge clk) begin
            counter <= counter + 1;
            outcnt <= counter >> LOG2DELAY;
        end
        assign {LED1, LED2, LED3, LED4, LED5} = outcnt ^ (outcnt >> 1);
    endmodule
  2. それを論理合成して BLIF ファイルを生成:

    yosys -p "synth_ice40 -blif example.blif" example.v example.blif の一部:

    .model top
    .inputs clk
    .outputs LED1 LED2 LED3 LED4 LED5
    .names $false
    .names $true
    1
    .names $undef
    .gate SB_LUT4 I0=outcnt[0] I1=outcnt[1] I2=$false I3=$false O=LED5
    .attr src "/usr/local/bin/../share/yosys/ice40/cells_map.v:44"
    .param LUT_INIT 0110
    [...]
  3. BLIFファイルと PCF ファイルから,実際のボード上ブロック毎の設定ビット列(の ASCIIテキスト)を吐き出す:

    arachne-pnr -d 1k -p icestick.pcf example.blif -o example.asc example.asc の一部:

    .comment arachne-pnr 0.1+295+ 0 (git sha1 ea2d042, c++ 8.0.0 -O2)
    .device 1k
    .io_tile 1 0
    000000000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    000100000000000000
    000000000000000000
    000000000000000000
    000100000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    000000000000000000
    [...]
  4. このテキストファイルを実際のバイナリファイルへパックする:

    icepack example.asc example.bin

  5. ビットストリームをUSB経由で送って実際にボードをプログラムする:

    iceprog example.bin

BLIF: Berkeley Logic Interchange Format

<https://www.cse.iitb.ac.in/~supratik/courses/cs226/spr16/blif.pdf>

The goal of BLIF is to describe a logic-level hierarchical circuit in textual form.

(PDFを見たら1992年とか書いてある!)

PCF: ボードのPlacement Constraints File

中身はこんな感じでIOの番号とVerilog中のキーワードがマップされている:

set_io LED1 99
[...]
set_io LED5 95
set_io clk 21

タイミング分析は icetime -tmd hx1k example.asc でできる.

example ディレクトリには他にもrs232demoとcheckerというプログラムがあるので, Makefileの先頭の PROJ = ... 編集して同じ手順で試すことができる.

なおyosysコマンドは単体で実行するとインタプリタに入り,そこで様々なコマンドを実 行しながら,結果をインタラクティブに見ることができる.

読み込んだVerilogを変換できる対象はBLIFのみならず firrtl, JSON, spice などにも対 応している.逆にBLIFを読んでVerilogを書き出したり,GraphVizでデザインを表示した りもできて端的に凄すぎる.

yosys-smtbmc というSMTソルバーなんかもあるのでいつか使えるようになりたい...

iCEstick上のCPUでForth処理系を動かす

J1a SwapForth <http://www.excamera.com/sphinx/article-j1a-swapforth.html> というプロジェクトがある.これはJ1aというVerilogで書かれた16bitのミニマルなCPU上 でForth処理系が動かせるというもの.

https://github.com/jamesbowman/swapforth/tree/master/j1a

丁寧な PDFのマニュアル が用意されているのでその通りにすすめればできるように なっている.

こんな感じで動く:

$ git clone https://github.com/jamesbowman/swapforth.git
$ cd swapforth/j1a
$ make mackextunload
$ iceprog j1a/j1a.bin
$ make connect
sudo kextload -bundle-id com.apple.driver.AppleUSBFTDI
sudo python shell.py -h /dev/tty.usbserial-*B -p ../common/
Contacting... established
Loaded 207 words
>1 2 + .
 3  ok
>-1 leds
  ok
>0 leds
  ok
>#bye

このシェルを通じてForthプログラムを実行し,LEDやIrDAセンサーの操作もできる.実際 に,エアコンのリモコンをiCEstickに向けてLEDのオンオフをさせることができた.

Macでやるには1つだけ問題があって, com.apple.driver.AppleUSBFTDI カーネルエク ステンションがロードされていないとFPGAが /dev/tty.usbserial-*B からアクセス できないが iceprog でプログラムするためには,それをアンロードしないといけな い.つまりは,アンロードした状態でプログラムして,ロードしてからシェルを繋げる必 要がある.PDFには書いてないがMakefileにはこれを行う依存関係も用意してくれている ので,上の例ではそれを使っている. (com.FTDI.driver.FTDIUSBSerialDriver は関係なくずっとアンロードしておく)

Makefileの一部:

/dev/tty.usbserial-*B: mackextload

connect: /dev/tty.usbserial-*B
    sudo python shell.py -h /dev/tty.usbserial-*B -p ../common/

mackextunload:
    sudo kextunload -bundle-id com.apple.driver.AppleUSBFTDI

mackextload:
    sudo kextload -bundle-id com.apple.driver.AppleUSBFTDI

いろいろいじってシェルの挙動がおかしくなった場合は,PDFの1.2 Building from scratch を参照にビルドし直せばなおる.

Note

その過程で自分の環境では最初 kextload してもすぐに /dev/tty.usbserial-*B に現れず,USBを抜いて挿し直す必要があった.そうすると2回目以降の make j1a は kextunload が失敗するので make mackextload するか,直接 make -C icestorm j1a する必要がある.

開発環境の準備: Xilinx + Vivado on Arch Linux 編

(Update: 2018-06-13)

Arch Linux を入れたデスクトップマシンにセットアップした.(Arch Linux自体のセット アップのメモは ここ)

開発環境の準備: Xilinx + Vivado on Ubuntu (VirtualBox)編

Warning

(2018-06-13追記) このセクションのメモは2017年10月頃の情報で,バージ ョンは2017.4です.おそらく多くの作業が不要になっているので,注意してください.

Xilinx が提供しているFPGA開発用のソフトは主にISEとVivado 13 がある.

ISEはSpartan-6, Virtex-6やそれ以前のデバイスをサポートしていて,Virtex-7, Artix-7, Zynq-7000以降の新しいデバイスはVivadoを使うように推奨している. つまり,自分はVivadoだけ気にしていれば良いということみたい.

さらにややこしいことにVivadoには以下のようなエディションがある.

(これに加えて全ての機能が体験できる "Free 30-day Evaluation" もある)

この中で,無料なのはWebPACKだけで,有料のSystem Editionなどとの違いはおそらく

くらい.この対応デバイスというのは以下だと書いてある:

つまり,上に含まれているデバイスを買う場合でPartial Reconfiguration (何か知らない)が不要な場合は,WebPACKで何も問題なさそう.

13

Vivado: https://www.xilinx.com/products/design-tools/vivado/vivado-webpack.html


(2017-10-07)

とりあえず手元にはmacしかないが,開発環境となる Vivadoが対応しているのは以下のOSだけなので,VirtualBoxでUbuntu環境を用意する.

参照: https://japan.xilinx.com/support/answers/54242.html

現時点におけるOSサポート: <https://japan.xilinx.com/cgi-bin/docs/rdoc?v=latest%3bt=vivado+release+notes>

注記: 仮想マシン (VM) 環境は正式にはサポートされていませんが、サポート対象のネ イティブ OS に同等する VM では Vivado が問題なく機能するはずです。詳細は、 (Xilinx Answer 67502) を参照してください。

2017.1

  • Windows 7.1: 64 ビット 英語版/日本語版

  • Windows 10.0 Pro: 64 ビット 英語版/日本語版

  • Red Hat Enterprise Linux 6.6-6.8: 64 ビット

  • Red Hat Enterprise Linux 7.2-7.3: 64 ビット

  • CentOS Linux 6.7-6.8: 64 ビット

  • CentOS Linux 7.2-7.3: 64 ビット

  • SUSE Enterprise Linux 11.4: 64 ビット

  • SUSE Enterprise Linux 12.2 64 ビット

  • Ubuntu Linux 16.04.1 LTS: 64 ビット - 追加ライブラリのインストールが必要

注記: 32 ビット マシンは、ハードウェアサーバーのスタンドアロン製品インストーラ ーを介してのみサポートされます。

Ubuntu on VirtualBoxのセットアップ

  • VirtualBox: Version 5.2.4

  • Ubuntu: 16.04.3 LTS

  • Ubuntuのイメージをダウンロード(ubuntu-16.04.3-desktop-amd64.iso 1.59GB) 14

  • Virtualboxで新規VMを作成:

    • Memory size: 4096MB

    • File size: 50GB, VDI, Dynamically allocated

  • Settings > 15

    • System >

      • Processor: 2

      • Acceleration: KVM

    • Display > Screen > Video Memory: 128 MB (Monitor Countを8にすると256MBまで上 げられる)

    • User Interface > Status barは消した

  • Startを押してダウンロードしたイメージを設定

    • Ubuntuのインストールは全部デフォルトで,ユーザ名とパスワードだけ設定

  • Menu > Devices

    • Shared clipboard, Drag and drop: bidirectional

    • Shared folder > パス設定, Read only, Auto mount

    • Insert Guiest Additions CD Image で何かをインストールし再起動

  • 共有フォルダはpermission errorが出るので,sudo adduser gentam vboxsf でグループに追加してあげる必要がある

14

Ubuntu <https://www.ubuntu.com/download/desktop>

15

Oracle VM VirtualBox User Manual <https://www.virtualbox.org/manual/> 3.4. System settings > Chipset: ICH9の方がモダンでPCIeとかに対応してるが, 実験的だから必要じゃなかったらおすすめしない的なことが書いてある

次にUSB接続したFPGAボードをUbuntu側で認識できるようにしなければいけない.

  • VirtualBox Extension Pack をイ ンストール

  • もし上の共有フォルダ設定でユーザを vboxusers に追加していなかったらUSBの利 用に必要らしいので追加する.

Note

上のリンクからだと5.2.0用のExtension packがダウンロードされるが, 自分は最初5.1.3だったので以下のようなエラーが出た: Reason: Incompatible library version: VBoxPuelMain.dylib requires version 5.2.0 or later, but VBoxVMM.dylib provides version 5.1.30.

5.1.3を使い続けたい場合はここから <https://www.virtualbox.org/wiki/Download_Old_Builds_5_1> 古いExtension Packをダウンロードしてインストールする.自分はVirtualBoxのバージョンを上げた.

  • 次にVirtualBox ManagerページからSettings > Ports > USB へ行き,USB 2.0を選択. 右下の追加ボタンから,Digilent Adept USB Device [0700] を選択

これでVMを立ち上げて認識できるか確認する:

$ ls /dev/serial/by-id/
usb-Digilent_Digilent_Adept_USB_Device_210351A6C9E3-if00-port0
usb-Digilent_Digilent_Adept_USB_Device_210351A6C9E3-if01-port0

vivadoを立ち上げてHardware Managerからも認識できることを確認.

Vivadoのセットアップ

Update 2017-01-05: Dec 20, 2017 にVivado 2017.4 が出ていたので手順を更新

以下の作業はVirtualBox上で行う.

  • Vivado Design Hub - Installation and Licensing を参考にインストール

  • Xilinxのアカウントを作成: https://www.xilinx.com/registration/create-account.html

  • インストーラをダウンロード: https://www.xilinx.com/support/download.html

    • Vivado Design Suite - HLx Editions > Vivado HLx 2017.4: WebPACK and Editions - Linux Self Extracting Web Installer (BIN - 100.7 MB)

  • Mac側でダウンロードした場合は,設定したshared folderを通じてコピーして実行:

    $ chmod +x Xilinx_Vivado_SDK_Web_2017.4_1216_1_Lin64.bin
    $ sudo ./Xilinx_Vivado_SDK_Web_2017.4_1216_1_Lin64.bin
    • "Download and Install Now"

      • Design Tools

        • Vivado Design Suite > Vivado

        • SDK

          • SDK Core Tools

          • Compiler Tool Chains > MicroBlaze, ARM Cortex-A9

      • Devices

        • Production Devices > SoCs > Zynq-7000

    • これだけチェックをつけて,disk space required: 23.32GB

    • 4.61GB ダウンロードされインストールが完了するのを待つ.約30Mbpsの環境で合計 約40分かかった.コンパイル中みたいにかなりCPU負荷が高い状態が維持された.

    • ダウンロードフォルダは容量を食うので削除した (/opt/Xilinx/Downloads/Vivado_2017.4)

必要な変更:

$ sudo chown -R gentam. /opt/Xilinx/Vivado/2017.4/bin
$ sudo chown -R gentam. /opt/Xilinx/SDK/2017.4/bin
$ sudo chown -R gentam. ~/.Xilinx
$ cd /opt/Xilinx/Vivado/2017.4/data/xicom/cable_drivers/lin64/install_script/
$ sudo ./install_drivers
# ちなみに上のコマンドでZyboのDigilent用のドライバもインストールされるっぽい

# .bashrc に以下を追加する
    /opt/Xilinx/Vivado/2017.4/settings64.sh
    PATH=$PATH:/opt/Xilinx/Vivado/2017.4/bin:/opt/Xilinx/SDK/2017.4/bin
$ . ~/.bashrc
  • vivado & で起動する

DocNavで何も開かない問題

https://www.xilinx.com/support/answers/66184.html

DocNav には 32 ビット ライブラリが必要です。このライブラリは OS にインストー ルされていない場合があります。

らしいので以下でインストール:

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y lib32stdc++6 libgtk2.0-0:i386 libfontconfig1:i386 libx11-6:i386 libxext6:i386 libxrender1:i386 libsm6:i386 libqtgui4:i386

これで,ちゃんとFirefoxが開いてくれるようになった.

SDKでのエラー

MicroBlaze 上でプログラムを動かすためにSDKでビルドしようとすると以下のようなエラーが出た:

14:28:01 ERROR      : (XSDB Server)ERROR: [Hsi 55-1545] Problem running tcl command ::sw_standalone_v6_5::post_generate : couldn't execute "mb-ar": no such file or directory
    while executing
"exec $archiver -d $libgloss_a _interrupt_handler.o"
    (procedure "::sw_standalone_v6_5::post_generate" line 18)
    invoked from within
"::sw_standalone_v6_5::post_generate standalone"
14:28:01 ERROR      : (XSDB Server)ERROR: [Hsi 55-1443] Error(s) while running TCL procedure post_generate()
14:28:01 ERROR      : (XSDB Server)ERROR: [Hsi 55-1450] Error: running generate_bsp.
14:28:01 ERROR      : Error generating bsp sources: Failed in generating sources

これは mb_ar (がリンクしている microblaze-xilinx-elf-ar) の実行に32bitのライブラリが必要らしい. ここの質問で解決した.<https://forums.xilinx.com/t5/Embedded-Development-Tools/Vivado-2016-1-SDK-launch-problem/m-p/723036#M40206>

解決手順:

gentam@ubuntu-vbox:~$ locate mb-ar
/opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/mb-ar
gentam@ubuntu-vbox:~$ file `locate mb-ar`
/opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/mb-ar: symbolic link to microblaze-xilinx-elf-ar
gentam@ubuntu-vbox:~$ file /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar
/opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=fe93d08b6e062269d85a24b7ac968ab4d782ad46, not stripped
gentam@ubuntu-vbox:~$ /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar --version
bash: /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar: No such file or directory
gentam@ubuntu-vbox:~$ ldd /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar
    not a dynamic executable
gentam@ubuntu-vbox:~$ sudo apt-get install libc6-i386
gentam@ubuntu-vbox:~$ /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar --version
GNU ar (crosstool-NG 1.20.0) 2.27.0.20161104
Copyright (C) 2016 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.
gentam@ubuntu-vbox:~$ ldd /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-ar
    linux-gate.so.1 =>  (0xf7f90000)
    libdl.so.2 => /lib32/libdl.so.2 (0xf7f71000)
    libc.so.6 => /lib32/libc.so.6 (0xf7dbd000)
    /lib/ld-linux.so.2 (0xf7f92000)

libc6-i386のインストールでmb-arは使えるようになったが,その他にもない32bitライブ ラリ達をインストールしておく.(lib32stdc++は上のDocNav問題でインストール済みだったらいらない):

gentam@ubuntu-vbox:~$ for f in /opt/Xilinx/SDK/2017.4/gnu/microblaze/lin/bin/microblaze-xilinx-elf-*; do ldd $f ; done | grep "not found" | sort | uniq
    libgcc_s.so.1 => not found
    libncurses.so.5 => not found
    libstdc++.so.6 => not found
    libtinfo.so.5 => not found

$ sudo apt-get install lib32stdc++6 lib32tinfo5 lib32ncurses5

その他 resources

Zybo Z7 関連

  • Board Files 16 をダウンロード,展開

  • zyboのボードファイルを追加するとVivadoからZyboのボードを選べるようになる 17:

    sudo cp -R vivado-boards-master/new/board_files/zybo-z7-20 /opt/Xilinx/Vivado/2017.4/data/boards/board_files/
  • プロジェクトを作る際にはXDCファイル(constraints)を設定するのでここからダウンロード <https://github.com/Digilent/digilent-xdc>:

    $ wget https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Zybo-Z7-Master.xdc

resources:

16

https://github.com/Digilent/vivado-boards/archive/master.zip

17

https://reference.digilentinc.com/reference/software/vivado/board-files

SDKを使ってMicroBlaze上でプログラムを動かす

(2018-03-01)

4コアで並列に足し算をさせて,単一コアでやる場合と比べて速度がどう変わるかという 単純な実験をしてみた.

ここでは,それぞれがローカルメモリを持ったMicroBlazeを4つ並べ,1つの共有メモリを 介してメッセージをやりとりするようにした.

https://i.imgur.com/Bs256nr.png

https://github.com/gentam/mbm

Zybo-Z720 PS部でLinuxを動かす

(2018-06-27)

Links:

PetaLinux Tools のインストール

ここから PetaLinux 2017.4 Installer (TAR/GZIP - 7.86 GB) をダウンロードした. https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2017-4.html

このインストーラは巨大なバイナリの先頭にシェルスクリプトがくっついているというも のみたい.

はじめは最新の2018.2を入れたが,上記のDigilentが提供しているBSPは2017.4 みたいだ ったので,一応入れ直した. (下に書いてあるSDカードの問題で動かなくてバージョンを 変えてみたりしていただけなので,2018.2でも問題なく動くかも)

インストールコマンドを走らせる前にReference Guide(UG1144)のInstallation Requirementsで特に,必要なパッケージを確認しておく.

自分はこれらのパッケージがなくてやり直す羽目になった. (こういうときに archlinux だとaptとパッケージ名が違うのはちょっと面倒なので, Ubuntuでやればよかったと若干 後悔してる)

新たに入れたパッケージ:

  • netstat

    • -> archlinuxではdepricated になって ssの利用が推奨されている. yay netstat しても netstat-nat, netactviw しか出てこないのでファイル検索 をする:

      sudo pacman -Fy
      pacman -Fs netstat
        core/net-tools ...
      sudo pacman -S net-tools
      which netstat
        /usr/bin/netstat
  • diffstat

  • xvfb-run

    • packageは xorg-server-xvfb

  • chrpath

  • socat

  • xterm

  • pax

    • AURのpaxはビルドがこける(2018-06-27時点),petalinuxのインストール時のエラー メッセージはcpioが無い,というものだったのでとりあえず yay cpio でうまく いった.

  • tftpサーバがないというエラーメッセージが出るが,ネットブートは使わなさそうなさ そうなので無視した

/opt/pkg/petalinux にインストールした.Xilinxのドキュメントには権限が755なら どこでもいいと書いてあるが,DigilentのREADMEにはこれ以外の場所にインストールする とエラーが出る場合があると書いてある.

なおrootではインストールできないようになっている.またインストール後に場所は変え られないらしい.

chmod +x ./petalinux-v2017.4-final-installer.run
sudo -s
mkdir -p /opt/pkg/petalinux
chown gentam /opt/pkg
chown gentam /opt/pkg/petalinux
./petalinux-v2017.4-final-installer.run /opt/pkg/petalinux

ライセンスに同意していくとインストールが始まり,うまくいけば8分くらいで完了した .(結局上のパッケージ不足などで3回くらいエラーでこけてやり直した)

以下のファイルをソースすると,パスに追加してくれる.このとき,zshを使っていると エラーが出て失敗するので,bashに切り替える必要がある.

source /opt/pkg/petalinux/settings.sh
source /opt/pkg/petalinux/components/yocto/source/environment-setup-*

petalinux-util --webtalk off (オプショナル)

Boot用SDカードの作成

まずは,pre-build イメージで起動できるか試す.

https://github.com/Digilent/Petalinux-Zybo-Z7-20/releases から最新のBSPをダウン ロード(最初はPetalinux Project for Zybo Z7-20 v2017.4-1. ダウンロードしてすぐに 4-2が出ていたので更新)

petalinux-create -t project -s Petalinux-Zybo-Z7-20-2017.4-2.bsp

これで Zybo-Z7-20というプロジェクトディレクトリができる.

次にSDカードに2つのパーティションを作る.ブート用のFAT32とルートファイルシステム の ext4.BOOTパーティションに BOOT.bin と image.ub を入れるのでそのサイズ合計を 見てとりあえず64MBを割り当てた.

Note

自分は初め64GBのSDXCを使っていたが,下の手順を行ってZyboを起動してもDONEのLED すらつかない状態になって結構時間を無駄にした. パーティションのサイズを変えたりいろいろ試したけど,結局2GBのSDHCカードを研究 室で貸してもらったら同じ手順で一瞬で起動した.

確認すると,Zynqは公式には32GB以上のSDカードに対応していないと書いてあるらしい. (ただ普通に64GBでも起動できた言ってる人もいるのでよくわからない <https://forums.xilinx.com/t5/Embedded-Processor-System-Design/Booting-Zynq-from-a-64GB-SD-Card/td-p/555049>)

lsblk # /dev/sdX を確認する
sudo fdisk /dev/sdb
  p   # 確認
  n   # 新規
    Select: <Enter>
    Partition number: 1
    First sector: <Enter>
    Last sector: +64MB
  a   # ブート用に選択
  n
    Select: <Enter>
    Partition number: 2
    First sector: <Enter>
    Last sector: <Enter>

mkfs.vfat -F 32 -n BOOT /dev/sdb1
mkfs.ext4 -L root /dev/sdb2

パーティショニングとフォーマットができたら,起動に必要なファイルをコピーする:

sudo mount /dev/sd1 /mnt/boot
sudo cp Zybo-Z7-20/pre-built/linux/images/BOOT.bin /mnt/boot
sudo cp Zybo-Z7-20/pre-built/linux/images/image.ub /mnt/boot
sync
sudo umount /mnt/boot

これで,ブート用のSDカードができたのでZyboにさして,起動ジャンパーをSDに変更する .また,Digilentのページに電力が足りないかもしれないと書いてあるので電源ジャック をつなげて,パワーのジャンパーをWALLに変更.

これで電源を入れて sudo screen /dev/ttyUSB1 115200 すると起動ログの後にプロ ンプトが表示されるはず. (起動ログ: https://gist.github.com/gentam/3358ea75a5d85d7143386091cdd3eaea)

root@Zybo-Z7-20:~# uname -a
Linux Zybo-Z7-20 4.9.0-xilinx-v2017.4 #1 SMP PREEMPT Fri Jun 29 18:01:15 PDT 2018 armv7l GNU/Linux
root@Zybo-Z7-20:~# cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 0 (v7l)
BogoMIPS        : 666.66
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

processor       : 1
model name      : ARMv7 Processor rev 0 (v7l)
BogoMIPS        : 666.66
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

Hardware        : Xilinx Zynq Platform
Revision        : 0003
Serial          : 0000000000000000
root@Zybo-Z7-20:~#

ちなみに,作業していたデスクトップマシンにSDカードスロットがなかったのでMacBook でやろうとしたが,fdiskの勝手が違うようなだったので https://www.storange.jp/2017/04/virtualboxsd.html を参考にVirtualBox上のLinuxか ら作業したが問題なかった.(BOOT.binとimage.ubだけをデスクトップからMacBookにコピ ーして,パーティショニングと書き込みだけmac上のvirtualboxからやった)

Learn HDL

ハードウェア記述言語HDL (Hardware Discription Language)とは,信号の流れによって 並列的に動作するハードウェアを記述するために開発された言語である.

—Verilog-HDL言語入門

代表的なHDLにはVHDLとVerilogがある.しかし今から学ぶならVerilogが良いと聞いたの でVerilogを学ぶことにする.

ちなみにこの2つを比較すると,Verilog-HDLはLSI設計の記述性を重視した言語で,記述 が容易で短く書ける傾向にあり,ゲートレベル・シミュレーションの機能も充実している. 一方VHDLは設計仕様のドキュメント言語として開発されたため,可読性に優れ仕様の曖昧 さを排除した厳格な言語.Verilogと比べると記述は長くなる傾向という感じらしい.

またVerilogを学習するためにいちいちVivadoでコンパイル的なことをするのは面倒な ので,シミュレーションソフトを使うと良いらしい.

Macで動くおすすめは Icarus Verilog <http://iverilog.icarus.com> と聞いた.

brew install icarus-verilog で入る

$ iverilog hello.v
$ ./a.out

Verilogの文法を軽く調べたが,そもそも回路の配線を記述するイメージがつかめていな い気がしたので,基礎から勉強しようと考えて コンピュータシステムの理論と実装 を始めた.

(約2週間後) nand2tetris (↑)のハードウェア編を終えて,論理回路レベルからCPUをデザ インすることが理解できたと感じたので,改めてVerilogの学習を再開.

Verilog

Verilog-HDL 言語入門 という本を借りたので,まずはそれを一通り読んでみる. 以下自分用のメモ.

モジュールの構造,基本的な構文要素,字句の規約,データタイプ,階層構造のそれぞれ について概要をまとめる.

モジュール

モジュール

HDLを記述する際の基本単位.一つのモジュールから他のモジュールを呼び出して, 階層設計を実現できる.モジュールごとにファイルを分割してもいいし,しなくても いい

module モジュール名 (ポート・リスト);

    モジュール本体

endmodule

ポート・リスト ::= ポート名 {, ポート名}
モジュール本体 ::=
| 入出力ポート宣言
| データタイプ宣言

| パラメータ宣言
| 変数/ネット宣言

| initial 手続きブロック
| always 手続きブロック
| 継続的代入文

| コンポーネント・インスタンス
| プリミティブ

全ての回路は最上位モジュールから始まるため,最上位モジュールは通常,外部に接続す るポート・リストを持たない.

モジュールの記述例

`timescale 100px / 10px             // 時間単位と時間制度の設定
`define ON 1'b1                     // テキスト・マクロ宣言
`define OFF 1'b0

module COMPARE(A, B, GT, LE, EQ);   // モジュール宣言
    input[7:0] A, B;                // 入出力ポート宣言
    output GT, LE, EQ;

    reg GT, LE, EQ;                 // データタイプ(変数)宣言

    always @(A or B) begin          // 順次処理文
        GT = 0; LE = 0; EQ = 0;     // 変数代入
        if (A > B)                  // 条件文
            GT = 1;
        else if (A < B)
            LT = 1;
        else
            EQ = 1;
    end
endmodule

module MUX2(Y, DATA, SEL);          // マルチプレクサを記述
    output[3:0];
    input[7:0] DATA;
    input SEL;

    always @(DATA or SEL) begin
        if (SEL == `ON)             // テキストマクロの使用
            Y = DATA[7:4];          // ベクタのパートセレクト
        else if (SEL == `OFF)
            Y = DATA[3:0];
        else begin
            $display("Illegal value of SEL signal"); // システム・タスク
            Y = 8'bx;               // 不定値の出力
        end
    end
endmodule

module IO_BUF(PAD, OUT, IN EN);     // IOバッファ記述
    inout PAD;
    output OUT;
    input IN, EN;
    tri OUT;                        // データタイプ(ネット)宣言

    parameter delay = 1;            // パラメータ宣言

    bufif1 #delay (PAD, IN, EN);    // プリミティブ呼び出し
    assign OUT = #delay PAD;        // 継続的代入分
endmodule

基本的な構文要素

入出力ポート宣言

ポート・リストのポートは,入出力ポート宣言で方向(モード)を指定する. MSBとLSBの順番はどちらが先でもいい.ベクタの場合は幅を指定する.

入出力ポート宣言 ::=
モード <[MSB:LSB]> ポート名 {, ポート名};
*モード := input | output | inout
データタイプ宣言

レジスタ (reg),整数(integer),実数 (real) がある. ネットは,wire, tri 等があり,論理値は,1 | 0 | x (不定) | z (ハイインピーダンス)

パラメータ宣言

程数値や程数式を宣言する.変数と違ってシミュレーション中で変更されない. 上位の階層から,defparam で書き換えられる

動作構文(手続き分)

動作はイベントや遅延に基づいて実行される. initial 文,always 文,継続的代入文などを用いて記述する. initial文は一度だけ,always文は何度でも実行される.

プリミティブ

以下のようなプリミティブが用意されている. 論理ゲート: and, or, xor, not.スリーステート・ゲート: bufif1, notif1. 単方向/双方向スイッチ: nmos, pmos, cmos, tran, tranif1.

字句に関する規約

コメント:

// 一行コメントと
/* 複数行コメント
   がある */

識別子:

使用可能文字: a-z, A-Z, 0-9, $, _
ただし最初の文字はアルファベットかアンダースコア
基本的には case sensitive
\ (バックスラッシュ)で,任意のアスキー文字による識別子を定義できる.
エスケープはスペースで終了.
予約語

全ての予約語は小文字で定義されている.そのため大文字であれば定義できるが やめた方がいい.

定数:

サイズ'基数 値
基数はそれぞれ,10進数 -> d | 16 -> h | 8 -> o | 2 -> b
数値には読みやすさのためにアンダースコアを入れられる.
例:
    4'b1001
    16'h7a5f
    16'b1001_0111_0011_1011
    8'o356_021

または,実数(real)でもいい.64bitの倍精度浮動小数点.
小数点の両側に少なくとも1つの数値が必要.
例:
    697
    2786.361
    -27.0
    2.0e9
    34E-8
    586_148_255

文字列:

"" (二重引用符)で囲まれた文字列.一文字は8bitなので,8*n bitのレジスタに
定数として保存できる
例:
    "Hello World!!"
    reg[8*8:1] = outfile = "sim1.out"
    $strobe("Time =%f  Data = %d", $realtime(1), data);
コンパイル指示子

`(バッククオート) から始まる名前はコンパイル指示子. 例えば,テキストマクロ(`define)を使って任意の名前で置換できる.

システムタスク

$ から始まる名前はシステムタスクとして解釈される.例えば, $display はデータの出力,$stop$finish はシミュレーションの 実行制御を行う.

データタイプ

ポートや変数,モジュール内のネットに対してデータタイプを宣言する. 変数には,レジスタ(reg),整数(integer),実数(real) があり値を格納できる.

論理値:

0: 論理値0,または条件のFalse
1: 論理値1,または条件のTrue
x: 不定値
z: ハイインピーダンス
ネット(wire)

ネットはモジュールやゲート同士を接続する物理的な状態を示し, 常にゲートや継続的代入文によってドライブされる.ドライブされていない時には ハイ・インピーダンス状態になる.(ただしtriregは,電荷を保持する)

ネットタイプ <[MSB:LSB]> <電荷ストレングス> <遅延>  ネット名;

ネットタイプ ::= wire | wand | wor | tri | triand | trior |
                 tri1 | tri0 | trireg | suply0 | supply1
電荷ストレングス ::= small | medium | large

通常論理合成可能な記述で使用するネットタイプはwireである. 他のタイプはゲートレベルモデリングで使用することが多い.

レジスタ(reg)

レジスタは一度代入されてから,次に代入されるまでの間データを保持する. レジスタへの代入は,initial文,always文,サブ・プログラム内の手続きブロック 内でのみ実行できる

reg <[MSB:LSB]> レジスタ名;
ベクタ

変数やネットに対して,サイズや幅の指定としてベクタが宣言できる. ベクタの幅を制定していないネットやレジスタは1ビット幅として宣言される

[MSB:LSB]

例:
    reg[15:0] A;
    reg[width-1:0] data;
    wire[98:89] B;

    A[7] // ビット選択
    A[7:4] // パート選択

MSB, LSBは正の整数でどちらが大きくてもいい.

配列

配列(array)宣言により,ROM/RAM,PLAなどをモデル化できる. インデックスは一次元配列.

reg[MSB:LSB] 配列名 [アドレス式:アドレス式];

例:
    reg[15:0] mem[0:255];

上の例は,16bit幅で,インデックスが0-255までのメモリ mem を表す.

整数(integer)と実数(real)

汎用的な値を保持するためのレジスタ変数として宣言する. 整数は32bitのレジスタとして定義され,範囲は-2^31から2^31-1. 実数は64bitの倍精度浮動小数点数の精度.

integer 識別子;
real 識別子;
パラメータ

変数と違って,手続き文内で変更できない.多分イメージとしては C言語の#define.

parameter 代入文のリスト;

例:
    parameter width = 4;
    input[width-1:0] A, B;

    parameter S0 = 4'b0001, S1 = 4b'0010;

階層設計

大規模な回路設計では回路をいくつかのサブ回路に分割する.サブ回路は上位からコンポ ーネントとして呼び出す.これをインスタンス化といい,このような設計手法を階層設計 という.

モジュールのインスタンス化

インスタンス化した別のモジュールと内部のネットを接続することで階層構造を構築 する.このときに下位モジュールのパラメータ値をインスタンスに固有な値として上 書きできる.ポート接続は,入出力ノードリストをカンマ区切りで()で囲む.

モジュール名 <#(パラメータ割り付け)> インスタンス名 (ポート接続);
モジュール・インスタンスでのパラメータ設定

インスタンス化の際に,#() の中に値を設定することで指定できる. これは,モジュール内でパラメータが宣言された順序と一致させなければいけない.

ポート順接続と,ポート名接続.パラメータ設定の例:

以下のようなモジュールに対して
    module COMPARE(GT, LE, EQ, A, B);
        parameter width = 1;
        ...
    endmodule

ポート順接続は単に順番でマッチ
    COMPARE U0 (gt, le, eq, a, b);

ポート名接続は名前を明示する
    COMPARE U0 (.GT(gt), .A(n1), .B(n2));

パラメータwidthを書き換える
    COMPARE #(16) (.LE(le), .A(n1), .B(n2));
defparam 文による書き換え

defparam文を使うと,階層構造を通じてパラメータを設定できる. つまり,モジュール内でインスタンス化されるモジュールのパラメータなど より下位の階層まで設定することが可能.

defparam 階層パラメータ名 = 値

階層パラメータ名は,
    モジュール名.インスタンス名.パラメータ名

例: topモジュールの下に,vsrcインスタンスがあり,
その下のu1にKというパラメータがある場合.
    top.vsrc.u1.K = 1;
で書き換えられる.

演算子

演算子はC言語のそれに近い.

特に違う点をメモ

関係演算子:

==, !=
    比較する値の中に不定値(x)やハイインピーダンス(z)含まれていると,
    結果も不定(x)なる.
    4b'0001x == 4b'0001x はx

===, !==
    はxやzも独立した値としてビットごとに比較される.
    4b'0001x === 4b'0001x は 1(TRUE)
リダクション演算子

~, &, |, ^, ~^ は1つのオペランドに対してビットごとに演算を実行して1ビッ トの結果を返す,リダクション演算子として使うことができる.ビット列への fold みたいな.

A = 4b'0010;
X = &A; // AND: 0
X = |A; // OR: 1
X = ^A; // XOR: 1
連結演算子

{} はオペランドごとのビットを結合する.例を見た方が早い.

{4{EN}} -> {EN, EN, EN, EN}
{A, 2{B, C}}  -> {A, B, C, B, C}

オペランド

式中で使用できるオペランドは以下

  • 定数

  • ネット

  • レジスタ

  • ネットの ビット | パート 選択

  • レジスタの ビット | パート 選択

  • メモリ

  • ファンクション

  • 上記の任意の連結

例:

A[15:8] ^ B[15:8]
A[7:0] & 8'b00001111;
A | mem[17]

だいたい基本は抑えたし,せっかくなので例も参考にしながら, nand2tetris に出てきたHack CPUをVerilogで書いてみる. 途中 <https://github.com/gentam/cpu-nand2tetris>

SystemVerilog

SystemVerilog における割り当ての使い分けガイドライン 18

  1. 同期型順序回路を構成するには,常に always_ff @(posedge clk)ノンブロッキング 割り当てを使う

    always_ff @(posedge clk)
      begin
        n1 <= d;
        q <= n1;
      end
  2. 単純な組み合わせ回路を構成するには,継続割り当てを使う

    assign y = s ? d1 : d0;
  3. always文を使うと記述が楽になる複雑な組み合わせ回路を構成するときには, always_combブロッキング 割り当てを使う

    always_comb
      begin
        p = a ^ b;
        g = a & b;
        s = p ^ cin;
        cout = g | (p & cin);
      end
  4. 同じ信号に対する割り当てを,複数のalways文継続割り当て文で行わない

回路の動作をイメージしないと,なんとなく組み合わせ回路は全て並列に動くから ノンブロッキング割り当てで,順序回路は実行順序があるからブロッキング割り当てか, などと逆に考えてしまったので注意.

1のシンクロナイザの例をブロッキングで書くと q = n1 が評価されるとき n1 は既に d となっているため, q = d と同じ意味になり n1 は内部変数とし て消されてしまう.

3の全加算器の例はノンブロッキングにしても同じ結果になるが,シミュレーションは pの値が更新されていない段階と,された段階で2回評価されて遅くなる. また,@always (a, b, cin) などのよう書き,センシティビティリストにpを含める のを忘れてしまった場合に間違った結果となる.

18

DDCA2e p199


用語集

FPGA関連でよく出てくる略語など. 主にFPGAの原理と構成 1.4 参照.

ASIC

Application Specifig Integrated Circuit. 特定用途向けの集積回路の総称. プログラマブルではない. FPGAと比較して設計や生産に時間とお金がかかるが, より低電力・小規模・高クロックなどの特製を実現できる傾向にある. しかし,FPGAの方が微細化を進めていて,今後プロセス技術に3~4世代以上の差がつく ためASICと競合できる性能になると予想されている.

DSP

Digital Signal Processor. デジタル信号処理に特化したプロセッサで,積和演算を高 速に連続実行できる.FPGAにはDSPブロックと呼ばれるハードマクロが多数実装されて いる.これは高速な乗算器で構成されている.

EEPROM

Electorically Erasable and Programmable ROM. 電源を断っても記録内容が消えない 不揮発性メモリの一種で,ユーザによって書き込みできる.

HDL

Hardware Description Language. ハードウェア記述言語はハードウェアの動作と接続 を記述するプログラミング言語のこと.Verilog HDL と VHDL が業界標準として広く普 及している.他にもScalaベースの Chisel, SpinalHDL や,Haskellベースの Bluespec 等がある.

IP

Intellectual Property. 「知的財産権」の意味だが,半導体分野ではCPUコアなどの機 能ブロックをIP(設計資産)と呼ぶ.テスト済みのIPを利用することで効率的に回路設計 ができる.

LUT

Look Up Table. 所望の関数の真理値表を少量のメモリに保持して組み合わせ回路を実 現する構成要素.

RTL

Register Transfer Level. トランジスタや論理ゲートよりも高い抽象度で,HDLを用い て論理回路を設計する際の抽象度のこと.

SoC

System on Chip. 多彩な機能を1個のLSI上にシステム化して実現する方式.従来のLSI は処理ロジック,メモリ,インターフェイスなどの機能別に分かれていた.

SRAM

Static Random Access Memory. 揮発性のRAMで,DRAMと異なり定期的なリフレッシュが 不要であるため,スタティックと呼ばれる.

HLS

High Level Synthesis. 高位合成とは,C言語のような高レベルの言語で記述したプロ グラムから, RTL記述を自動的に合成する工程のこと.

Logic Synthesis

論理合成は,VerilogやVHDLなどのHDLで書かれたRTL記述から,AND, ORなどのゲートレ ベルのネットリスト(ゲート間の配線情報)へ変換する工程.

評価ボード

FPGAチップを単体で手に入れても扱いに困るので, IOポートとかいろいろを事前につけてくれているボード