Category: 技術的なこと

Xilinx SDK (xsdk) をdocker on CUI環境で動かす

xsdk –batch とかで動かせばいいということになっていたが,コケる.中身がEclipseなのでさすがという感じ.

環境はDocker on Ubuntsu Server 14.01 LTS.

まずは

Could not load SWT library.

とかログを吐かれてコケるので,必要なパッケージ(gtk)を入れる.

libgtk2.0-0
libxtst6

あたりで自分は足りた.

次に

No more handles [gtk_init_check() failed]

でコケる.調べるとXが無いからだそうな.いやいや,CUIで,バッチモードで動かしてるんですけど…
良さそうなオプションを探したけどなかったので,vncを立ち上げてあげることにする.世界はCUI環境にやさしくない.

x11vnc
xvfb

あたりを入れて,

export DISPLAY=:1
Xvfb :1 -screen 0 1280x800x16 &
sleep 1
x11vnc -display :1 -bg -nopw -forever -xkb &
sleep 1

とかする.これで回避できる.
https://ubuntuforums.org/showthread.php?t=1740572

こんどは

arm-xilinx-eabi-gcc: No such file or directory

でコケる.これはXilinx Answerがあるので,従って追加のパッケージを入れるようにする.
apt-get前に

dpkg –add-architecture i386

を行なうのを忘れずに.
https://japan.xilinx.com/support/answers/63561.html
http://agekuno.hatenablog.com/entry/2014/10/22/190712

 

余談ですが,「no more handles gtk init check」とかでググるとissueが5万件くらいでてきてすごい.

Dockerのむずかしいところ

未だに思想がわからない.

 

Dockerまわり

コンテナのライフサイクル

コンテナには,存在しない/停止中/起動中の3パターンの状態があり,この状態に依ってコマンドの挙動がかわる.ややこしい.

run
指定した名前のコンテナが存在しない場合,イメージからコンテナを作成する.
指定した名前のコンテナが存在する場合,古いイメージのまま起動する.
指定した名前のコンテナが起動中の場合,なにもしない.

start
指定した名前のコンテナが存在しない場合,起動できない.
指定した名前のコンテナが存在する場合,起動する.
指定した名前のコンテナが起動中の場合,なにもしない.

起動中のコンテナを新しいイメージで立ち上げ直したい場合,
停止(kill or stop)→削除(rm)→立ち上げ(run)を行う必要があるので注意する.

https://fa-works.com/blog/visualizing-docker-containers-and-images

exec

コンテナが出すメッセージが読みたい場合,-itを付ける.ホストのSTDIN,STDOUTと接続する.
読みたくない場合,何もつけない.
バックグラウンドで実行したい場合,-dをつける.

http://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560

 

パーミッション

結論として,完全自動のバッチ処理を行うコンテナを作りたい場合,dockerの中では一般ユーザーを作らないほうがいい.
理由はdocker cpによってコピーしたファイルのオーナーがrootになるため.
ホストから与えた入力ファイルはオーナーがrootのため一般ユーザーが触ることができない.
触りたい場合一般ユーザーでchownすることになるが,root権限を要求され,パスワード入力が必要となり自動化できない.
sshの暗号鍵などもchmodする必要があるが同様の理由で大変.
回避方法として,①Docker buildした後ある程度手作業をしてcommitしたイメージを使う②一般ユーザーにroot権限を与える
の二つがあるが,どちらも非常に面倒臭いので全てrootで実行する方が楽.

ネットワーク

コンテナ郡は仮想ブリッジdocker0を介してホストとつながる.
ホストから見て,コンテナは172.17.x.xとかにいる.
コンテナから見ると,ホストは192.168.x.xとかにいる.
ホストのローカル127.0.0.1で立ち上げたファイルサーバーとかは,コンテナから192.168.x.xでアクセスする.

http://qiita.com/Arturias/items/b538e6bbf05dd3364397

その他のTips

docker execとコンテナ内でのバックグラウンド実行

docker exec nohup cmd1 &
docker exec nohup cmd2

のようなケースを考える.cmd2の実行時にcmd1がバックグラウンドで動作していることを期待するが,そうはならない.
期待した動作を実現するためには,

docker exec bash –c ‘cmd1 & cmd2’

のようにする.どうやらexecが終了すると,サービスなどは全て終了すると考えて良さそう.
環境変数の設定も同様で,逐一実行時に与えるか,dockerfileのENVで記述してしまうのが良い.

なお,docker exec –d でどういう結果になるかは未調査.

Pythonでバッチ処理をすばやく書く

以前からPythonでバッチ処理を書くことは多くて、書き方の最適解を模索していたのだけどだいたい固まってきたのでメモ。

シェルを叩く

コマンドラインに表示したいときは
subprocess.call(command, shell=True)

コマンドラインに表示したくないときは
log = subprocess.check_output(command,shell=True,stderr=sp.STDOUT)

 

パス名などの環境変数にすばやくアクセスする

クラスを使うと便利。ドットアクセスで記述でき、ローカル変数として取ってくる(後述)のも1行で済むので楽。

 

.format()を使いこなす

シェルに投げるコマンド文を生成するとき、.format(**locals())を使って文字列中に変数を楽に埋め込める。
パス名などの環境変数をグローバルスコープに書いてしまうとlocals()では引っ張ってこれないが、クラスに纏めておけば、そのクラスのインスタンスを一つローカルスコープに宣言するだけでlocals()から引っ張ってこれるので楽ちん。

 

サンプル

以前書いたやつ。1枚絵とオーディオファイルからffmpegを使って動画を自動で作成する。
上記のTipsの書き方参考にどうぞ。
https://gist.github.com/kuguma/d9b0e4ba3324958aa7909b600130ece1

Thinkpad X250のボタン電池の位置

この間,出先で朝Thinkpadが起動しなくなってしまって,とても困ったことがあったので解決するためにしたことをメモ.

 

症状

電源ボタンを押しても起動しない(BIOSすら立ち上がらない.)
電源を繋いだ状態で電源ボタンを押すと,3回点滅する(=バッテリーに接続されています).
電源ボタンを連打すると,稀に立ち上がろうとする(キーボードのランプが点灯する)が,すぐに電源が落ちる.

 

やったこと

フォーラムには,電源コードを抜いた後フロントバッテリとリアバッテリを外し,しばらく置いてから接続しなおすと電源が入ると書いてあったが,
この方法では解決しなかった.メモリやストレージを外してもダメ.緊急時リセットボタンもだめだった.

起動しなくなる前の夜,X250のUSBのポートを使ってモバブとiPhoneを充電していて,モバブがうまく充電できていなかったので,ボタン電池周りかと予想.
(スリープ時充電可能のポートにモバブを繋いでいなかったので,必要な電力をモバブが吸い取ってしまったのかな?)

最終的に,CMOS用ボタン電池を繋ぎ直すことで解決.

X250ではCMOS用ボタン電池はフロントバッテリの裏側に配置されているが,ボタン電池とマザボ間をつなぐコードは外に出ているのでこれを繋ぎ直せば良い.
ボタン電池自体の交換をしたい場合は,ネジで固定されているフロントバッテリを外す必要がある.

Docker + SoftetherVPNでマイクロサーバーを構築する

自分用メモです.

 

1.マシンの用意

Ubuntsu server 16.04LTSを適当なマシンにインストールする

 

2.Dockerをいれる,ユーザーグループを作る

wget -qO- https://get.docker.com/ | sh
sudo usermod -aG docker user
ログインし直す

https://tracpath.com/works/devops/how_to_install_the_docker/

 

3.Softether VPN ServerのよろしいDockerイメージを取ってくる

docker pull frosquin/softether
docker run -d –net host –cap-add NET_ADMIN –name softether frosquin/softether

https://github.com/cnf/docker-softether

VPN Serverに対するSSH接続を行えるようにしたい場合は,
権限付与が—cap-add NET_ADMIN では足りないので,–privileged にするとよい.
あんまりセキュアじゃないけど.

 

4.Dockerの操作

よく使うのは
docker images
docker ps
docker start <NAME>
docker commit <NAME> <IMAGE_NAME:TAG>
docker exec –it <NAME> /bin/sh

http://qiita.com/butada/items/3e6cd338cb703eef64b4
http://qiita.com/ZON009/items/7de6d36cad4eeb9727ef

ここで作ったコンテナの名前は便宜上softetherとする.

 

5.Softether Serverの設定

softetherのコンテナに入って,./vpncmdを叩き,その中で設定を行なう.

↓これの仮想HUB作成からやればOK
http://qiita.com/Makotonton/items/18683a9f1e846433c035

↓vpncmdはマニュアルを見ながらやればOK
https://ja.softether.org/4-docs/1-manual/6/6.1

大まかに,
・最初はHub名を空にするなどしてServer設定のところに入る
・仮想HUBを作る(HubCreate)
・Hubコマンドで任意の仮想Hubの設定に入れる
・作った仮想HUBに対してユーザーを作るなどする (UserCreate,UserPasswordSetなどをする)
・グローバルIPがない場合はVPN AzureをONにする.
ここまでやればServerに繋ぎに行ける.
SSHしたい場合は6の手順もこの時やっておく.

 

6.ServerにSSHするための設定

どうやらLinuxの制約でVPN Serverを動かしているマシンにSSHは普通にやるとできないみたい.
そこで,VPNのネットセグメントと物理イーサのセグメントをブリッジ接続する.
下準備として,apt-getでbridge-utilsを入れておく.これでbrctlコマンドが使えるようになる

まず,br0とVPNを繋ぐための仮想NIC,tap_br0 を作成する.再びsoftetherのコンテナに入って
・Hubの設定から,SecureNAT機能をオフにする(SecureNatDisable)
・Serverの設定から,作った仮想Hub→br0へのブリッジ接続を作成する(BridgeCreateコマンドを使う.tapをyesするのを忘れずに.)
を行なう.
コンテナから出てifconfig(ip a)すると,eth0,lo,docker0に加えてtap_br0が増えているはず.
この時点ではまだ仮想ブリッジ(br0)を作成してないが,できたら勝手につながるので大丈夫.

次にホストで仮想ブリッジbr0を作り,eth0↔br0,br0↔tap_br0を作る.

$ sudo ifconfig eth0 0.0.0.0 promisc up
$ sudo brctl addbr br0
$ sudo brctl addif br0 eth0 tap_br0
$ sudo ifconfig br0 <元のeth0のIP> netmask <元のeth0のサブネットマスク> up
$ sudo route add default gw <元のeth0のデフォルトゲートウェイ>

これで,ローカルネットワークに面した物理イーサネットアダプタ(eth0)と,VPNに面した仮想イーサーネットアダプタ(tap_br0)が
br0を介して繋がった.eth0でなくbr0に対してIPアドレスが振られており,このIPは双方のネットワークにアクセスできる.

SecureNATをoffにするのは,VPNネット↔VPN Serverが繋がってるローカルネットでブリッジ接続をしたときDHCPサーバーが
ローカルネット側とVPN側で二つになってしまうため.(ONにして試すと,一瞬つながるがすぐ落ちる.)
VPN ServerがつながっているネットワークにDHCPサーバーがいない場合は,ONにしてよいのかも?

 

http://linux2.g.hatena.ne.jp/lnznt/20120527/1338047140
http://www.petapico.biz/%E3%83%A9%E3%82%B8%E9%A4%A8petapicoshop/softether-vpn%E3%81%A7%E5%A4%96%E3%81%8B%E3%82%89-irmagician-%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%97%E3%81%A6%E3%82%A8%E3%82%A2%E3%82%B3%E3%83%B3%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B/
http://qiita.com/neronplex/items/84162ec1de520bb75a11

 

8.VPN ClientからVPN接続し,SSHできる

VPN Clientでの設定は割愛.ホストを指定し,手順5のvpncmdで設定したユーザー名とパスワードでログインできる.

接続時,VPN Serverが置いてあるネットワークのDHCPサーバによってIPは割り振られる.

Serverのアドレス(192.168.-)をメモっておくか,arp -aとかでIPを調べてSSHできる.

 

7.余ったマシンを作ったサーバーにぶら下げまくれば計算クラスタが作れるぞ

Docker難しかった.一度イメージを作ってしまうと使いまわせるのでべんり.

 

8.その他備忘録

・docker runで,—net hostとしたばあい,そのコンテナは(多分)docker0を使わず,直接eth0を使う.
・マシンによっては(?)eth0がenp0s25とかになっていることがある.
・arp –a ローカルネットのIP一覧を教えてくれる.つまるところPCが保持しているARPのためのテーブルを見せてくれる
・ifconfigは非推奨だそうで.ip aを使うと良い(ハイフンは不要).
・デフォルトゲートウェイ:
サブネットマスク外のIP宛のパケットを送る相手.とりあえず全部こいつに送ってよろしくしてもらう.
この設定が間違っていると,外へのpingは通らなくなる.
サブネットマスク内のパケットは,ARP(Address Resolution Protocol)によって送信者が物理アドレスを知っている.
・サブネットマスク:
つまるところ,パケットをゲートウェイに送るか,ローカルネットに送るかを決定するために使っている.
・TAPデバイス:
つまるところ,仮想のイーサネットアダプタ.
VPN ServerはPCのeth0を勝手に使って仮想的なネットワークを構築するが,eth0に対して(ネットワークの)ポートを持っているわけではない.
eth0とVPNを繋ぐ一つの方法はeth0へのブリッジ接続の作成だが,この場合IPはeth0に振られているのでVPNからeth0側にはアクセスできない(Linuxの制約).
VPN側に仮想イーサーネットアダプタを作り,それとeth0の間をブリッジしてブリッジにIPを振れば,二つのネットワークを繋げられる.
・NAT : Network Address Translation
・当たり前なんだけど,既存の帯域の一部をVPNが食うので,無線などで速度がでない環境下でVPNに繋ぐと既存のネットも重くなる.

未だにifconfigで出てくる状態の中にわからないものがあるので追々調べる.

SSHで大学のサーバーとかを踏み台にしてブラウジングする

いつも忘れてしまうのでメモ.portnumberは任意だけど便宜上8080と書いておく.変えても良いし,このまま使っても良い

1.シェルでの操作

ssh –D 8080 -f -C -q –N studentnumber@serveraddress

バックグラウンドでSOCKSサーバーを立ててポートフォワーディングする.

2.ブラウザ側での操作

ChromeにProxy Switchyのアドオンを入れる.
Manual Configration のところで
ひとつ目の空欄にlocalhost,portのところに8080とか入れる.
Proxyをオンにする.

今Manchesterにいるのだけど,新海誠の過去作品をNetflixで見ようと思ったらIPを見られているらしく
検索に出てこなかったので困った.踏み台にしたら無事見えるようになった.
最近はあまり出くわさないけど,授業で学内アクセスオンリーのページを見たい時とかにも使える.
VPNが面倒なときに日本に踏み台にできるサーバーがあるというのは便利だ.
Spotifyが使える範囲にも踏み台サーバーがあればなあ…って思ったけど書きながら既に持っている事に気づいたので日本に帰ったら試してみようかな( ˙꒳˙​)◞⁽˙³˙⁾”

RasPiめも

Satellite CCRMA

・8GBのMicroUSBでは足りない
・Python2系と全てが紐付いているので3を使うのは厳しい.複数のバージョンが入っているがpyenv等は入っていないので気持ちになる.
・x転送の調子が悪い.がんばると動く.
・pdが入っているので便利.しかしgem(動画を扱えるパッケージ)は入っていない.

https://ccrma.stanford.edu/~eberdahl/Satellite/

複数のPythonバージョン

ここの情報が新しいと感じた.しかしanacondaはRasPiには入らない.
http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c

 

音を鳴らす

pygletはAPIが貧弱なので使いづらいと感じた.
pygameは以前扱ったことのあるOpenALに似た使い方ができるので嬉しいが,メンテナンスされていない印象.
(Mercurialのリポジトリは存在してるんだけど,Python3ではpipで入らないしビルドもコケる.)
2ではあっさり動く.2はpipを入れるのが面倒だったりするけどpython-pygameとかがapt-getで落とせるのでそれでお茶を濁せる.

また,mp3を鳴らすのが厳しい.物によって落ちるのでおとなしくwavにするのが良い.

 

USB DACから鳴らす

http://qiita.com/yuyakato/items/76a3d46d1bf57c6a4da6
https://wiki.archlinuxjp.org/index.php/Advanced_Linux_Sound_Architecture#.E3.83.87.E3.83.95.E3.82.A9.E3.83.AB.E3.83.88.E3.82.B5.E3.82.A6.E3.83.B3.E3.83.89.E3.82.AB.E3.83.BC.E3.83.89.E3.81.AE.E8.A8.AD.E5.AE.9A

mast新入生のためのTips

mast1年次だとUnix環境で課題をせよみたいなのがそこそこあると思いますが,毎回機室に行って作業するのは(とくに自宅通学の方とかは)大変ですよね.
自分の環境で課題ができる環境を整えておくと,機室にいかなくても作業ができるようになるのでおすすめです.

このTipsでは,出てくる単語や,詳しいやり方については説明しません.
もしわからない単語や言葉がでてきたら,ぜひGoogleで検索してみてください.やり方を案内するページがたくさんでてきます.

このTipsはそういった検索の足がかりとしてもらうことを想定して書いています.ぜひ検索エンジンを使いこなして一人前のエンジニアになってくださいヾ(๑╹◡╹)ノ"

環境構築編

エディタ

emacs,vim,いろいろありますが,よくわからないならSublime Text 3を入れておけばよいでしょう.ただしShift_JISを扱えないのでプラグインの導入は必須です.
→ここで,「sublime text 3 インストール」「sublime text 3 導入」「sublime text 3 日本語」などで検索をかけてみてください.今後も同様です!
→「Shift-JIS」「文字コード」についても調べてみましょう.

シェル

windowsの人はいくつか選択肢があると思います.個人的には「MobaXterm」というソフトウェアをおすすめします.win10であればUbuntuを入れるのもいいかもですね.
Macの人はシェルが最初から入っているので,頑張って使いこなしましょう.
シェルとは:https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB

Latex

環境構築が大変ですが,一度組んでしまえば楽です.OSごとに,ググるとネット上に環境構築方法が乗っています.参考にしてみてください.

数式処理言語

線形や解析のレポート課題で検算をするのに役立ちます.
→「数式処理言語」「数式処理システム」で調べてみましょう.
おそらく学生であればMathematicaがフリーで使えると思いますが,かなり容量がでかいのでラップトップ(=ノートパソコン)に入れるのは少し大変かもしれません.
僕はMaximaというOSS(フリー)の数式処理言語を使っています.

 

SSH編

SSHってご存じですか? SSHというのは安全に遠隔地にあるコンピュータと通信するための仕組みです.
リモートでパソコンを操作する方法としてはリモートデスクトップなどが一般的ですが,画面を転送するので場合によっては不便なことがあります.
SSHは今後もよく使っていくことになるので,ある程度使えるようになくと今後楽です.
自分のマシンのシェルで,次のように打ち込むとSSHで接続できます.SSH接続の方法はACCCにも乗っています.
重要な幾つかのコマンド・キーワードについて紹介します.

ssh

安全にリモートマシンにログインするコマンドです.
たとえば学籍番号がs1000100の人は,
ssh s1000100@ubuntu.u.tsukuba.ac.jp:~
で接続できます.なお,sshは実は画面転送もできます.X11転送といいます.興味があれば「SSH X11転送」で調べてみましょう.
ちなみに,学情の先生に「sshでリモートログインしたいんですけど~」みたいなメールを打つと意外と教えてもらえます.僕はX転送をこの時教えていただきました.

公開鍵認証

sshでログインする方法には二種類があります.
ひとつはパスワード認証で,単にログイン時にパスワードを入力するもの.
もう一つは公開鍵認証で,これは少し概念が複雑なので説明します.
公開鍵認証は,使うだけならとても簡単です.
1.ローカルマシンで,鍵と錠前(鍵穴)のセットを作成します.ssh-keygenのコマンドで行います.
2.安全な方法で,錠前(鍵穴)をリモートマシンに転送し,設定を行います.
3.自分の作った鍵を使って,リモートマシンの錠前をあけることができるようになります.

上の例での鍵を「秘密鍵」,錠前を「公開鍵」と呼びます.具体的な方法については次のページが参考になるでしょう.
わかりづらければ他のページを検索してみてください.いろいろごちゃごちゃ書いてありますが,

1.ssh-keygen –t rsaで鍵と錠前のペアを作成
2.scpで錠前をリモートに転送
3.catで錠前(id_honyarara.pub)を錠前リスト(.ssh/authorized_keys)に登録

これだけです.パスワード認証拒否の作業は必要ないでしょう.
http://www.server-memo.net/server-setting/ssh/ssh-key.html

scp

sshと同様の仕組みを用いて,ローカル(自分のマシン)からリモートへ,もしくはリモートからローカルへファイルを転送するコマンドです.

scp [転送元] [転送先]
が基本的な構文です.
→ここで「scp コマンド」で検索してみてください.今後も同様です!
例えば,次のような使い方になるでしょう:
1.sshでリモートにログインし,機室の環境でしかできない作業をします.
2.ログアウトしてscpで必要なファイルをローカルに転送します.
3.ローカルで作業を行い,レポートを完成させます →manabaで提出!

rsync

フォルダやファイルをローカル – リモート間で同期するコマンドです.
rsyncはオプションも多く少し使い方が難しいですが,(間違えると作業したファイルをふっ飛ばしてしまうかもしれません),とても便利なコマンドです.
学部時代はよくお世話になっていました.調べてみてください.

 

ほか,要望があれば追記する予定です.
今はほとんどの情報をネットで手に入れることができるので,ぜひ検索力を鍛えてください.ぐっどらっく!✌(‘ω’)

System Verilog Array of Interfaces

System Verilogの新機能としては,

  • Interface
  • 多次元配列
  • Struct

あたりがVerilogからの移行ユーザーとしては嬉しいポイントだと思います.
が,細かいところまで行くと結構情報が曖昧です.記法や一部の機能がシミュレーターや論理合成ツールによってサポートされていないこともあります.シミュレーションでは使えるが論理合成はできないもの,そもそもコンパイルが通らない記法,等様々です.

この記事では,上の機能の詳細について自分の環境:Vivado 2015.2で動作したものをまとめます.また,論理合成可能なものを扱います.

機能に関しての基本的な説明は他の文献に譲ります.「System VerilogによるLSI設計」が日本語の資料としてはわかりやすいと思います.(VerilogからSV(System Verilog)に移行するユーザー向けに書かれています.)

 

Interface vs Struct

InterfaceとStructは複数の信号線を束ねて扱えるという点で似ており,どちらもModuleの入出力ポート宣言に使うことができます.両者の何が違うのか,どう使い分けるのか,という点が疑問になります.Interfaceをそもそも使わないで良いのではという議論もあるでしょう.
両者の決定的な違いは,Interfaceが別々の方向の信号を束ねて扱えるのに対して,Structはそれができない点です.

・そもそも,信号の方向が重要となるのはモジュール接続時のみであることに注意します.
・Interfaceは外部との接続用で,Structは汎用的に信号をまとめることのできる機能として使い分けます.
・Structを使ってモジュール間の接続をすることもできます.ただし,束ねられるのは同じ方向の信号同士のみです.FIFOインターフェース等では無理が出てきます.
・inoutでStructを接続すれば,Interfaceと同等のことが行えそうですが,inoutは両側がネット型(wire)でないといけないという制約がある(参考)ため,内部論理の記述に影響します.

方向の違う信号を束ねたい場合は,Interfaceを使うのが良いようです.逆に,そうでなければStructを使わない理由はないでしょう.ただし,Interfaceは配列が扱えない(?)という話があります.結論から言うと扱えるのですが,後述します.

参考:

Connecting hierarchical modules: struct vs interface in SystemVerilog

 

Interface with modport and parameter

Interfaceはmodportという機能を使って,信号の方向を定義することができます.moduleと同様の記法でparameterを使うこともできます.例えば宣言は次のようになります:

interface IF_FIFO # (parameter N = 32);
    logic empty;
    logic [N-1:0] rd_data;
    logic rd_en;
    logic full;
    logic [N-1:0] wr_data;
    logic wr_en;
    logic valid;
    modport master(
        input empty,rd_data,full,valid,
        output rd_en, wr_data, wr_en
    );
endinterface

interfaceの利用ケースはいくつかあり,それぞれで記法が変わります.

①まずひとつめはmodule内でinterfaceのインスタンスを作成する場合です.このときは,modportの記述はしません.parameterは記述できます.

IF_FIFO #(.N(40)) if_fifo();

interfaceはそもそも,(機能は一見structに近いですが)moduleの拡張であるという点に注意します.従ってmoduleのインスタンス作成の記法に近くなります.

②moduleの入出力ポート宣言でInterfaceのインスタンスを作成する場合,modportを使うことができます.次のような記述になります:

module hoge(
    input logic clk,
    input logic rstn,
    IF_FIFO.master if_fifo,
);

③moduleをインスタンス化するときの入力にinterfaceを使うときも,modoportを使うことができます.次のように記述します:

Some_Module Some_Module_i(
        .clk(clk),
        .if_fifo(if_fifo.master),

);

 

modportで明示した方向は,合成ツールがSyntax Checkを行うときに使える情報になるので,可能な限りしておいたほうがよいでしょう.

modportは,2年前くらいまでは対応している合成ツール/シミュレータのほうが少ないくらいだったようですが,2015年8月現在では,だいたい対応されているようです.
#といっても,Vivado 2014.4,Vivado 2015.2でしか自分は試していません.

また,modportとparameterの併用についても,注意が必要です.(参考
②と③でparameterを明示する場合の記述方法は試していません.

 

array of Interfaces

最初に,この機能を使うのはかなり危険だということを認識しておく必要があります.Vivado 2015.2でも,正式サポートはされていないようです.
それ以前のバージョンでは一部コンパイルが通らなかったり,シミュレーションで信号のビットオーダーが逆になる等,いろいろな問題があるので,使う必要がなければ使わないに越したことはありません.

ですが,リスクを上回って強力な機能です.Vivado 2015.2で論理合成が可能で,意図したとおりにSchematicが構成されることを確認したので,紹介します.

①インスタンスを作成する場合は,次のように書きます.arrayでない時と同様に,modportの宣言は行えません.

IF_FIFO if_fifo[2-1:0]();

②moduleの入出力ポート宣言では,次のようになります

module hoge(
    input logic clk,
    input logic rstn,
    IF_FIFO.master if_fifo[2-1:0],
);

③moduleのインスタンス化時の入出力セットの場合,modportを含めた名前の後に,ビットの幅指定を行います.上位と下位でinterfaceのサイズが合っていないと合成でエラーになります.

Some_Module Some_Module_i(
        .clk(clk),
        .if_fifo(if_fifo.master[2-1:0]),
);

④アクセス

if_fifo[0].full

でアクセスできます.添字には定数しか使うことはできません.forループ等で添字を回す場合,注意が必要です.
generate内のgenverは定数として扱われるため,添字アクセスが可能ですが,generate内であってもalwaysの中にある添字は定数として扱われないようです.
通常の,generate直下にforループを置くような形(generate-for)では,特に問題はありません.
しかし,ここにあるようなonehot信号で配列のどの信号を使うかコントロールしたい,という場合,alwaysの中にfor文を記述することになります.これは論理合成可能ですが,このfor文の中でinterfaceに添字アクセスしようとすると
”i is not a constant” というような内容のエラーがでて合成に失敗します.
これはInterfaceの配列に特異な問題で,一度struct等にassignなりしてからであれば,合成は通ります.おそらく,Vivadoのバグなので,注意が必要です.

Interfaceを修飾できる,Modport,Array,parameterですが,それぞれを重ねあわせて使った場合どう書くのが文法的に正しいのか,よくわからないところが多いです.今回modportとarrayの重ね合わせについては検証しましたが,
parameterを含めてはまだの部分が多いので,試し次第報告します.

以上です.

 

参考:System Verilog Array of Interfaces

Python 勉強メモ

matplotlib

http://bicycle1885.hatenablog.com/entry/2014/02/14/023734

 

Numpy.array

http://turbare.net/transl/scipy-lecture-notes/intro/numpy/array_object.html
http://kaiseki-web.lhd.nifs.ac.jp/documents/Python/array.htm

 

Pythonによる信号処理,とかとか

http://aidiary.hatenablog.com/

 

Pythonのスコープ

制御構造はスコープを作らない.
http://d.hatena.ne.jp/saitodevel01/20101205/1291582273

 

True.

 

リスト

[0:4]は”0番目から4番目”ではない.
レンジ指定で取りうる番号は要素と要素の間のカウンタ.従って0([0]の前) ~ 4([4]の後)の5つある.
http://docs.python.jp/2/tutorial/datastructures.html