第6回 dc_shellを使った論理合成 慶應義塾大学 理工学部 天野 6回の目的 前回のPICOは、フォワーディングと分岐命令の早期対処が付いてい ないため、場合によってはパイプラインがうまく働かない そこで、今日は、一応動くPICOの設計を行う この授業はコンピュータアーキテクチャの授業ではないので、CPU自 体の理解はいい加減でも進めるようにしたい 情報工学科以外の方は、http://www.am.ics.keio.ac.jp/picobook および「作りながら学ぶコンピュータアーキテクチャ:培風館」にPICO についての情報がある。しかし、これらはSFLで書かれているのであ まり参考にならないかも、、、 命令セットのドキュメントは、pico.pdfを参照のこと cp –r ~hunga/vlsi07/6kai . でファイルを全部持ってくる PICOのパイプライン構造 IF RF RFPC WB EX a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory パイプラインハザード データハザード 命令間の依存性により発生 先行する命令の結果を次の命令が利用する 結果をレジスタファイルに書き込む前に次の 命令がこれを読み出してしまう コントロールハザード 分岐命令により発生 飛び先が決まるまで、次の命令をパイプラインに 入れることができない データハザード ADDI r3,#2 LD r3,(r1) IF RF LDLI r1,#0 RFPC EX WB a 2 ALU + rega IFPC 0 regc regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory ST (r1),r3 ADDI r3,#2 IF RF LD r3,(r1) RFPC EX LDLI r1,#0 WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory 0 データハザード:答えを書き込む前にレジスタファイルを読み出す ST (r1),r3 IF RF ADDI r3,#2 RFPC EX LD r3,(r1) WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory U フォワーディング 計算した結果をすぐに次の命令で利用可 能にする 先行命令の書き込みレジスタ番号と後続命令 の読み出しレジスタ番号が一致 先行命令がST、分岐命令ではない(つまり結 果をレジスタファイルに書き込む命令である) ALUの出力からのフォワーディングデータ fdataをレジスタからの値と入れ替える フォワーディング IF RF RFPC EX WB fdata a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory ADDI r3,#2 LD r3,(r1) IF RF LDLI r1,#0 RFPC EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory ST (r1),r3 ADDI r3,#2 IF RF RFPC LD r3,(r1) LDLI r1,#0 EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory ST (r1),r3 IF RF ADDI r3,#2 RFPC EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory LD r3,(r1) コントロールハザード NOP2 BEQZ r3,-6 NOP1 IF RF RFPC EX WB a 2 regc ALU + rega IFPC 飛び先 regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory NOP3 NOP2 IF RF BEQZ r3,-6 NOP1 RFPC EX WB a 2 regc ALU + rega IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory フォワーディングの実装 RFステージ assign frega = (ifir[`DecRd] == rfir[`DecRd])&rwen ? fdata: dout1; assign fregb = (ifir[`DecRs] == rfir[`DecRd])&rwen ? fdata: dout2; このfrega, fregbをaレジスタ、bレジスタにセットする EXステージ assign fdata = // when LD datain ((rfir[`DecOpe] == `ROP) & (rfir[`DecFunc] == `LD)) ? ddatain : aluout; assign rwen = // Disable when Braches or ST (rfir[`DecOpe] == `BEQZ) | (rfir[`DecOpe] == `BNEZ) | ((rfir[`DecOpe] == `ROP) & (rfir[`DecFunc] == `ST)) | ((rfir[`DecOpe] == `ROP) & (rfir[`DecFunc] == `NOP)) ? `Disable : `Enable; コントロールハザードの回避 分岐の判断、分岐先アドレスをRFステージ で計算 RFステージに分岐先アドレス計算用加算器が 必要 EXステージは分岐命令については何もやらな い 1クロックのNOPは必要 しかし、これを有効な命令で置き換えること ができる→ 遅延分岐 BEQZ r3,-6 IF RF EX + NOP1 WB 2 ALU + regc rega a IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory Next Inst. RF EX + IF BEQZ r3,-6 NOP1 WB 2 ALU + regc rega a IFPC regb c b IFIR Instruction Memory Imm. wadr RFIR Data Memory コントロールハザード改善 RFステージ assign immex= {{8{ifir[7]}},ifir[`DecImm]}; assign badr = ifpc + immex ; assign pcset = (ifir[`DecOpe] == `BEQZ) & (frega == 16'b0) | (ifir[`DecOpe] == `BNEZ) & (frega != 16'b0); 論理合成と圧縮 これで一通り16ビットプロセッサの設計が できた 命令が不完全なので、少しずつ付け足して いく→ 演習 今までとは違ってdc_shellを使って合成し てみよう dc_shellとは 論理合成圧縮ツールDesign Compilerに対して 直接コマンドを与えて、合成圧縮を行うための シェルスクリプト 柔軟かつ繰り返しを含めてコマンドを与えること が可能 dc_shellスクリプトが長年使われてきたが、2005 年9月よりTclスクリプトに移行 design_visionはDesign CompilerのGUI、複雑 かつ大きな回路の設計時には絶対的にdc_shell が有利 メッセージを見るため 実行コマンド dc_shell-xg-t –f ppico16.tcl | tee ppico16.rpt パス指定とファイルの読み出し パスの指定:実験室は /usr/local/vdec/lib/rohm/synopsys set search_path [concat "/home/vdec/lib/rohm0.6/EXD/synopsys/" $search_path] read_verilog if_stage.v read_verilog regfile.v read_verilog rf_stage.v read_verilog ex_stagef.v read_verilog ppico16.v current_design "ppico16" check_design verilogファイルの読み出し 対象デザインの指定 デザインのチェック check_designで出るWarningは、設計を 検討して修正した方が良いものと無視し て良いものがある クロックと入出力遅延の設定 create_clock -period 10 clk -waveform {0 5} set_input_delay 3 -clock clk [all_inputs] set_output_delay 4 -clock clk [all_outputs] D 3ns Q D 10ns Q 4ns 入力ポート接続側遅延設定 set_driving_cell -lib_cell INV1 -library rohm06_tbl.db:ROHM06 [remove_from_collection [all_inputs] {clk reset_}] 入力側にドライバを想定し、遅延を制限 clk,reset_ は対象外 出力側容量設定 set_load [expr 5 * [load_of rohm06_tbl_db:ROHM06/INV1/A] ] [all_outputs] A INV1 インバータ5個分の仮想容量を付加する 合成の設定 ファンアウトの制限 面積は基本的に0にしておく set_max_fanout 12 [current_design] set_max_area 0 derive_clocks クロック設定のチェック compile -map_effort medium -area_effort medium 最初のコンパイル ungroup -all –flatten compile -incremental 階層の破壊 インクリメンタルコンパイル 最適化 アーキテクチャレベル 論理レベル ゲートレベル Design Wareの利用 共有化 平坦化 構造化 オプション設定 インクリメンタルコンパイル 平坦化と構造化 平坦化 set_flatten true 全ての論理を一度AND-OR型に変換 -effort high 回路規模に関係なく実行 -phase true 正負の論理の両方で実行 速度方向の最適化に有効だが、回路規模が大きいと 時間がかかる 構造化 set_structure –boolean true 論理式のレベルで共通項をくくりだす デフォルトで実行される 面積方向の最適化を行うには –boolean trueを設定 し、ブール式レベルの最適化を行う 速度方向の最適化を行うにはset_structure falseとす る場合がある コンパイルオプション 面積方向 set_structure –boolean true compile … ungroup –all –flatten compile –incremental –area_effort high 速度方向 クロック周期を短く設定 set_flattern true –ph true –effort high compile ungroup –all –flatten compile –incremental –map_effort high 最適化の基本的な考え方 まずは面積方向に最適化する 速度はタイミング解析でどこに問題があるか は明確。しかし面積のどこが削減可能かは判 断が困難 それから速度を少しずつ上げていく Design Compilerは、速度をある程度以上高 速化するためには、面積を非常に大きくしてし まう 配置配線を考えると速度的にも不利になるこ とも考えられる トップダウンとボトムアップ 今回は回路規模が小さいので全ての設計 を読み込んで、一度に合成をかけた 回路規模が大きい場合、それぞれのブロッ クに対して制約をかけて合成し、最後にこ れをまとめる トップダウン合成 ボトムアップ合成 ACS(Automated Chip Synthesis)では、こ れらを組み合わせる方法をサポートしてい る 結果のレポートと出力 report_timing -max_paths 10 大きい方から10本表示 面積の表示 report_area 中間形式の保存 write -hier -format ddc -output ppico16.ddc Verilog形式の保存 write -hier -format verilog -output ppico16.vnet quit 終了 仮遅延シミュレーション verilog ppico16_test_net.v ppico16.vnet memory.v –v /usr/local/vdec/lib/rohm/cadence/rohm06.v または ./netsim ← 中に実行コマンドが書いてあるだけ、、 simvisionで結果を確認しよう 演習 ppico16.vにBMI(Branch Minus),BPL(Branch Plus)を付けよ 面積をあまり酷く大きくしない程度に、速 度重視の最適化を行い面積と最大遅延 を確認、天野 ([email protected])までソース と最大遅延、面積をメールのこと
© Copyright 2024 ExpyDoc