FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

OpenSPARC T1の調査(5. S1coreの調査)

OpenSPARC T1のコア部分のみを切り出したものとして、S-RISC (Simply-RISC)というものをコメントで紹介してもらった。

どうやら、コアの部分をOpenSPARC-T1として利用し、それ以外の外側を独自に囲むことによってOpenSPARCを動作させるものらしい。 概要図を当該HPから引用する。

www.srisc.com

http://www.srisc.com/images/dmitry_diagram1.jpg

上記のとおり、OpenSPARC-T1のコアはそのまま利用し、外部へのWishboneバスおよびペリフェラルを追加することによって動作させる仕組みだ。

With this new system, now Linux boots correctly as single-thread! And even using PROM file 1c4t_obp_prom.bin, i.e. the four-threads version of the OpenBoot code, Linux starts booting.

どうやらシングルコアでもLinuxのブートに成功しているらしい。すごいな!

という訳で早速チャレンジしてみることにする。

S1 Coreのダウンロードとインストール

以下からS1 Coreのダウンロードを行う。解答するとsourcemeというファイルが見えるので、これを編集する。

www.srisc.com

# General paths settings
export S1_ROOT=~/work/s1_core
export T1_ROOT=~/work/opensparc/t1
export PATH=.:$S1_ROOT/tools/bin:$PATH

まず、OpenSPARC T1のソースコードはダウンロードしていること(http://www.oracle.com/technetwork/systems/opensparc/opensparc-t1-page-1444609.html)が必要である。 コア部分はOpenSPARCそのものを利用しているということになる (これはT1_ROOT変数にて指定されている)。 そして、ダウンロードしたS1 Coreの場所を指定している (これはS1_ROOT変数にて指定されている)。

sourcemeを読み込んで、update_filelistによりファイルリストが更新される。

source sourceme
update_filelist

Icarus Verilogによるシミュレーション環境構築

シェル一覧を見ていると、どうやらVcs, Icarus Verilogでの動作をサポートしているらしい。Vcsなんて持っていないので、Icarus Verilogでシミュレーションしてみよう。

build_icarus
run_icarus

しばらくするとシミュレーションが完了する。vcdファイルが生成されたようだ。

$ run_icarus

Simulation completed!
To see the output:
        less /home/xxx/work/s1_core/run/sim/icarus/sim.log
Too watch the waveforms:
        gtkwave /home/xxx/work/s1_core/run/sim/icarus/trace.vcd

vcdを眺めるのは面倒だし、ちょうどModelSimをインストールしているのでwlf形式に変換した。

vcd2wlf trace.vcd trace.wlf

ModelSimで波形を開いてみた。構造としてはS1コアの横に命令ROM、データROMが接続されているような状態だ。 命令ROMの波形を出してみると、ちゃんとフェッチが効いているようなので、これは動作しているのかな?もうちょっと掘り下げてみよう。

f:id:msyksphinz:20170303081121p:plain

f:id:msyksphinz:20170303081135p:plain

6th RISC-V Workshop の Registration および Call for Papers が始まりました

f:id:msyksphinz:20170304095136p:plain

2017/05/8 - 2017/05/11にかけて、6th RISC-V Workshopが開催されるようだ。RegistrationおよびCall for Papersが開始されている。

riscv.org

場所は上海の上海交通大学、情報系の学会に行くと、必ずと言っていいほど聞いたことのある中国では有名な大学だ。

ホストは今回はGoogleではなくnVIDIAnVIDIARISC-V系の発表をして来るのだろうか。期待だ。

上海なのでこれまでのアメリカよりは行きやすいはず。興味のある方はぜひ聴講を!

Source Han Code JP(源ノ角ゴシック)をEmacs on Ubuntuに導入する

Ubuntu16.04 (xenial) で作業をしているのだが、Virtual Boxを立ち上げてPuttyからXを飛ばしてEmacsを立ち上げたりすると、フォントが異常に読みにくいことがある。

f:id:msyksphinz:20170302181123p:plain

これは非常に嫌なので僕がWindowsの普段使いしているSource Han Code JP(源ノ角ゴシック)を導入しよう。

UbuntuへのSource Han Codeのインストール

基本的にググればすぐに出てくるので問題ない。

  1. Adobe Font Development Kitのダウンロード

Adobe - Adobe Font Development Kit for OpenType | Adobe Developer Connection

「Agree and download FDK-2.5.65463-LINUX.zip (ZIP, 32.6 M)」をダウンロードして展開しておく。

wget http://download.macromedia.com/pub/developer/opentype/FDK.2.5.65463/FDK.2.5.65463-LINUX.zip
unzip FDK.2.5.65463-LINUX.zip
cd FDK/
sudo ./FinishInstallLinux

一度ターミナルをログアウトして再ログインする。

$ sudo ./FinishInstallLinux

Adding a symbolic link from '/home/masayuki/bin' to the FDK directory /home/masayuki/work/FDK.

Adding a command to your login file that will append the FDK path to the $PATH environment variable...
   I added some lines to the  startup file /home/masayuki/.profile for the bash/sh/zsh versions of the Terminal program,  in order to add the 'FDK/Tools/linux' directory to your PATH environment variable.
Changed to file /home/masayuki/.profile
If you cannot run the FDK tools by name from the command-line after logging out and then back in, then your
Terminal program may be using a different login file than the ones I modified.
If so, you will need to identify your login file, and then add the same two lines to that file.

You must log out, and log back in, before the changes will take effect.
The FDK will then be ready to use.
  1. Source Han Code JPのダウンロードとインストール

こちらはGithubからダウンロードしてくる。

git clone https://github.com/adobe-fonts/source-han-code-jp
cd source-han-code-jp
sh ./commands.sh
cp ./*/*.otf ~/.fonts/   # ~/.fontsがない場合は自分で作った。
sudo fc-cache -fv

インストールに失敗する場合は、いくつかPythonのパッケージを確認すること。

sudo apt-get install gcc-multilib g++-multilib
sudo aptitude install python-pip
sudo pip install fonttools

これで、フォントがインストールされていることが確認できる。fc-listsで確認してみよう。

$ fc-list | grep Han
/home/masayuki/.fonts/SourceHanCodeJP-HeavyIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP H It,源ノ角ゴシック Code JP H It:style=H It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-Light.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP L,源ノ角ゴシック Code JP L:style=L,Regular
/home/masayuki/.fonts/SourceHanCodeJP-Regular.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP R,源ノ角ゴシック Code JP R:style=R,Regular
/home/masayuki/.fonts/SourceHanCodeJP-ExtraLightIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP EL It,源ノ角ゴシック Code JP EL It:style=EL It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-NormalIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP N It,源ノ角ゴシック Code JP N It:style=N It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-MediumIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP M It,源ノ角ゴシック Code JP M It:style=M It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-ExtraLight.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP EL,源ノ角ゴシック Code JP EL:style=EL,Regular
/home/masayuki/.fonts/SourceHanCodeJP-Heavy.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP H,源ノ角ゴシック Code JP H:style=H,Regular
/home/masayuki/.fonts/SourceHanCodeJP-Bold.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP B,源ノ角ゴシック Code JP B:style=B,Regular
/home/masayuki/.fonts/SourceHanCodeJP-BoldIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP B It,源ノ角ゴシック Code JP B It:style=B It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-Medium.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP M,源ノ角ゴシック Code JP M:style=M,Regular
/home/masayuki/.fonts/SourceHanCodeJP-LightIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP L It,源ノ角ゴシック Code JP L It:style=L It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-RegularIt.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP R It,源ノ角ゴシック Code JP R It:style=R It,Regular
/home/masayuki/.fonts/SourceHanCodeJP-Normal.otf: 源ノ角ゴシック Code JP,Source Han Code JP,Source Han Code JP N,源ノ角ゴシック Code JP N:style=N,Regular

Emacs への設定

いろいろ試行錯誤したのだが、やっぱり~/.emacs/init.elに以下を追加するのがシンプルだ。

(set-default-font "Source Han Code JP N")

f:id:msyksphinz:20170302182200p:plain

れいなフォントになった!

コンピュータアーキテクチャの神、John.L.Hennessy先生、相磯秀夫先生の記念講演を拝聴して

www.ht.sfc.keio.ac.jp

f:id:msyksphinz:20170302173635p:plain

ヘネシー先生だ!(iPhoneで撮ったので画質が非常にイマイチである)

慶應義塾大学にて、大川賞という情報通信技術に関する顕著な成果、また研究教育について顕著な成果を上げた方に対する表彰の、記念講演が行われた。 今年の受賞者は「ヘネパタ」でおなじみのJohn.L.Hennessy先生と、日本における最初のトランジスタコンピュータ開発に携わった相磯秀夫先生だった。

相磯先生はもちろん、ヘネシー先生といえば学生のころから「ヘネパタ」「パタヘネ」「MIPS」などの分野で常にかかわってきた大先生だ。 これはもう聞きに行かなければ、ということで早速記念講演を聴いてきた。 場所は慶應義塾大学の日吉キャンパスだ。

ちなみに、講演内容は以下で視聴可能となっている。

www.youtube.com

John.L.Hennessy先生 「The End of Road for General Purpose Processors and the Future of Computing」

タイトルから分かるとおり、"The End of Road for General Purpose Processors」なのだ。 ヘネシー先生はこれまでの汎用プロセッサに関するRISCの重要性、例えばILPの向上やマルチプロセッサなどの、性能向上のためにさまざまなアプローチを取った歴史を振り返りつつ、これ以上の進化は望めないという考え方を示されたようにも思える(これはあくまでも私の主観)。

時代とともにコンピュータにとって重要な分野は変わっており、かつては高い命令レベル並列性、そしてマルチプロセッサ並列性、そして現状ではモバイルプロセッサにおけるバッテリーにの持ちを重視するための、消費電力へと焦点が移っている。 そして最終的にはプロセッサのこれ以上の性能向上を望むのは難しいとする(たとえマルチプロセッサの数を増やしたとしても)見解を示し、DSA(Domain Specific Architecture)への発展が重要ということでまとめられた。 これは例えばGPGPUの進化だったり、VR向けのプロセッサ、果てはAI向けにTensorFlow専用のプロセッサのことだったりするのだろう。

つまり、汎用プロセッサにとってこれ以上の進化は望めない、ということではなかろうか。 少なくとも研究対象としての魅力度は確実に下がっている、ということだろう。

汎用プロセッサが消滅することはないだろう。DSAがいくら進化したところで、じゃあOSは誰が動かすの?DSAのデバイスを誰が制御するの?という話になる。DSAだけ速くても駄目なのだ。

また、いくらDSAが進化したところで、ASICチップを作るのに数億円かかるこの時代である。特定向けのアプリケーションプロセッサを、大量に作るなんて、そんなの現実的には不可能だ。

ASICチップを大量に作るためには何が必要か?それは大企業のような体力のあるところ、例えばGoogleAmazonのような人材と体力のある組織しか作ることは出来なくなるだろう。

ミニマルファブはどうか?コストは低いが性能はイマイチ、しかしここは高性能な汎用プロセッサとのトレードオフとなる。いくら専用チップを作っても、先端プロセスで作れなければ、汎用プロセッサを使ったほうがマシ、という事だってあり得る。

先端プロセスでなくても、専用ハードでDSAを作れば性能的に太刀打ちできるだって?じゃあDSA向けのソフトウェアとプラットフォームは誰が作るんだい?エコシステムを構築する労力は想像を絶するものだ。それなら多少性能的に劣っていても汎用プロセッサを使ったほうが楽ということになる。

話を戻すが、もはやDSAをアプリケーション毎に作ることの出来る体力を持っている日本企業は存在せず、海外の垂直統合している、体力のある組織しか作ることが出来なくなる。

そう考えると、ヘネシー先生の見解は決して絶対的なものではなく、ただ単に「時代は繰り返す」というか、「汎用」→「専用」→「汎用」のループはこれからも続くよ、ということを示しただけにも思える。

相磯秀夫先生 「コンピュータサイエンス関連分野における研究・教育の体験~コンピュータアーキテクチャの研究から大学改革まで~」

相磯先生の言葉の節々からは非常に謙虚な印象が感じ取れるが、やっていることは非常に最先端であったことだろう。

今でこそ僕たちはすでにあるプラットフォーム上でVerilogを書いたり、チップを作ったりしているが、全く存在しないデバイスや、どうやったらいいのか全く分からない新しい技術を始めるのは相当な苦労であることは想像できる。

日本で始めてのトランジスタコンピュータを作るというのは非常に難しい挑戦だったと思うし、デジタル回路の設計だけでなく、パッケージや安定性についても考えなければならない。 そのためには、垂直にすべてのことが分かるエンジニアが必要になるというわけだ。

午後のディスカッションでも話題になっていたが、ヘネシー先生のスタンフォードでは、「T字型」の人材を作ることを目標としているらしい。 T字というのは、幅広い分野の知識を持っているが、ひとつの分野に対しては非常にエキスパートということを意味している。 もはや水平分業では、イノベーションを起こすのは難しいという見解は両者とも一致していた。

相磯先生の興味分野はやはり学生の教育についてであり、その点で非常に熱く語られていた。

まずは学生の自主性を尊重すること、また修士課程においては自分で課題を発見し、それを解決することが重要視されること言うことを言われていた。 これは僕が大学院に在籍していた研究室でもそうだったが、自分で課題を発見するというのは意外と難しいことなので、それだけでも訓練になる。

また、海外の国際学会で積極的に発表するということも重要視していたらしい。 海外で発表して帰ってきた学生は、目の色が違っており、博士に進みたいと言い出す学生もたくさんいるとおっしゃっていたが、まあここについては眉唾ものだろう(笑)。

海外に出る学生が少なくなったと言うことだが、パネルディスカッションで両先生が指摘していたとおり、海外に行かずとも良い環境で勉強が出来るようになったこと、インターネットの発展で、日本にいても十分なべんきょうが出来るようになったことが挙げられる。

ただし、僕が思うにやはり国内と海外では学生の質も異なるだろうし(日本の学生が勉強しないという訳では無いし、海外の学生がめっちゃ勉強するという訳でもないだろうが)、海外に出る、という手段ばかり考えるのではなく、なんのために海外に出るのか(より厳しい環境に身をおく、とか)を考えたほうが、学生にとってより有意義な海外生活を送ることが出来るのではなかろうか(僕は留学経験は無いけれども)。

CMake + Modelsim Intel FPGA Starter EditionでGUI上でのリコンパイル手法

CMakeを使ってModelsim環境を構築したが、GUIデバッグしているときの問題があった。 これは、Verilogを修正した場合にGUIを立ち上げている状態でどのようにしてリコンパイルするかということだった。

シミュレーションのやり直し(Verilogの変更無く再コンパイルの必要がない場合)は、restart -force; run -allと記述すればシミュレーションをやり直してくれる。 しかし、リコンパイルしたい場合にはどのようにしたら良いのだろう?

例えば、CMakeLists.txtには以下のような割かし複雑なコンパイルオプションが記述されている。

add_custom_command (OUTPUT vlog
  COMMAND vlog -f filelist.f
              +define+IC_RD_RAND+${IC_RD_RAND}
              +define+DC_RD_RAND+${DC_RD_RAND}
              +define+DC_WR_RAND+${DC_WR_RAND}
              +define+TOOL_QUESTA_SIM
              +define+SIMULATION
              +define+SIM_DATE=${CMAKE_SIM_DATE}
              +define+REVISION=28\\'h${CMAKE_REVISION}
              +incdir+../../../../hardware/common/include/
              -work worklib
              -l vlog.log
  DEPENDS filelist.f riscv_ctrl csu_main vlib
  )

で、GUI上でリコンパイルするためには、これをもう一度コンソールに叩けばよいのだが、もちろん環境変数などがあり難しい。

f:id:msyksphinz:20170302005500p:plain

怒られる。

そこで、compile.doを作成して、リコンパイルする場合にはdo compile.doとしたい。compile.doは手動ではなく、可能ならばオプションが変更になる場合に備えて自動で作りたいなあ。

という訳で、vlog.logに記述されているコンパイルオプションをgrepで抽出して、compile.doを自動的に作れるようにした。

add_custom_command (OUTPUT compile.do
  COMMAND grep ^vlog vlog.log > compile.do
  )

vlog.logから、vlogの文字から始まる行を検索してcompile.doに入れている。結果として、以下のようなcompile.doが作成される。

vlog -f filelist.f "+define+IC_RD_RAND+0" "+define+DC_RD_RAND+0" "+define+DC_WR_RAND+0" "+define+TOOL_QUESTA_SIM" "+define+SIMULATION" "+define+SIM_DATE=20170302" "+define+REVISION=28'haf2465a" "+incdir+../../../../hardware/common/include/" -work worklib -l vlog.log

1行だからむちゃ長いけど。というわけでこのファイルをGUI上で読み込ましてやれば再コンパイルしてくれる。

f:id:msyksphinz:20170302005915p:plain

CMake + Modelsim Intel FPGA Starter Editionの環境構築

せっかくModelsim Intel FPGA Starter Editionを使い始めたので、CMakeでビルドする環境を構築しよう。

CMakeでVerilogのシミュレーション環境を構築するためにはCMakeのadd_custom_targetを使う。 C++のようにビルド環境を自動的に作れないので、自分で作るしかしょうがない。

vlogビルド環境

add_custom_command (OUTPUT vlog
  COMMAND vlog -f filelist.f
              +define+IC_RD_RAND+${IC_RD_RAND}
...
              +define+SIM_DATE=${CMAKE_SIM_DATE}
              +define+REVISION=28\\'h${CMAKE_REVISION}
              +incdir+../../../../hardware/common/include/
              -work worklib
              -l vlog.log
  DEPENDS filelist.f riscv_ctrl csu_main vlib
  )

ビルド環境は上記のようになった。filelist.fはcppを使って自動生成している。

add_custom_command (OUTPUT filelist.f
  COMMAND cpp -DTOOL_VCS_SIM -P -DHW_DIR=../../../../hardware ../sim/tb_mag_top.f > filelist.f
  DEPENDS ../sim/tb_mag_top.f ../rtl/mag_top.f
  )

vsimのビルド環境

シミュレーションの開始は以下のようにした。

add_custom_target (tb_mag_top ALL
  COMMAND vsim -c tb_mag_top  +access+rw -l simv.log -work worklib -do "run -all; quit"
  DEPENDS vlog
  )

変数やシミュレーションパラメータをどのように定義するか

とりあえず、CMakeのパラメータとして以下を定義している。

if(IC_RD_RAND)
  set(IC_RD_RAND 1)
else()
  set(IC_RD_RAND 0)
endif()

if(DC_RD_RAND)
  set(DC_RD_RAND 1)
else()
  set(DC_RD_RAND 0)
endif()

if(DC_WR_RAND)
  set(DC_WR_RAND 1)
else()
  set(DC_WR_RAND 0)
endif()

これらをビルド時に+define+として投入している。

add_custom_command (OUTPUT vlog
  COMMAND vlog -f filelist.f
              +define+IC_RD_RAND+${IC_RD_RAND}
              +define+DC_RD_RAND+${DC_RD_RAND}
              +define+DC_WR_RAND+${DC_WR_RAND}

ビルド時に日付やgitのリビジョン番号を埋め込む

ビルド時の日付やリビジョン番号を挿入するためには、まずはCMakeLists.txtに以下の変数を定義する。

execute_process (COMMAND date +%Y%m%d OUTPUT_VARIABLE CMAKE_SIM_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process (COMMAND git rev-parse --short HEAD OUTPUT_VARIABLE CMAKE_REVISION OUTPUT_STRIP_TRAILING_WHITESPACE)

set (SIM_DATE ${CMAKE_SIM_DATE})
set (REVISION ${CMAKE_REVISION})

これを+define+で挿入している。

+define+SIM_DATE=${CMAKE_SIM_DATE}
+define+REVISION=28\\'h${CMAKE_REVISION}

16進数で表現されるリビジョン番号については、Verilog固有の記述(28'h01234abcd)のような記法を利用している。

OpenSPARC T1の調査(オープンソースなCPUの調査)

OpenSPARC T1を動かす話の続き。どうにかしてPLI部のコードをリコンパイルし、ModelSimから読めるように変更してみたが、どうしてもVeraの吐き出すイベントファイルが必要なようで、Vera無しでは動作させることが難しい気がしてきた。

OpenSPARC T2もT1もVeraが必須ということで、どうも個人がまじめに動かすのは難しい様子。諦める前にまだいろいろやってみたいことはあるが、とりあえずはペースを落とそうかな。

OpenSPARC以外にも、オープンなプロセッサコアはあるの?

OpenSPARCは性能的にはやはりダントツのプロセッサコアだろう。古い環境が無いと動作しないというのは欠点だが。

純粋Verilogで書いてあるCPUコアとしてOpenSPARCには期待してたのだけれど。。。先は長そうだ。