ラベル eda の投稿を表示しています。 すべての投稿を表示
ラベル eda の投稿を表示しています。 すべての投稿を表示

2014-08-15

Cadence Virtuoso on SL7

RHEL7のクローンであるSL7にて, Cadence Virtuoso 6.1.5 を動作させた. Virtuoso の起動時, sysnameというシェルスクリプトがKernelのバージョンからOSの種類を判定しているのだが, 3.10は対応していなかった. 以下のように書き換えることで, SL7でも起動するようになった.
--- IC06.15.171-615_lnx86.Hotfix/oa_v22.41.033/bin/sysname 2013-03-27 09:19:10.000000000 +0900
+++ IC06.15.171-615_lnx86.Hotfix/oa_v22.41.033/bin/sysname 2014-08-15 14:49:14.259021502 +0900
@@ -199,7 +199,7 @@
      case $version in
          2.4*) compiler="_gcc411"
         sysname="linux_rhel30$compiler"; sysnames="$sysname linux$compiler";;
-         2.6*|3.0*) compiler="_gcc44x"
+         2.6*|3.0*|3.10.*) compiler="_gcc44x"
                       sysname="linux_rhel40$compiler"; sysnames="$sysname linux$compiler";;
          *)    check_global;;
      esac;;

バージョン番号がハードコードされており, 2.6 または 3.0 の場合には gcc-4.4, 2.4 の場合には, gcc-4.1.1 を使用すると書かれているようだ. ここに, 3.10 を追加した.

ところで, -64オプションを付けておくと, 64ビット版で動作することが分かった. これまで, 32ビットのライブラリをいちいちインストールしていたのだが, その必要はなかったようだ.

2014-08-02

Virtuoso のライセンスと nscd

なぜか, nscd が止まっていると Virtuoso のライセンスを取得できない...
$ strmin 
*WARNING* voInit failed to find the passwd entry for (null), using '/tmp' for a home directory.
The most likely cause of this problem is the failure of NIS lookups.
Please contact your system administrator.
*WARNING* voInit failed to get the current user's login name, setting user to unknown.
*ERROR* License "111" could not be checked out.
...
nscd を起動したら, このエラーが解決された. なぜだろう...

2014-08-01

Loop exceeded maximum iteration limit.

Synopsys Design Compiler にで RTLを合成する時, 非常に広いバス配線などをループで記述すると以下のエラーが出る.
Error:  mod1.v:13: Loop exceeded maximum iteration limit. (ELAB-900)
このような場合, hdlin_while_loop_iterationsを設定しなおせば良いらしい.
set hdlin_while_loop_iterations 8191
このエラーが出る時, たいていの場合は, 合成できない記述になっていると考える方が良いのかもしれないが...

ICC上で特定のネットだけ再配線させる

Synopsys IC Compiler で配線すると, なぜか大きく迂回した配線ができてしまうことがある. このネットがアンテナ違反を起こした...

しかたないので, 以下のように一度その配線を消し, もう一度配線しなおした.

remove_net_shape [ get_net_shapes -of_objects {net1} ]
route_zrt_group -nets {net1}

2014-07-30

ICCにて相対配置 (relative placement) を使用する例

Synopsys IC Compiler にて, 複数のセルを並べて配置する場合, relative placement を使用する. 予め, RP-group を作成しておき, それにセルを追加していく.
set rp1 [create_rp_group {rp1} -columns 2]
add_to_rp_group $rp1 -leaf core/cell1 -column 0
add_to_rp_group $rp1 -leaf core/cell2 -column 1

2014-07-29

ICC エラー: could not open script file

Synopsys の IC Compiler は, ディジタル回路の物理レイアウト設計のデファクトスタンダードのツールである. このシェルで, source を実行すると, 以下のようにエラーが出ることがある.
icc_shell> source tcl/procs.tcl
Error: could not open script file "tcl/procs.tcl" (CMD-015)
ソースするときの検索パスは, search_path という変数に書かれているため, これを変更すると, 見つけることができなくなってしまうことがある. lappend search_path "." で検索パスに.を追加するか, 以下のように書けば良い.
icc_shell> source ./tcl/procs.tcl

2014-07-17

ICC ZRoute にてシールド付配線を行う

ICC ZRoute では, シールド付の信号配線がサポートされている. もちろん, Classical Router でもサポートされていた.

グローバル配線・ディテイル配線の前に, シールドを付けたい配線だけ先に配線を行なう. 具体的な手順を以下に示す.

  1. 特定の信号だけ先に配線を行う.
    route_zrt_group -nets [get_nets important_net*]
  2. シールドを作成する.
    create_zrt_shield -nets [get_nets important_net*] -with_ground VSS -coaxial_above true -coaxial_below true

シールドの作成だけなら, route_zrt_auto後でも良いのだが, 他の配線が近くにできてしまうと, シールドを作ることができなくなる.

2014-07-10

ICCのサンプルスクリプト

ICCのスクリプトのリポジトリをみつけた. 何かの役にたつかもしれない. icc-par

2014-04-04

CMOS VLSI Design 4th edition の PDF

ある大学のウェブサイトからCMOS VLSI Design (4th edition) がダウンロード出来るようになっている.

日本語訳が出ているらしい:


2014-03-12

HSPICE: .NODESET で全てのサブサーキットのノード電圧を設定

HSPICEでディジタル回路の過渡解析を行う時, 初期条件の収束に時間がかかることがある. FFなどに含まれるループでの状態が確定しないことが一因であることがある.

このような場合, .nodeset を使用して初期電圧を与えると改善するらしい. 以下に例を示す.

.nodeset V(in)=0.0 subckt=my_dff

2014-02-26

HSPICE過渡解析: 途中経過をみる

.option wave_pop=val
valに0.001から1の範囲の値を設定することで, 出力バッファをフラッシュする.

同様のオプションが HSIM にもあったが, 名前は忘れた.

2014-02-24

set_preroute_advanced_via_rule の設定を解除

set_preroute_advanced_via_rule で電源配線などのビアを設定できるが, 間違えて設定した場合に元に戻す明示的なコマンドはない.

report_preroute_advanced_via_rule が出力する結果を見ながら, どのようにすると元に戻るか調べてみた.

その結果, どうやら -cut_layerオプションだけを付けて実行すると, デフォルトのルールに設定が上書きされるらしいという事がわかった.

  1. V6にルールを設定.
    icc_shell> set_preroute_advanced_via_rule -contact_codes ZZZV6HV -move_via_to_center -size_by_array_dimensions {2 1} -rotation_mode off
    icc_shell> report_preroute_advanced_via_rule
    Default set:
    ----------------
       Size:         an area (x-size X y-size) 0.000 X 0.000
       Contact code: to be selected automatically
       Rotation:     Enable
    ...
    ----------------
    Rule for cut-layer "V6":
       Size:         via-array (nx X ny) 2 X 1
       Contact code: "ZZZV6HV" 
       Rotation:     Disable
    ----------------
    Rule for cut-layer "V7":
       Same as default
    
    V6ルールにサイズ・コンタクトコード・回転可否の条件が設定された.
  2. icc_shell> set_preroute_advanced_via_rule -cut_layer V6
    icc_shell> report_preroute_advanced_via_rule
    Default set:
    ----------------
       Size:         an area (x-size X y-size) 0.000 X 0.000
       Contact code: to be selected automatically
       Rotation:     Enable
    ...
    ----------------
    Rule for cut-layer "V6":
       Size:         an area (x-size X y-size) 0.000 X 0.000
       Contact code: to be selected automatically
       Rotation:     Enable
    ...
    
    V6ルールに Default set の値がコピーされた. これでデフォルトのルールに戻ったようだ.

2014-02-23

ICC: セルの配置時にエラー

ICCが place_opt, legalize_placement で以下のようなエラーを出した.
Error: Cell xx/xx/xx unplaceable! - cannot satisfy placement constraints. (PSYN-1106)
Error: lib cell 'xxxx' of cell xx/xx/xx is illegal for all sites in the block. (PSYN-061)
Error: Could not find a legal placement.
このセルは triple height なのだけど, 他の triple height のセルでは問題ない. セルライブラリを Milkyway で作成した時に, 以下のように triple height にしたという警告がでるのだけれど, 他のセルがここに紛れ込んでいた.
Information: Set cell  as triple height. (MWLIBP-122)
原因は, 別のセルで Boundary Layer を書き忘れていたことだった.

2014-02-17

EDAツールのライセンス設定をベンダ毎に記述

Cadence, Mentor, Synopsys のツールのライセンスは, 環境変数で指定する. 多くの人は LM_LICENSE_FILE にて各ライセンスサーバを指定するが, ツール毎に別々のライセンスサーバを立てている場合は, ライセンス取得までに時間がかかる場合がある. 別のベンダーのライセンスサーバにアクセスし, 取得に失敗するためである.

あまり知られていないが, ベンダー毎にライセンスサーバを別々に設定することができる. こうすることで, 別のベンダーのライセンスサーバにアクセスすることがなくなり, ライセンス取得までの時間を短縮できる.

Cadenceのライセンス設定

export CDS_LIC_FILE=port@server1-cadence:port@server2-cadence
export CDS_LIC_ONLY=1
環境変数CDS_LIC_ONLYを1に設定しておくと, LM_LICENSE_FILEではなくCDS_LIC_FILEからライセンスサーバの情報を取得する.

Mentorのライセンス設定

export MGLS_LICENSE_FILE=port@server1-mentor,port@server2-mentor
環境変数MGLS_LICENSE_FILEに, コンマ区切でライセンスサーバの情報を書いておく. MGLS_LICENSE_FILEが空または設定されていないと, LM_LICENSE_FILEからライセンスサーバ情報を取得するようだ.

Synopsysのライセンス設定

export SNPSLMD_LICENSE_FILE=port@server1-synopsys:port@server2-synopsys
環境変数SNPSLMD_LICENSE_FILEにコロン区切でライセンスサーバの情報を書いておく.

2014-02-14

SPICEのAC解析による容量の評価

HSPICEのAC解析によって, 容量を導出する方法を紹介する.

MOSFETのゲート-ソース間容量など, バイアス条件や他の端子の状態によって刻々と変化するような場合でも, 容量を導出することができる.

.param vbias=0.6
V1  1 0  DC 'vbias' AC .1591549430918953 0
* 以下に理想的な容量素子を例に書いておく. この値と比較する.
.param C1=1p
E1  n1 0 1 0 1
C1  n1 0  'C1'

* 評価したい素子 (この例ではMOSCAPという名前のサブサーキット)
E2  n2 0 1 0 1
x1  n2 VDD VSS MOSCAP
VVDD VDD 0  1.5
VVSS VSS 0  0.0
.measure AC C_MOSCAP avg par('Ii(E2)/Ii(E1)*C1') from=10k to=100meg

* パラメータ vbias を振って解析する
.ac dec 10 1k 1g sweep vbias 0.0 1.5 0.05

2013-12-04

HSPICE にて中断した過渡解析を再開

HSPICEでは, 過渡解析の途中の状態を保存し, あとでその状態から解析を開始することができる. 以下のような場合に便利である.
  • PLLやスイッチトキャパシタ回路にて, 準安定状態に達した後に, 様々な外乱や入力信号を与える場合.
    シミュレーションの後半で条件を振って特性を調べる場合, 初めの起動シーケンスなどを毎回シミュレーションする必要がなくなり, 時間の短縮につながる.
  • シミュレーション条件を間違えたことに気づいた場合.
    PWLなどで入力電圧を作る時, 1箇所間違えただけで最初からシミュレーションをやり直すのは時間の無駄. 予め, 途中の状態を保存するようにしておけば, 保存した時刻からやり直せばよい.
    あるいは, シミュレーション時間が短すぎた場合, 最後の状態から再開させれば, 続きをシミュレーションできる.
  • 停電やサーバの異常に備える.
    停電やサーバの異常停止が起こっても, 途中から再開できる.
以下に例を示す. 過渡解析を 500us 間行い, 時刻 99.7us で1回目の保存, その後 100us ごと (199.7us, 299.7us, ..., 499.7us) に保存を行う.
.tran 0.1u 500u
.store type=IC file=prefix time=99.7u repeat=100u

2013-12-02

ICC による tie ネットの配線

IC Compiler でタイネット (H, L レベルに固定する入力) の配線方法はいろいろある.
  • preroute_standard_cells や preroute_instances で -tie オプションをつけて配線する.
    この場合, 電源配線として配線されるので, やや違反を起こしやすいきがする.
  • derive_pg_connection -tie にて電源に接続させ, route_zrt_auto や route_opt で配線する.
    この場合, Classical router, Z-router を使用するので, エレガントに処理してくれる. それでも, 電源レールや電源メッシュの太い配線から細い配線を出すので, DRC違反を起こす可能性がある.
    set_route_zrt_common_options -tie_off_mode rail_only を設定しておくと, 少しはましかもしれない.
  • connect_tie_cells によってタイセルを追加し, 完全に信号線にしてしまう.
    この場合, 電源から配線を伸ばすわけではないので, 違反が起こりにくい.

理想的にはタイネットは無駄なことをしているのだけれど, モジュール間の信号や, S/R入力付DFFのRのみを使う場合に発生してしまうようだ.

2013-11-30

HSPICE サブサーキットのポート電流

HSPICE でシミュレーションする際, サブサーキットのポート電流をモニタすることができる. 通常,電流をプローブするためには, 0Vの電圧源を取り付けるなど, ネットリストを改変する必要があるが, HSPICE では, isub によってサブサーキットのポートに流れる電流を記録できる. 以下に例を挙げる.
.subckt INV_X1 IN OUT VDD VSS
m0  OUT IN VSS VSS  nmos ...
m1  OUT IN VDD VDD  pmos ...
.ends

VVDD VDD_sim 0  1.5
VVDD VSS_sim 0  0.0
VVA  A   0  PWL(1n 0.0  2n 1.5  6n 1.5  7n 0.0)
CY   Y   0  100f
x1  A Y VDD_sim VSS_sim INV_1X

.tran 10p 10n
.probe Isub(x1.VDD) Isub(x1.VSS)
もちろん, 階層が深くても, ドット (.) で区切って深い階層のポートを指定することで, ポート電流を記録できる.

2013-07-24

ICCompiler オブジェクトの外枠を取得

ICC にて セルやマクロの外枠座標を取得するプロシージャを紹介する.
proc get_bbox {name {offset 0}} {
    set bbox [get_attribute ${name} bbox]
    set x1 [lindex [lindex $bbox 0] 0]
    set y1 [lindex [lindex $bbox 0] 1]
    set x2 [lindex [lindex $bbox 1] 0]
    set y2 [lindex [lindex $bbox 1] 1]
    return [list [list [expr $x1-$offset] [expr $y1-$offset]] [list [expr $x2+$offset] [expr $y2+$offset]]]
}
上記の定義にて, マクロの外枠を取得でき, offset を指定すれば, そのオフセット分だけ外に広げて return する. マクロ周囲にブロッケージを生成する場合などに便利である. 使用例を示す.
icc_shell> get_bbox I0 
{456.0 921.6} {1651.6 1645.2}
icc_shell> get_bbox I0 16
{440.0 905.6} {1667.6 1661.2}

2013-07-16

VerilogHDL における VCD 出力

VerilogHDL のシミュレータには様々なものがあるが, VCD と呼ばれる標準フォーマットで出力することで, シミュレータには依存しない波形ビュワーを使用することが出来る. VCD を表示できるビュワーには, 例えば GTKWave と呼ばれるフリーのソフトがある. これを使用すれば, ノートPCなどで波形を見ることもできるので, 出張中であってもシミュレーションができる. Synopsys の CustomExplorer でも表示できる. HSPICE によるトランジスタレベルのシミュレーションと並べて結果を表示できるので, Mixed-signal 回路設計に便利そうだ.

VCD を出力するには, VerilogHDL のテスト環境に, 以下のような記述を入れる.

initial begin
    $dumpfile("myresult.vcd");
    $dumpvars(0, tb);
end
myresult.vcd, tb はそれぞれ出力ファイル, トップ階層のモジュール名 (テスト環境のモジュール名) である.

なお, VCD のフォーマットは, プリンタブルな文字列で圧縮されているので, スクリプト処理には向かない. 何らかのスクリプト処理を行うならば, $print や, $monitor を使う方が良いだろう.