Verilog の `uselib 指示子 - 2022.1 日本語

Vivado Design Suite ユーザー ガイド: ロジック シミュレーション (UG900)

Document ID
UG900
Release Date
2022-04-21
Version
2022.1 日本語

ライブラリ検索順を設定する Verilog の `uselib 指示子がサポートされています。

`uselib の構文

<uselib compiler directive> ::= `uselib [<Verilog-XL uselib directives>|<lib 
directive>]
<Verilog-XL uselib directives> :== dir = <library_directory> | file = <library_file> 
| libext = <file_extension> 
<lib directive>::= <library reference> {<library reference>} 
<library reference> ::= lib = <logical library name>

`uselib lib 指示子

`uselib lib 指示子は、Verilog-XL の `uselib 指示子とは一緒に使用できません。たとえば、次のコードは無効です。

`uselib dir=./ file=f.v lib=newlib 

1 つの `uselib 指示子で複数のライブラリを指定できます。

ライブラリを指定した順が検索順になります。次に例を示します。

`uselib lib=mylib lib=yourlib 

この場合、インスタンシエートされたモジュールの検索がまず mylib で実行され、次に yourlib で実行されます。

`uselib dir`uselib file`uselib libext などの指示子と同様、解析の 1 つのセッションでは `uselib lib 指示子が HDL ファイルすべてに適用されます。別の `uselib 指示子があるまでは、HDL ソースの `uselib (Verilog XL `uselib を含む) 指示子が使用されます。引数なしで `uselib を使用すると、現在アクティブな `uselib <lib|file|dir|libext> が無効になります。

Verific の Verilog エラボレーション アルゴリズムでのインスタンシエート済みモジュールまたは UDP の解決には、次のモジュール検索メカニズムが使用されます。

  • まず、現在アクティブな `uselib lib の論理ライブラリの順序リストでインスタンシエート済みモジュールが検索されます。
  • 見つからない場合は、xelab コマンドで検索ライブラリとして指定されているライブラリの順序リストでインスタンシエート済みモジュールが検索されます。
  • 見つからない場合は、親モジュールのライブラリでインスタンシエート済みモジュールが検索されます。たとえば、work ライブラリのモジュール A に mylib ライブラリのモジュール B がインスタンシエートされ、モジュール B にモジュール C がインスタンシエートされている場合、/mylib ライブラリ (C の親モジュールである B のライブラリ) でモジュール C が検索されます。
  • 見つからない場合は、次のいずれかの work ライブラリでインスタンシエートされたモジュールを検索します。
    • HDL ソースがコンパイルされるライブラリ
    • work ライブラリとして明示的に設定されるライブラリ
    • work という名前のデフォルトの作業ライブラリ

`uselib の例

表 1. `uselib の例
adder_lib 論理ライブラリにコンパイルされる half_adder.v ファイル work 論理ライブラリにコンパイルされる full_adder.v ファイル
module half_adder(a,b,c,s); 
input a,b;
output c,s;
s = a ^ b;
c = a & b;
endmodule
module
full_adder(c_in, c_out, a, b, sum)
input c_in,a,b;
output c_out,sum;
wire carry1,carry2,sum1;
`uselib lib = adder_lib
half_adder
adder1(.a(a),.b(b),. c(carry1),.s(sum1)); half_adder adder1(.a(sum1),.b(c_in),.c (carry2),.s(sum)); c_out = carry1 | carry2; endmodule