論理合成 |
機能シミュレーション |
LED ControllerブロックのサンプルHDLコードを論理合成用の作業ディレクトリICCにコピーする。
vlsi> cd ~/d vlsi> cp -r sample/verilog6 ICC vlsi> cd ICC
モジュール構成
Verilog HDLファイル構成
ファイル名 | 機能 |
---|---|
div.v | (214-1)分周器(クロック周波数を下げる) |
pwm.v | 4bit PWM(輝度調整) |
blnk.v | 512PWM周期 Duty ratio = 0.5(LED点滅) |
led.v | LED Controller全体 |
tb_led.v | led.vのテストベンチ(シミュレーション用) |
シミュレータに入力するHDLファイルを指定するための、入力ファイルリストを記載したファイルを作成する。ここでは、led.fというファイル名で下記の内容を記載する。
led.fの内容
tb_led.v (※) led.v div.v pwm.v blnk.v |
※ テストベンチは、最初に記載するとよい。この場合、`timescale をテストベンチファイルに記述しておけば、回路を記述したHDLファイルでは、`timescaleを省略してもよい。
コマンドラインで、Verilog-XLを起動する。setlicは、各ツールの環境設定を行う。shellに対して、最初の1回だけ実行すればよい。
vlsi> setlic Cadence INCISIVEに相当する番号を入力 vlsi> verilog +gui -s -f led.f &[参考] Verilog-XLのオプション
+gui | GUIモードで起動 |
-s | シミュレーションの前に一旦停止(モニタ信号などを指定できる) |
-f | 入力ファイルリストを記入したファイルを指定 |
SimVisionでシミュレーション結果を確認する。左欄の+マークをクリックすると階層が展開される。この例では、テストベンチtb_ledの下にモジュールledのインスタンス uutが存在する。uutをクリックすると、uutの入出力信号名のリストが表示される。
この状態で、ツールバーのブロック図アイコンをクリックすると、ブロック図が表示される。ブロックをダブルクリックすると下位の階層のブロック図が表示される。
波形アイコンをクリックすると、Waveformビュワーが表示される。
Waveformビュワーの開始ボタンをクリック(上図参照)すると、シミュレーションが実行され、波形が表示される。=ボタンをクリックすると、シミュレーションされた波形全体が表示される。POUTのパルス幅が、徐々に増えていくのを確認する。確認できたら、開始ボタンの右側にある一時停止ボタンで止めてよい。
メニュー:File > Exit SimVisionを選んで終了する。
論理合成 |
.synopsys_dc.setupというファイル名で、下記の内容のセットアップファイルをICCディレクトリの中に作成する。(予め用意してあるので、内容を確認して使用してもよい)
.synopsys_dc.setup
set search_path "$search_path ../kyoto/synthesis/lib/" set target_library “ROHM18_FF.db ROHM18_WO_FF.db” set link_library "* ROHM18_FF.db ROHM18_WO_FF.db ROHM18_ADD.typ.db" |
ICCディレクトリに、led.sdcというファイル名で、制約条件ファイルを作成する。
led.sdc
create_clock -name CLK -period 2.0 -waveform {0 1.0} [get_ports {CLK}] set_clock_uncertainty 0.1 -setup [get_ports {CLK}] set_clock_uncertainty 0.1 -hold [get_ports {CLK}] |
制約条件は、SDC(Synopsys Design Constraint Format)というフォーマットで記述される。この例では、以下のような条件を想定してクロックが設定されている。
クロック信号名 | CLK |
クロック周期 | 2.0ns |
クロックの遅延、パルス幅 | 0ns, 1.0ns(従ってデューティ比 = 50%) |
セットアップタイミングのジッタ | 0.1ns |
ホールドタイミングのジッタ | 0.1ns |
set_input_delay 0.5 -max -clock "CLK" {WIDTH} set_input_delay 0.2 -min -clock "CLK" {WIDTH} |
指定したパターンにマッチする入力端子(ここではWIDTH[3:0])に対して、以下の設定をしている。
クロック信号名 | CLK |
最大遅延時間 | 0.5ns |
最小遅延時間 | 0.2ns |
[参考] 合成対象の入力に接続されている前段の回路の出力が、クロックよりTdin遅れたとき、合成する回路のレジスタがセットアップタイム違反を起こさないように回路(遅延時間Tn)を合成させる(下図参照)。論理合成対象回路の入力タイミングに対するマージンが必要でなければ、Max Rize =0, Min Rize =0 としてもよい。
set_output_delay 0.5 -max -clock "CLK" {OUT} set_output_delay 0.2 -min -clock "CLK" {OUT} |
指定したパターンにマッチする出力端子(ここではOUT)に対して、以下の設定をしている。
クロック信号名 | CLK |
最大遅延時間 | 0.5ns |
最小遅延時間 | 0.2ns |
[参考] 次のクロックエッジよりも、Tdoutだけ早く出力を行わないと、次段の回路でセットアップタイム違反が発生する場合、セットアップタイム違反が発生しないように回路(遅延時間Ts)を合成させる(下図参照)。次段の回路への入力タイミングに対するマージンが必要でなければ、Max Rize =0, Min Rize =0 としてもよい。
set_drive 3 {CLK} set_drive 3 {RST_B} |
入力端子に対して(ここではCLKとRST)、以下の設定をしている。
接続される回路の出力抵抗 | 3kohm |
[参考] 出力抵抗を0にすると、ドライブ強度は無限大となる。抵抗の単位はライブラリに依存する。IOバッファが接続される端子は、set_driving_cell で入力IOセルを指定してもよい。
set_load -pin_load 0.01 {OUT} set_load -min -pin_load 0.01 {OUT} |
出力端子に対して(ここではOUT)、以下の設定をしている。
出力端子に接続される負荷容量 | 0.01 pF (IOバッファの入力容量等を設定) |
[参考] 容量の単位は、ライブラリに依存する。
コマンドラインから、Design Visionを起動する。
vlsi> cd ~/d/ICC vlsi> setlic Synopsys Synthesisに相当する番号を入力 vlsi> design_vision (&は不要)
design_vision> define_name_rules verilog -allowed "A-Z0-9_" design_vision> change_names -rule verilog -hierarchy
design_vision> write_sdf -version 1.0 led.sdf
タイミングシミュレーション |
論理合成した回路に対して、タイミングシミュレーション(ゲート遅延を含む論理シミュレーション)を行う。急いでいる人は、論理合成ツールを信用してここは飛ばしてもよい。ただし、動作速度を重視する場合は、タイミングシミュレーションが必要となる。
led_syn.fの内容
tb_led.v テストベンチ led_syn.v 論理合成結果のネットリスト -v ../kyoto/verilog/rohm18_typ.v シミュレーションライブラリ(※) |
led_syn.fを読み込んで、Verilog-XLを起動する。操作は、機能シミュレーションの時と同じ。
vlsi> setlic Cadence INCISIVEに相当する番号を入力 vlsi> verilog +gui -s -f led_syn.f[参考] 複数ビットを選んで16進表示にしたい場合は、上位ビットから複数の信号を選択し、右クリックで表示されるポップアップメニューからCreate Busを選ぶ。さらに、数値欄(真ん中の欄)で、右クリックを行うと、Radix(基数)を選択できる。
Copyright (C) 2016- Akio Kitagawa, Kanazawa Univ.