Verilog

第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])までソース
と最大遅延、面積をメールのこと