FPGA開発日記

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

コンピュータアーキテクチャの神、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には期待してたのだけれど。。。先は長そうだ。

OpenSPARC T1の調査(3. PLI部のコンパイル→失敗)

OpenSPARC T1のPLI部を動かそうとしているのだが、ModelSim PLIがうまく動作せずに悩んでいる。土日にひたすら試行してたのだが、結局うまく行かなかった。

おそらく、自分でフルスクラッチで作るのだったら簡単に作れるのだろうが、今回はそうも行かず、OpenSPARC のビルドスクリプトを使うことを前提にしている。 これだとうまく行かない。

f:id:msyksphinz:20170227213825p:plain

具体的には、PLIのコードをリコンパイルしているらしく、そこでコンパイルエラーになってしまう。gccで共有ライブラリを作成しようとしているときにエラーが発生しているようだ。

これ、おかしいことにgccによるコンパイル+リンクだとうまく行かないが、gccによるコンパイル+ldによるリンクだとうまく行くような感触がある。 ただし、このフローはModelsimが自動的に行っているようで、こちらではうまく制御できない。

もうちょっと調査が必要だな。。。

OpenSPARC T1の調査(2. ModelSimによるシミュレーション→フェッチが出ず)

前回に引き続いて、OpenSPARC T1のシミュレーションを走らせていたが、それっぽい動作をしたものの、イマイチ有益なログを出さずにシミュレーションが終了してしまった。

f:id:msyksphinz:20170226082556p:plain

$ tree .
.
├── bypass_win:model_core1:core1_mini:0
│   ├── diag.s
│   ├── efuse.img
│   ├── flist
│   ├── history.sims
│   ├── perf.log
│   ├── raw_coverage
│   ├── sim.log
│   ├── sim.perf.log
│   ├── sim_command
│   ├── sims.log
│   ├── spd_single_dimm.data
│   ├── spd_stack_dimm.data
│   ├── status.log
│   ├── transcript
│   └── vlog.log
├── flist
├── history.sims
├── ihit_sameset:model_core1:core1_mini:0
│   ├── sim_command
│   └── sims.log
├── imiss_sameset:model_core1:core1_mini:0
├── lock
├── master_diaglist.core1_mini
├── sims.log
└── tre
    ├── sims.iver
    └── sims.tver_0

シミュレーション中に大量のエラーを出しているのが気になる。

# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/ciop_iob.v(328): Cannot execute undefined system task/function '$iob_jdriver'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/bw_sys.v(99): Cannot execute undefined system task/function '$pc_trigger_event'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/ciop_iob.v(297): Cannot execute undefined system task/function '$iob_cdriver'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/pcx_stall.v(93): Cannot execute undefined system task/function '$pc_trigger_event'
# ** Error (suppressible): (vsim-12023) /home/masayuki/work/opensparc/t1//verif/env/cmp/cpx_stall.v(100): Cannot execute undefined system task/function '$pc_trigger_event'

これはPLIを動かさないと駄目なのか。

$ ag pc_trigger_event

tools/pli/veriuser.c
173:    {usertask, 0, 0, 0, pc_trigger_call, 0, "$pc_trigger_event"},
  • tools/pli/iop/iop_main.cpp
void pc_trigger_call()
{
  switch(tf_getp(PC_TRIG_TY)){
  case 1 :// check for event
    int low, high;
    long long pc;
    low  = tf_getlongp(&high, PC_TRIG_PC);
    pc   = high;
    pc <<= 32;
    pc  |= low;
    if(pli_var.pc_event.hit_pc(pc)){
      while(pli_var.pc_event.which_event()){
        switch(pli_var.pc_event.one_event->type){
        case 1 :
          pli_var.pc_event.print(PC_TRIG_TH, PC_TRIG_WD);
          break;
        case 2 :
          pli_var.pc_event.print(PC_TRIG_TH, PC_TRIG_WD);
          break;
        case 3 :
          pli_var.l2.vld_counter  = pli_var.pc_event.one_event->wait;
          pli_var.l2.cpu          = tf_getp(PC_TRIG_CP);
          pli_var.l2.cpu_invalid  = 0;
          pli_var.l2.l2_bank      = 0xf;//set four bank
          pli_var.l2.cpu_invalid  = 0xff;//8 cpu
          pli_var.l2.cpu_invalid ^= tf_getp(PC_TRIG_AT);
          tf_putp(PC_TRIG_ST, 1);//start counter
          break;
        case WARMRST :
          pli_var.pc_event.set_warm();
          break;
        case EXTINT :
          pli_var.pc_event.set_extint(pli_var.pc_event.one_event->wait);
          break;
        case TEMPTRIG :
          pli_var.pc_event.set_temptrig(pli_var.pc_event.one_event->wait);
...

PLI群も整備しないと、何が起きているのか分からないなあ。。。

OpenSPARC T1の調査(1. シミュレーション環境の構築)

どうもOpenSPARC T2の調査が芳しくないので、一つ前に戻って、OpenSPARC T1について調査してみよう。

まず、simsコマンドについて調査していたのだが、VCS, NC-Verilog以外のシミュレータを使うための手段として、以下のサイトが参考になった。

abishekramdas.blogspot.jp

tar xjf OpenSPARCT1.1.7.tar.bz2
cp OpenSPARCT1.bash OpenSPARCT1.origin.bash
chmod +w OpenSPARCT1.bash
emacs OpenSPARCT1.bash
source OpenSPARCT1.bash

Emacsでの編集内容は以下。

export DV_ROOT=/home/masayuki/work/opensparc/t1/
export MODEL_DIR=/home/masayuki/work/opensparc/t1_model/

sims の実行は以下を利用する。

sims -sim_type=mti -group=core1_mini -sim_build_cmd=vlog -sim_run_cmd=vsim -sim_build_args="-work worklib" -sim_run_args=worklib.cmp_top -novera_build -novera_run -novcs_run

このままでは、ファイルリストが正しく生成できないので、bw_cppを訂正する。

#  cpp -E -traditional-cpp `/bin/echo $* | /bin/sed 's/-B/ /g' ` | \
  cpp -P -E -traditional-cpp `/bin/echo $* | /bin/sed 's/-B/ /g' ` | \

ここまで行くと、vlogを実行することが出来るようになるのだが、Intel ModelSim Starter Editionの影響だかよく分かっていないのだがエラーが発生する。どうもオプションが違うらしいのだが修正方法が分からない。

sims: LM_LICENSE_FILE : /import/EDAtools/licenses/synopsys_key:/import/EDAtools/licenses/ncverilog_key
sims: NOVAS_HOME not defined, Debussy will not be used.
sims: Building rtl model
sims: vlog -work worklib -f flist
Model Technology ModelSim - Intel FPGA Edition vlog 10.5b Compiler 2016.10 Oct  5 2016
Start time: 19:45:05 on Feb 25,2017
vlog -work worklib -f flist
** Error: (vlog-66) Execution of vlib failed. Please check the error log for more details.
sh: 1: /home/masayuki/intelFPGA/16.1/modelsim_ase/linuxpe/vlib: not found

最初に、vlib worklibを実行しておけば問題ないことは分かっているので、tools/src/sims/sims,1.262 line 2285.を修正してしまう。

  • 訂正前
    if (! $opt{dryrun})
    {
      system ($build_cmd) ;
      die ("DIE. failed building model") if ($?) ;
    }
  • 訂正後
    if (! $opt{dryrun})
    {
      system ("vlib worklib") ;
      system ($build_cmd) ;
      die ("DIE. failed building model") if ($?) ;
    }

ただし、このままではどうもperlのバージョンが合わないのか、うまく行かない。 どうもアセンブラコンパイルしている見たいのなのだが、Vector.soでエラーが発生している。

sims: Looking for diag under $DV_ROOT/verif/diag
sims: Found diag under /home/masayuki/work/opensparc/t1//verif/diag/assembly/arch/cache_buf/Dcache_war.s
sims: assembling diag
sims: midas -mmu=niagara -diag_root=/home/masayuki/work/opensparc/t1/ diag.s
/usr/bin/perl: symbol lookup error: /home/masayuki/work/opensparc/t1//tools/perlmod/Linux-x86_64/auto/Bit/Vector/Vector.so: undefined symbol: Perl_Gthr_key_ptr
sims: Caught a SIGDIE. midas compilation error at /home/masayuki/work/opensparc/t1//tools/src/sims/sims,1.262 line 4090.

/bin/rmdir: '/var/tmp/masayuki:dcache_war:model_core1:core1_mini:0:26202' を削除できません: そのようなファイルやディレクトリはありません
sims: imiss_branches:model_core1:core1_mini:0
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/\${ <-- HERE *(\w+)}*/ at /home/masayuki/work/opensparc/t1//tools/src/sims/sims,1.262 line 3980.

これ、かなりいろいろ調査して解消しようとしていたのだが、結局うまく行かない。

midas -mmu=niagara -diag_root=/home/masayuki/work/opensparc/t1/ diag.s

まずは先に進むために、この部分を省略してみよう。

    # my $waitstatus = call_program($cmd, "midas.log");
    my $waitstatus = 0;

続いて、 symbol.tbl の条件を削除する。

      # die ("DIE. could not find symbol.tbl file") if (!-f "symbol.tbl") ;

worklibの場所をどのように指定すれば良いのか分からないなあ。とりあえず絶対パスを渡しておく。

sims -nosimslog -sim_build -novera_build -sys=core1 -vcs_rel_name=core1_2017_02_25_4 -sim_build_cmd=vlog -sim_run_cmd=vsim -sim_build_args="-work worklib" -sim_
run_args=/home/masayuki/work/opensparc/t1_model/core1/core1_2017_02_25_3/worklib.cmp_top -novera_run -novcs_run -nosas -novcs_run

とりあえず動くようになったけど、ちゃんと命令フェッチは走り始めてるのかなあ。。。

要確認。

f:id:msyksphinz:20170225201753p:plain

追記:なんだかDRAMの初期化っぽいのが始まった気がする。もうちょっと様子を見てみよう。

f:id:msyksphinz:20170225215312p:plain