インポート
import 宣言は他のパッケージからシンボルをインポートします。モジュール、インターフェース、パッケージの要素としてだけでなくトップレベルにも配置することができます。import 宣言の引数には package::* のようなワイルドカードパターンを使用することができます。
// ファイルスコープインポート
import $sv::SvPackage::*;
package PackageA {
const paramA: u32 = 1;
}
module ModuleA {
import PackageA::*;
import PackageA::paramA;
}
package::{a, b} のように波括弧の中に列挙することで、1つのパッケージから複数のシンボルを一度に import できます。
package PackageA {
const paramA: u32 = 1;
const paramB: u32 = 2;
}
module ModuleA {
import PackageA::{paramA, paramB};
}
インポート宣言によるシンボルのインポートは、そのインポート宣言が置かれた名前空間内の任意の場所から参照できます。
package PackageA {
const WIDTH: u32 = 8;
}
module ModuleA (
i_d: input logic<WIDTH>, // 有効な参照
o_d: output logic<WIDTH>, // 有効な参照
) {
import PackageA::WIDTH;
let d: logic<WIDTH> = i_d; // 有効な参照
assign o_d = d;
}
enumのメンバーも、個別に、波括弧のリストとして、あるいは wildcard により import できます。これはパッケージ内で定義された enum だけでなく、モジュールやインターフェース内でローカルに宣言された enum にも適用されます。
package PackageB {
enum Color: logic<3> {
Red,
Green,
Blue,
White,
Black,
}
}
module ModuleB {
// import a single enum member
import PackageB::Color::Red;
// import multiple enum members
import PackageB::Color::{Green, Blue};
// import all remaining members of the enum
import PackageB::Color::*;
var c: PackageB::Color;
// members can be referenced without qualification
assign c = Green;
}
コンポーネント名前空間のインポート
パッケージ、モジュール、インターフェースといったコンポーネント自体を、その名前でインポートすることもできます。インポートされた名前は使用箇所で修飾子として使えるので、依存プロジェクトのコンポーネントをプロジェクト名を繰り返すことなく参照できます。
import veryl_sample::sample_pkg;
import veryl_sample::sample_if;
import veryl_sample::sample_module;
module ModuleC {
const A: u32 = sample_pkg::PARAM_A;
inst u_if: sample_if;
inst u: sample_module (
o_a: u_if.a,
);
let _a: logic = u_if.a;
}
ジェネリックコンポーネントは定義のままインポートされ、ジェネリック引数は使用箇所で与えます。
import veryl_sample::generic_pkg;
module ModuleD {
const B: u32 = generic_pkg::<32>::PARAM_B;
}
proto package も同じようにインポートでき、インポートされた名前をジェネリック境界として使用できます。proto module や proto interface などの他のプロトタイプはインポートできません。
import veryl_sample::sample_proto_pkg;
module ModuleE::<PKG: sample_proto_pkg> {
let _a: logic<PKG::WIDTH> = 0;
}
モジュール、インターフェース、パッケージのいずれの内部でもない、プロジェクトスコープで宣言された関数も、プロジェクト名を通じてインポートできます。
import veryl_sample::sample_func;
module ModuleF {
let _a: logic<8> = sample_func::<8>(8'd1);
}
注:上記のコードのプレイボタンの結果は依存関係解決を行わないので正確ではありません。