ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

OpenSparc Code Ijiri

VeritakのたっくさんによるOpenSparcをいじるための素晴らしい環境の紹介です。

Code Ijiriとは

まずはshinhさんの所を読んでください。
http://d.hatena.ne.jp/shinichiro_h/20081130#1228038576

微妙に動いていないのが丁度良い難易度だと思います。

Veritakでシミュレーションできるまで

(1)Veritakをインストールする。
 ダウンロードはこちらから。
 http://japanese.sugawara-systems.com/download.htm

(2)OpenSparcのプロジェクトをダウンロードする。
FAQの640番からダウンロードできます。
 http://japanese.sugawara-systems.com/faqs.htm

(3)シミュレーションをする。
 圧縮ファイルを展開し、\s1_core\hdl\behav\testbench\s_wave.vtakprj をダブルクリックする。

これだけで、Sparcのコアがシミュレーションできます。

早速波形を見てみましょう。


どうもRAMに書き込みをしていないような雰囲気です。

もうちょっと見てみよう

クロックは入っていて、リセットは入って解除されているようなので、プログラムカウンターを見てみましょう。
ソースから勝手に想像しているだけで全然違うかもしれませんが、追えるだけ追いましょう。

プログラムカウンターはsparc_ifu_fdp.vの中にあります。

ifu_exu_pcver_eが外部に出している64bitのプログラムカウンターで、このアドレスに対してアクセスしていそうです。他にもプログラムカウンターっぽい出力(ifu_tlu_pc_mとか)もあるのですが、多分コピーして出しているだけなので今は深く考えません。

ざっとSparcのパイプラインをおさらいします。Sparcは6stageのパイプラインになっていて、それぞれに名前が付いています。

  • Fetch
  • Thread selectoin
  • Decode
  • Execute
  • Memory
  • Writeback

Thread selectonがS-stageに引っかけてあることを除けば、残りは頭文字がstageのプリフィクスになっています。sparc_ifu_fdp.vを見ていくと、プログラムカウンターの宣言があります。

   wire [48:0]  t0pc_f, t1pc_f, t2pc_f, t3pc_f,         // F stage thread PC
		t0pc_s, t1pc_s, t2pc_s, t3pc_s,         // S stage thr pc
		t0_next_pcs_f, t1_next_pcs_f, t2_next_pcs_f, t3_next_pcs_f,
		t0npc_bf, t1npc_bf, t2npc_bf, t3npc_bf, // Next PC in
		                                        // BF stage
		pc_s, pc_d, pc_e, pc_m, pc_w,          
		npc_s, npc_d, npc_e, npc_m, npc_w,
		pc_d_adj, npc_d_adj;

OpenSparc T1は一つのcoreで4スレッドを同時に実行出来ます。t0pc_f, t1pc_f, t2pc_f, t3pc_fと、プログラムカウンターがたしかに4つあります。FetchとThread selectoinまでは4つのプログラムカウンターがありますが、その後(Thread選択後)は各stageに一つだけプログラムカウンターがあります。全stageのプログラムカウンターを内部で持っているようです。パタヘネに載っている回路図では、プロセッサの中でプログラムカウンターは1個だけだったので、教科書と実際のCPUの差が分かります。MIPSも中ではstage毎にプログラムカウンターを持っていると思いますが、教科書の図では省略されているのでしょう。

OpenSPARC. T1 Microarchitecture Specificationのp2-7のFigure2-4を見ても、大きくは外して無さそうです。

スレッド切り替えのために4つプログラムカウンターから1つを選択しているところもすぐに見つかります。

   // select the pc to be used on a switch -- need to protect
   dp_mux4ds #(48) swpc_mux(.dout (swpc_bf), 
			                    .in0 (t0pc_f[47:0]), 
			                    .in1 (t1pc_f[47:0]), 
			                    .in2 (t2pc_f[47:0]), 
			                    .in3 (t3pc_f[47:0]),
			                    .sel0_l (fcl_fdp_next_thr_bf_l[0]),
			                    .sel1_l (fcl_fdp_next_thr_bf_l[1]),
			                    .sel2_l (fcl_fdp_next_thr_bf_l[2]),
			                    .sel3_l (fcl_fdp_next_thr_bf_l[3]));

もしスレッドを切り替えるプログラムがあれば、このあたりを追えば中で何が起こっているか追えますね。

次のステップ

プログラムカウンターはそれっぽく動いているので、次はROMからデータをフェッチできているかを確認したいです。
ROMのデータはrom_harness.hexだと思われるので、そこから追っていきましょう。