Recent Posts

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

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

シェルを叩く

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

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

 

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

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

 

.format()を使いこなす

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

Thinkpad X250のボタン電池の位置

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

 

症状

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

 

やったこと

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

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

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

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

M3 2016 秋 お知らせ

第一展示場 G-08a 「おとのはこにわ」さんにて,
C90新譜の「timescaler」を委託させていただけることになりました!ヾ(๑╹◡╹)ノ"

 

よろしくお願いいたします~
おとのはこにわさんの楽しいトイポップ新譜もゼヒ

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で出てくる状態の中にわからないものがあるので追々調べる.

どこでもドアに替わる技術

通勤電車に揺られながら以下のようなことを考えたのでメモ.オチは普通です.

なお,僕はいま学生で,週に2日ぐらい田舎から都内に出稼ぎに出てコードを書いたりしています.
職場まではDoor 2 Doorで1時間半くらいかかります.

①都内で働く日は,実質1日が(往復3時間で)21時間くらいになるのでつらい.

・電車に乗っている時間は1時間未満だけど,家→駅と駅→職場で歩くのでそこそこかかる.
・電車はすぐ来るとは限らないので,ホームで待つ時間もある.

②どこでもドアができると,多くのサラリーマンが幸せになると思う.どこでもドア超欲しい.

・どこでもドアの実現可能性を考えてみた.
・人間本体を分解してむこうで再構築する方法は,技術的には遠い未来に可能になりそうだけど,倫理的な問題とコスト面で難しそう.
・4次元トンネル的なのを作る方法は,エネルギー保存則から考えて相応のエネルギーを食いそうなのと,転送装置が大掛かりになって普及しなさそう.
・やっぱりどこでもドア作るのはしんどい.

④意識だけ職場に飛ばせればいい気がする…リモート出社じゃん!

リモート出社,驚くべきことに現在の技術でできる.

というわけで,みなさんリモートワークをしましょう.

今でもちょこちょこリモート出社文化が浸透している気がする.10年後くらいには週1日会社に行けばいいくらいの感じになっていてほしい.

 

リモートワークのメリット

まず社員視点では,もちろん嬉しい.

・1日使える時間が増える.→睡眠や趣味に回せる.
・家賃が安いところに住める.→他の用途に使えるお金が増える.

また,経営者的視点でも,リモートワークにはいろいろメリットがあると思う.

・交通費支給の支出を減らせる.住宅手当も減らせる.
・都内から遠いところなら家賃も安いので,社員の給料に対する満足度が上がる.
・浮いた時間を社員は趣味や睡眠に充てられる.すると仕事の効率が上がる.(睡眠時間が少ないと人間の性能はかなり低下することが知られています.)
・オフィスが狭くても会社が機能するので,コスト低減できる.

一方で課題としては,

・会議など,集まって意思決定を行なう行事にどう対処するか
・リモートワークで効率が下がらないか
の2点があると思う.

まず1点目,殆どの会議は意味がないのではという議論はさておき.
インターンにいったうちの一つでは毎日何かしらの会議,勉強会があるみたいな話があり,リモートワークを取り入れる障壁になっていそうだった.
とはいえ,これは自宅でVRヘッドフォンを被って参加すればよい.現在の技術で解決可能.すごい.
表情と手の動きが取れるので,アバターを動かせばコミュニケーションも問題なし.動画を直接送るより帯域も食わない.
リモートワーク採用で手当を減らせるので,会社としてもここらへんに投資して一人1台設備を配るのは造作もないことだ.
・VRで会議を行うシステムは今後売れる.

次に2点目,リモートワークで効率が下がらないかという議論があるが,これは
・下がった人をリモートワーク禁止にする
・リモートワークでサボる人は職場でもサボる
の2つで解決できそうだ(?)
会社の方にこの話をした時,「リモートワークしたい人は制度を維持するためにちゃんとはたらく」みたいな意見も頂いたので
紹介しておきます.

リモートワークが浸透すれば,8時間睡眠,8時間仕事,8時間趣味みたいな,人間的で社会的な生活ができるようになって,
(IT技術者みんなが)気持ちよく働けるようになる世界になると思う.
・現実世界では理想的な8時間仕事であっても,8時間趣味の時間は家事と食事,移動時間で削られて結局3-4時間くらいしか残らない.これはきつい.

これは個人的な話だけど,今のところ業務内容に不満ってほぼなくて,働くときのフラストレーションのほとんどが
・出社の面倒臭さ
・昼飯を食った後猛烈な眠気に襲われながらも仕事をしないといけないつらさ
の二つに集約されているので,ぜひこれらが改善される働き方ができる世の中になって欲しいと思う,
…というか,確実に来る未来の形なのでみんな関連技術に投資するといいと思います.

なお,本日のオチはこちらです.
http://altvr.com/

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

Thinkpad X250 セットアップメモ

1.SSD換装

基本的にはここを参考にすればよい.ただ自分の場合はHDDとSSDを入れ替えるのではなく,M2にSSDを増設してOSを載せ替える形にしたので,その手順をメモ.

1-1.購入

X250はHDD512GBのモデルを購入した.SSDはM2接続のもの(Transcendの256GB,512GBはサイズが違って入らないので注意).
X250内には空のM2スロットがあり,そこを利用できる.

1-2.リカバリディスクの作成

回復ディスク(リカバリディスク),バックアップ,色々名前があってわかりづらいが,
・回復ディスクは,「メーカーが出しているPCの場合は最初の1度はOSイメージを含めて作成できる(=別ドライブにインストールしなおしができる).それ以降はOSイメージを含まない,回復ディスクと言う名の修正ディスクしか作成できない」「(自作等の場合は最初から後者」
・バックアップは,ドライブとかの構成をそのままバックアップするものなので,めちゃくちゃたくさん領域が必要.DVDで書きだそうとすると10枚とかになる.
今回は増設したSSDにWin8.1を入れなおすので,OSイメージを含む回復ディスクを作成する.16GBくらいのUSBメモリがあればOK.

1-3.換装

Thinkpadにあるまじき分解のしにくさなので,諦めて指から血を出しながら30分くらい無駄にしましょう.
パーツをつけたりとりはずしたりする際,フロントバッテリを構成に含めている場合は,電源コードとリアバッテリを抜いても通電状態なので注意.
まずM2 SSDを装着し,HDDの方は接続ケーブルを外しておく.
次にUSBメモリからブート.PCを初期状態に戻そうとする.(上のサイトに手順が乗っている.)
するとOSがインストールされているHDDがあるべき場所に無く,うまくいかないので,詳細オプションから問題の修正を行い,再起動したのち再び試みる,
成功するので手順に従ってインストールする.
ローカルアカウントを作りたい場合はこうする.
ひと通りうまく行ったら,一度シャットダウンし,HDDを繋ぎ直して再起動する.HDD領域はフォーマットすればストレージとして普通に使える.

1-4.PCI-Expressの省電力設定をオフにする

ThinkpadでM2 SSDを起動ディスクにすると,PCを起動しっぱなしにしているときに突然SSDを認識しなくなって落ちるということが稀に発生する模様(自分も一度なりました.)
対策として電源オプションからPCI-Expressの省電力設定を切る方法が挙げられているので,設定しておく.

 

2.各種ソフトインストール

これから.