第6回 dc_shellを使った論理合成 慶應義塾大学 理工学部 天野
6回の目的 前回のPICOは、フォワーディングと分岐命令の早期対処が付いていないため、場合によってはパイプラインがうまく働かない この授業はコンピュータアーキテクチャの授業ではないので、CPU自体の理解はいい加減でも進めるようにしたい 情報工学科以外の方は、http://www.am.ics.keio.ac.jp/picobookおよび「作りながら学ぶコンピュータアーキテクチャ:培風館」にPICOについての情報がある。しかし、これらはSFLで書かれているのであまり参考にならないかも、、、 命令セットのドキュメントは、pico.pdfを参照のこと cp –r ~hunga/vlsi07/6kai . でファイルを全部持ってくる
PICOのパイプライン構造 WB IF RF EX 2 + ALU Data Memory Instruction Memory RFPC rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
パイプラインハザード データハザード コントロールハザード 命令間の依存性により発生 先行する命令の結果を次の命令が利用する 結果をレジスタファイルに書き込む前に次の命令がこれを読み出してしまう コントロールハザード 分岐命令により発生 飛び先が決まるまで、次の命令をパイプラインに入れることができない
データハザード ADDI r3,#2 LD r3,(r1) LDLI r1,#0 IF RF EX WB 2 + ALU Data RFPC IF RF EX WB a 2 rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
Data Memory Instruction Memory ST (r1),r3 ADDI r3,#2 LD r3,(r1) LDLI r1,#0 RFPC IF RF EX WB a 2 rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
データハザード:答えを書き込む前にレジスタファイルを読み出す ST (r1),r3 ADDI r3,#2 LD r3,(r1) RFPC IF RF EX WB a 2 rega regc + U ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
フォワーディング 計算した結果をすぐに次の命令で利用可能にする 先行命令の書き込みレジスタ番号と後続命令の読み出しレジスタ番号が一致 先行命令がST、分岐命令ではない(つまり結果をレジスタファイルに書き込む命令である) ALUの出力からのフォワーディングデータfdataをレジスタからの値と入れ替える
フォワーディング fdata IF RF EX WB 2 + ALU Data Memory Instruction Memory RFPC rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
Data Memory Instruction Memory ADDI r3,#2 LD r3,(r1) LDLI r1,#0 RFPC IF RF EX WB a 2 rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
Data Memory Instruction Memory ST (r1),r3 ADDI r3,#2 LD r3,(r1) LDLI r1,#0 RFPC IF RF EX WB a 2 rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
Data Memory Instruction Memory ST (r1),r3 ADDI r3,#2 LD r3,(r1) RFPC IF RF EX WB a 2 rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
コントロールハザード NOP2 NOP1 BEQZ r3,-6 IF RF EX WB 2 + 飛び先 ALU Data Memory RFPC IF RF EX WB a 2 rega regc + 飛び先 ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
Data Memory Instruction Memory NOP3 NOP2 NOP1 BEQZ r3,-6 RFPC IF RF EX WB a 2 rega regc + ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction 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ステージで計算 1クロックのNOPは必要 EXステージは分岐命令については何もやらない 1クロックのNOPは必要 しかし、これを有効な命令で置き換えることができる→ 遅延分岐
Data Memory Instruction Memory BEQZ r3,-6 NOP1 IF RF EX WB + 2 rega regc + a ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction Memory
Data Memory Instruction Memory Next Inst. NOP1 BEQZ r3,-6 IF RF EX WB + 2 rega regc + a ALU IFPC regb c b Imm. wadr IFIR RFIR Data Memory Instruction 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 メッセージを見るため
パス指定とファイルの読み出し verilogファイルの読み出し 対象デザインの指定 デザインのチェック パスの指定:実験室は /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は、設計を検討して修正した方が良いものと無視して良いものがある
クロックと入出力遅延の設定 3ns 10ns 4ns 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 Q D Q 3ns 10ns 4ns
入力ポート接続側遅延設定 clk,reset_ 入力側にドライバを想定し、遅延を制限 は対象外 set_driving_cell -lib_cell INV1 -library rohm06_tbl.db:ROHM06 [remove_from_collection [all_inputs] {clk reset_}] clk,reset_ は対象外 入力側にドライバを想定し、遅延を制限
出力側容量設定 INV1 A インバータ5個分の仮想容量を付加する set_load [expr 5 * [load_of rohm06_tbl_db:ROHM06/INV1/A] ] [all_outputs] INV1 A インバータ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 面積は基本的に0にしておく クロック設定のチェック 最初のコンパイル 階層の破壊 インクリメンタルコンパイル
最適化 Design Wareの利用 共有化 アーキテクチャレベル 平坦化 構造化 論理レベル オプション設定 ゲートレベル インクリメンタルコンパイル ゲートレベル
平坦化と構造化 平坦化 set_flatten true 構造化 set_structure –boolean 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 –incremental –map_effort high
最適化の基本的な考え方 まずは面積方向に最適化する それから速度を少しずつ上げていく 速度はタイミング解析でどこに問題があるかは明確。しかし面積のどこが削減可能かは判断が困難 それから速度を少しずつ上げていく Design Compilerは、速度をある程度以上高速化するためには、面積を非常に大きくしてしまう 配置配線を考えると速度的にも不利になることも考えられる
トップダウンとボトムアップ 今回は回路規模が小さいので全ての設計を読み込んで、一度に合成をかけた トップダウン合成 回路規模が大きい場合、それぞれのブロックに対して制約をかけて合成し、最後にこれをまとめる ボトムアップ合成 ACS(Automated Chip Synthesis)では、これらを組み合わせる方法をサポートしている
結果のレポートと出力 大きい方から10本表示 面積の表示 中間形式の保存 Verilog形式の保存 終了 report_timing -max_paths 10 report_area write -hier -format ddc -output ppico16.ddc write -hier -format verilog -output ppico16.vnet quit 面積の表示 中間形式の保存 Verilog形式の保存 終了
仮遅延シミュレーション 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)を付けよ 面積をあまり酷く大きくしない程度に、速度重視の最適化を行い面積と最大遅延を確認、天野(hunga@am.ics.keio.ac.jp)までソースと最大遅延、面積をメールのこと