シミュレーション
ロジックシミュレーション
回路図のデジタル部品のイベント駆動シミュレーション: 74 シリーズモデル、プリミティブ、刺激、アサーション、セットアップとホールド、VCD 出力。
回路図のデジタル部分のイベント駆動シミュレーションです。ネットリストから直接実行され、レイアウトは不要です。agentee new sim NAME --kind logic(MCPのnew_itemにkind = "sim"とsim_kind = "logic")は、クロック、リセット、クロック付きアサーションを含むスターターファイルを書き出します。これらは自分のネット名にリネームしてください。--kind fdtd(デフォルト)はFDTD実行を開始します。agentee sim NAME(MCPのrun_sim)は、スペックの隣にNAME.result.jsonとVCD波形NAME.vcdを書き出します。ビューアは、記録された各ネットのトレースを時間軸に対して描画します。
波形ビューでは、マウスホイール(またはピンチ、またはCtrlキーとホイール)でポインタを中心にズームし、ドラッグまたは横スクロールでパンします。ダブルクリックで全体をフィットし、クリックで時間カーソルを設定します。カーソルは、下の行のエッジに数ピクセル以内でスナップされます。+と-でカーソルを中心にズームし、矢印キーでパン、FまたはHomeでフィット、Escapeでカーソルを解除、NとPでカーソルを次のマーカーと前のマーカーにジャンプします。行が画面に収まらない場合、名前の上のホイール、右端のバーのドラッグまたはクリック、Page UpとPage Downでスクロールします(--showのtop=NでN行目から開始)。名前の隣の列は、カーソル位置(カーソルがない場合はポインタ位置、それ以外はビューの右端)で全行を読み取ります。ホバーチップはカーソルからの時間を表示します。X[0]からX[n]、またはX0からXn(X0_NからXn_Nも可)と名付けられたネットは、16進数でMSB優先に描画される1つのバス行に折りたたまれます。不明ビットにはx、浮動ビットにはzのニブルが表示されます。recordエントリ{ name, nets }も同様です。バス名をクリックすると、そのビットが開きます。VCDは、ビットの代わりに同じバスをベクトルとして保持します:Q0からQ3は$var wire 4 # Q [3:0] $end、Y0_NからY7_NはY_N [7:0]、n個のネットのrecordバスはNAME [n-1:0](MSB優先)です。上部のマーカーは、失敗したアサーション(赤、チェックされた時刻)、タイミング違反(琥珀色)、競合(紫)を表示し、関連するネットの行にドットを付けます。ホバーでメッセージを表示し、クリックでカーソルをそこに移動します。実行は最初の10000個のマーカーを保持し、上限に達した場合はヘッダーにcappedと表示されます。agentee render NAME --show from=300ns,to=900ns,cursor=550ns,open=Q[3:0]は、同じビューをヘッドレスで描画します。
name = "counter"
kind = "logic"
schematic = "counter" # default: the only top-level schematic
duration = "2us"
ignore = ["J1", "J2"] # parts with no logic model to leave out
record = ["CLK", "Q3", "Q2", "Q1", "Q0"] # default every net but the rails
# record = ["CLK", { name = "COUNT", nets = ["Q3", "Q2", "Q1", "Q0"] }] # a bus, MSB first
# on_violation = "keep" # default "x": a timing violation makes the flip-flop x
[[stimulus]]
net = "CLK"
clock = { period = "100ns", duty = 0.5, phase = "50ns" }
[[stimulus]]
net = "RST_N"
steps = [["0ns", 0], ["120ns", 1]] # [time, level] in time order; levels 0, 1, "x", "z"
[[stimulus]]
net = "MODE"
constant = 1
[[expect]] # a level at a time
net = "TC"
at = "1600ns"
value = 1
[[expect]] # a bus, MSB first: a number or a string of 0 1 x z and - (any)
nets = ["Y7_N", "Y6_N", "Y5_N", "Y4_N", "Y3_N", "Y2_N", "Y1_N", "Y0_N"]
at = "600ns"
value = "11011111"
[[expect]] # a sequence sampled on clock edges
nets = ["Q3", "Q2", "Q1", "Q0"]
clock = "CLK"
edge = "rising" # or "falling"
from = "0ns" # edges before this are skipped
sequence = [0, 0, 1, 2, 3, "01--"]クロックはphaseまで低レベルで、その後は各periodのうちdutyの間高レベルになります。phaseがない場合は0で高レベルから始まります。刺激は強いドライバとしてそのネットを駆動し、電源ネットではレールを置き換えます。atチェックは、その時刻までにすべてが安定した後にネットを1回読み取ります。シーケンスは、クロックの各クリーンなエッジ(0から1、または1から0)の直前にネットを読み取ります。これにより、レジスタ出力はエッジが来た時点の値として見えます。ネット名は回路図と同じです。0オームのリンクで別のネットに接続されたネットは、どちらの名前でも応答します。
ネットリストは次のようにセルに変換されます。
style = "power"のネットと電源シンボル(power = trueのシンボル)は一定の電源です。GNDを含む名前、またはVSS、VEE、0Vで始まる名前は0、それ以外は1(PWR_FLAGはスキップされます)。- 0オームの抵抗(
R)、ジャンパ(JP、SJ、ピン1と2)、ネットタイ(NT)は、それらのネットを1つに結合します。レールとネット間の他の抵抗は、レールのレベルの弱いドライバとしてプルアップまたはプルダウンになります。2つのシグナルネット間ではそれらを結合します。2つのレール間では除外されます。 - コンデンサ、インダクタ、ビーズ、フィルタ、ダイオード、LED、テストポイント、穴、フィジューシャル、水晶(
C、L、FB、FL、D、LED、TP、H、MH、FID、Y、X)は除外されます。 - 値(またはシンボル名)に74シリーズ番号を持つ部品は、ピン番号で組み込みモデルを使用します:
74HC00、SN74LVC1G08DBVR、CD74HCT04Eはすべて一致します。ライブラリは00、01、02、03、04、05、06、07、08、10、11、14、20、21、27、32、74、86、125、126、132、138、157、161、163、164、244、245、573、574、595、単一ゲートの1G00、1G02、1G04、1G06、1G07、1G08、1G14、1G17、1G32、1G34、1G74、1G79、1G80、1G86、1G125、1G126、1G157、デュアルゲートの2G00、2G02、2G04、2G08、2G14、2G17、2G32、2G34、2G74、2G86、2G125、2G126をカバーします。マルチユニットシンボルの配置されていないユニットは除外されます。配置されたピンでネットがないものは浮動(z)として読み取られます。 - 14(および1G14、2G14)のシュミットトリガはインバータです。シミュレーションには、ヒステリシスが作用するゆっくりしたアナログエッジがありません。573は8つの
dlatch、574は8つのdffで、それぞれ共有のOE(ピン1、アクティブロー)が出力を浮動にします。245は8つのxcvrです。OE(ピン19)が低レベルのとき、DIR(ピン1)が高レベルの間はAからBを、低レベルの間はBからAを駆動します。01、03(クアッドNAND)、05、06、1G06(インバータ)、07、1G07(バッファ)はオープンドレインです。低レベルにプルするか、解放(z)し、プルアップ抵抗が1を作ります。すべての01は7402のピンアウト(出力は1、4、10、13、その後に入力)を持ち、TI SDLS026(SN7401、SN74LS01)およびRenesas REJ03D0532(HD74HC01)に基づいています。03は7400のピンアウトを持ち、TI SCLS077(SN74HC03)に基づいています。 - 出力ピンがすべてシンボル内で
open_collectorのゲートは、オープンドレインでもあります。 - 値またはシンボルがプリミティブ名(
AND、NAND3、OR、NOR、XOR、XNOR、NOT、INV、BUF、TRIBUF、DFF、JKFF、SRLATCH、DLATCH、MUX2)の部品は、ピンを名前でマッピングします:D、CLK(C、CP、CKも可)、S/SET/PRE、R/RST/CLR、EN、OE、Q、~{Q}。ゲートの出力はそのoutputピン(またはY、Q、OUT)で、他のすべてのシグナルピンは入力です。オーバーバー(~{R})、末尾の#または_N、反転したピン形状は、ピンをアクティブローにします。 - それ以外の部品は、
ignoreに含まれているか、[[parts]]モデルがある場合を除き、その部品名を指定したエラーになります。
ファミリタイミング(74の後のファミリ文字から取得。伝播遅延、セットアップ、ホールド、非同期セットまたはリセットのリカバリとリムーバル):
| ファミリ | 遅延 | セットアップ | ホールド | リカバリ | リムーバル |
|---|---|---|---|---|---|
| HC, HCT | 10 ns | 15 ns | 3 ns | 8 ns | 0 |
| AHC, AHCT, VHC, VHCT | 6 ns | 5 ns | 1 ns | 3.5 ns | 0 |
| AC, ACT | 6 ns | 4 ns | 1 ns | 2.4 ns | 0 |
| LVC | 4 ns | 3 ns | 1 ns | 2 ns | 0 |
| ALVC, LVT, ALVT, AUC, AVC | 4 ns | 2 ns | 1 ns | 2 ns | 0 |
| AUP, LV, LVX | 6 ns | 3 ns | 1 ns | 3 ns | 1 ns |
| LSおよびプレーン74 | 15 ns | 20 ns | 5 ns | 25 ns | 3 ns |
| その他 | 10 ns | 10 ns | 2 ns | 10 ns | 2 ns |
リカバリとリムーバルは、データシート最小値です。-40から85 C、4.5 V(5 Vファミリ)または3.3 V(LVC)で、TIとNexperiaの両方が記載している場合は大きい方です:
- HC, HCT:
nSD、nRDからnCPへのtrec 8 ns、Nexperia 74HC_HCT74 rev 9(TI SN74HC74 SCLS094Fは6 ns、TI CD74HC74 SCHS124Eは8 ns、tremとして記載)。 - AHC, AHCT: 74AHCT74の
nRDからnCPへのtrec 3.5 ns(74AHC74は3.0 ns)、Nexperia 74AHC_AHCT74 rev 11(TI SN74AHC74 SCLS255Nは3 ns)。 - AC, ACT: 5 Vでのtrec 2.4 ns、TI CD74AC74 SCHS231EおよびCD74ACT74 SCHS321A(TI SN74AC74 SCAS521Hは0)。
- LVC:
PREまたはCLRの非アクティブなCLK前のセットアップ2 ns、TI SN74LVC74A SCAS287W(Nexperia 74LVC74Aは1.0 ns)。 - LS:
CLRの非アクティブなセットアップ25 ns、任意の入力でのホールド3 ns、TI SN74LS161A SDLS060(SDLS119のSN74LS74Aはどちらも記載なし)。
上記のCMOSデータシート(TI SN74HC161 SCLS297DやNexperia 74LVC161、ホールドが同期入力のみをカバーするものも含む)はリムーバル時間を記載していないため、そこでは0です。AUP、LV、LVXおよび他の行は、セットアップとホールドを取得します。
名前のプリミティブと汎用シンボルは1 nsで、セットアップとホールドはありません。
カスタム部品はインラインでモデルを取得し、refまたはvalue(その値を持つすべての部品)で一致します。1つの部品に複数のエントリがあると、それぞれセルを追加します(クアッドの1ゲートあたり1つなど)。タイミングだけのエントリは組み込みモデルを保持し、タイミングを変更します。
[[parts]]
ref = "U7"
primitive = "nand" # a primitive; pins map its pin keys to the part's pins
pins = { A = "1", B = "2", Y = "3" }
delay = "3ns" # every output; setup, hold, recovery and removal as well
delays = { Y = "5ns" } # or per output key
[[parts]]
value = "MYBUF8"
primitive = "74HC244" # borrow a library pinout
[[parts]]
ref = "U9"
inputs = ["1", "2", "3"] # pins by number or unique name
outputs = ["4"]
truth = ["000 1", "1-- 0", "01- z"] # first matching row wins; no match (or an x input) gives xプリミティブピンキー(入力、次に出力)。アクティブローピンまたは反転出力にはキーに_Nを付け、任意の入力を省略すると非アクティブに保たれます:
| プリミティブ | 入力 | 出力 |
|---|---|---|
and、or、xor、nand、nor、xnor | Y以外の任意のキー | Y |
not、buf | 1つのキー | Y |
_odを持つ任意のゲート(nand_od、not_od、buf_od) | ゲートと同じ | Y、オープンドレイン:0またはz |
tri | A、OE | Y(OEが低レベルのときz) |
dff | D、CLK、任意のS、R、OE | Q、QN(OEが低レベルのときz) |
jk | J、K、CLK、任意のS、R | Q、QN |
sr | S、R | Q、QN |
dlatch | D、EN、任意のR、OE | Q、QN(OEが低レベルのときz) |
xcvr | A、B、DIR、任意のOE | A、B: DIRによって反対側から駆動される同じピン |
mux2 | I0、I1、S、任意のEN | Y |
dec138 | A0、A1、A2、E1、E2、E3 | Y0からY7 |
counter161、counter163 | 任意のR、CLK、任意のD0からD3、CEP、LOAD、CET | Q0からQ3、TC |
shift164 | A、任意のB、CLK、任意のR | Q0からQ7 |
shift595 | D、CLK、LATCH、任意のR、OE | Q0からQ7、QS |
フリップフロップは上昇エッジでクロックされます(下降エッジの場合はキーCLK_Nを使用)。SとRは非同期であり、両方がアクティブな場合は74HC74と同様にQ = QN = 1になります。161は即座にリセットされ、163は次のエッジでリセットされます。595はCLKでシフトし、LATCHで出力にコピーします(同一瞬間のシフト前の値)。OEがローの間に出力は浮上します。
エンジンは4つのレベル、0、1、x(不明)、z(浮上)を保持します。各ネットは駆動源を解決します。一致する強力な駆動源(出力、レール、刺激)がレベルを設定し、0と1の競合はxとなり競合として報告されます。プル抵抗は強力な駆動源がない場合のみカウントされます。zの入力はxとして読み取られます。ゲートは不明な入力が結果に影響する場合(ANDへの0は0)のみxになります。不確実なエッジ(0からx、またはxから1)でクロックされたフリップフロップは、値を保持する場合を除きxになります。各出力には独自の遅延(トランスポート遅延のため、遅延より短いパルスは通過します)があります。イベントは時間順に実行され、ゼロ遅延の変更は同一瞬間のデルタサイクルで収束します。1000回のデルタサイクル後もまだ変化しているゼロ遅延ループは実行を停止し、そのネットを報告します。5000万イベントを超えた実行も同様です。
フリップフロップ、カウンタ、シフトレジスタは、モデルのタイミングに対してクロック付き入力のセットアップとホールドを検査します。上昇クロックエッジのsetupより前にデータ入力が変化した場合、またはエッジのholdより後に変化した場合、違反となります(非同期リセットまたはセットがアクティブの間は検査されません)。Dラッチは、ENのクローズ(下降)エッジに対してDを同様に検査します。非同期リセットまたはセットがクロックエッジのrecoveryより前に解放された場合、またはエッジのremovalより後に解放された場合も、ファミリーテーブルのrecoveryとremovalに基づいて違反となります。595は、最後のCLK(SRCLK)上昇エッジから少なくともsetup後にLATCH(RCLK)上昇エッジを必要とします。2つのクロックが一緒に接続されている(同一瞬間)場合は問題なく、シフト前の値をラッチします。
違反が発生した場合、検査対象のフリップフロップ、ラッチ、レジスタは、Verilogモデルのノティファイアと同様に、クリーンにクロック、セット、リセットされるまでxになります。simにon_violation = "keep"を設定すると、違反を報告しつつサンプリングされた値を保持します。
読み取り項目:アサーションの成功と失敗、競合、タイミング違反、セル、イベント。Checkは、結果が最新である限り、失敗したアサーション、競合、タイミング違反、停止した実行をすべてsimのエラーとして列挙します。仕様または回路図のネットリストが変更されると、結果は古くなります。examples/logicには2つ含まれています:counter(74HC161が74HC138にカウントするもの)とi2c(オープンドレインバスで、コントローラ(74LVC1G07 2個)とターゲット(ACKのためにSDAをローにプルする74LVC1G06)が4.7kプルアップを共有し、SCLでクロックされた74HC595がバイトをキャプチャし、START、ビット、ACK、バイト(recordバス)、STOPを検査するもの)。