// SEL信号が1の時、AとBを接続
rtranif1(A, B, SEL);
// SEL信号が0の時、CとDを接続
rtranif0(C, D, SEL);
前のページでは一つのポートにどれかのベンダーのモデルの一つしか接続されない仕様を想定し、RuntimeOptionを使用するため複数のモデルとの選択に必要なため使用しました。
Chip検証を行う際に外部モデルを流用する事がありますが、あるポートに異なるモデルが接続されるケースがあります。
例えば私の今、このホームページを書いているNotePCの一つにはマルチメディアカードのスロットがついています。
おそらくこのCHIPの検証には、このポートにいくつもの外部モデルが接続されたと思うのです。
すでに外部モデルが用意されているのであれば、後は接続するだけとなります。その時にはこのRuntimeSwitchとtranif*やrtranif*を使用すると作業はかなり楽になります。
下記ではCHIPのポートSA信号にBenchBの信号BAか、BenchCの信号CAか、どちらでも無いときはpulldownの仕様の状態を示してます
CHIPA dut(
(an omission)
// 双方向の信号
.SA(SA),
(an omission)
);
BenchB BB(
(an omission)
// 双方向の信号
.BA(BA),
(an omission)
);
BenchC BC(
(an omission)
// 双方向の信号
.CA(CA),
(an omission)
);
// SELB信号が1の時、SAとBAを接続
rtranif1(SA, BA, SELB);
// SELC信号が1の時、SAとCAを接続
rtranif1(SA, CA, SELC);
// 使われないときはpull down
assign SA_USE = SELB | SELC;
pulldown(pulldownSA);
rtranif0(SA, pulldownSA, SA_USE);
ちなみにそのポートが1対1のBenchとの接続の場合はむしろ直結したほうが早いです。未接続時にpullup/pulldown処理をChipの外で行う場合は上記の仕組みのようになるでしょう。常に複数の選択肢を用意しておき状況に応じて最適な選択をするというのがマネジメントの基本ですね。
ただしCHIPのRTLSimulation用のIO Bufferモデルにpullup/pulldown処理などが内蔵された場合Simulation時にtranif0やtranif1を使った信号が不定になる事が時々あります。これらは信号の強度に依存するものが大半でした。最終的にはrtranif*による接続に辿り着き、この手の問題から解放されました。なのでbench側としてはrtranif*を使用しておく方が無難でしょう。