2

ワイヤの名前や階層パスを事前に指定せずに、Verilogタスクで任意のワイヤを特定の値に強制する方法はありますか?できれば、可能なワイヤごとに大量のifステートメントを記述する必要はありません。

私の目標は、このタスクを使用してテストベンチの観点から任意のワイヤを駆動できるように、十分にモジュール化することです。

私がやりたいことの例:

task force;
input value;
input [8*N-1:0] string;              // Assume N is large enough
begin
    force ... = value;
end
endtask

3つのドット「...」は、渡されたワイヤのパスになります(例:counter0.clk0.in_enable)。

64本のワイヤーがあり、そのうちのいくつかを強制的に高くしたいとします。それらは単一のバス上になく、すべて異なる名前または階層パスを持っています。テストベンチのセットアップでは、ドライブしたいワイヤーのテーブルを特定の値に読み取り、各ワイヤーをこのVerilogタスクに渡すC関数を記述しますが、どのワイヤーをハイにドライブするかをシミュレーターに指示するにはどうすればよいですか?タスク自体で毎回すべてのワイヤを書き出しますか?

私がこれを行うことができる場合、それを行う正しい方法は何ですか?私がこれを行うことができない場合、代わりに何を提案できますか?

4

2 に答える 2

2

これを行うためのPLI/VPIメソッドは非常によくあるかもしれませんが、私はそれについてあまり経験がないので、これを一粒の塩と一緒に取ってください。また、文字列をワイヤ参照に変換するためのVerilogでの反射も認識していません。

そうは言っても、私が行うことは、スクリプト言語を使用してテーブルを読み取り、手続き型で生成された.vファイルを巨大なcaseステートメントで吐き出すことです。

force_wire(int wireId)、release_wire(int wireId)のようなPLI呼び出しを行うことができます。ここで、wireidはテーブルの行などになります。

Cルーチンでは、文字列名からIDを検索できます。これにより、IDを使用してVerilogタスクが呼び出され、IDは生成されたcaseステートメントから何を強制するかを選択します。多分次のようなものです:

task force
input forceVal;
input wireId
begin
   case (wireId)
   //AUTOGENERATED BELOW
   0 : force foo.bar = forceVal;
   1 : force foo.baz = forceVal;
   2 : force bar.foo = forceVal;
   ...
   endcase
end
于 2012-07-11T19:16:56.873 に答える
1

残念ながら、いいえ、PLIVerilog以外のコンストラクトを使用して試みていることを実行することはできません。フォースのターゲットはネットの階層パスである必要があり、それに文字列を使用する方法はありません。

別の回答でのTimの提案、基本的には大きなルックアップテーブルの作成は、VerilogPLIを使用しない場合の最良のアプローチである可能性があります。

PLIを使用する場合は、文字列を取り込んで強制を実行する関数を記述できる必要があります。私はしばらくの間、同じようなことをしたいと思っていましたが、それを試すことはできませんでした。より良い方法を見つけたら、ここであなた自身の質問に答えてください。

編集:これは、PLIまたはSystemVerilogバインドを使用したいくつかの可能な実装に関する説明です。

于 2012-07-11T20:32:45.687 に答える