組み込み機器・ハードウェアの設計開発から装置製作まで社内一貫対応!

組み込み機器・ハードウェア設計製作.com
組み込み機器・ハードウェア設計製作.com

produced by株式会社アイディアイ

設計のポイント

verilog記述のポイント:インデックス付きパートセレクト(+:)でビットフィールドを扱う

設計内容分類FPGA

実現したい仕様・課題

バスの中からバイト単位・フィールド単位で一部を切り出す際、切り出し位置が変数(セレクト信号やカウンタ)で決まる場合、data[hi:lo]の固定範囲指定では記述できません。ビットフィールドの動的な選択・書き換えを、簡潔かつ合成可能な形で記述したいというのが課題です。

設計のポイント

開始位置が変数で幅が固定の部分選択には、インデックス付きパートセレクト data[start +: WIDTH](startから上位方向にWIDTHビット)/data[start -: WIDTH](startから下位方向にWIDTHビット)を使用します。従来の data[hi:lo] 形式は両端が定数でなければならないのに対し、+:/-: は「開始位置は変数可、幅は定数」という制約で動的なフィールド選択を表現でき、合成ツールは適切なマルチプレクサ/デマルチプレクサへ展開します。典型的な用途は、ワイドバスからのバイトレーン選択(data[8*sel +: 8])、レジスタマップ中のフィールド抽出、パケットのフィールド組み立て、複数チャネル分のデータを1本のバスに詰めた信号からの1チャネル抽出などです。書き込み側(左辺)にも使用でき、特定バイトだけの書き換えが簡潔に記述できます。乗算を含むインデックス式(8*sel)は、selの取り得る範囲に応じた選択回路になるため、チャネル数が多い場合は生成される回路規模を意識します。また、インデックスが範囲外となる値を取り得る場合の動作は保証されないため、セレクト信号の値域を設計として保証する(またはガードを付ける)ことが安全です。二次元配列で持つ方法と比べ、1本のベクタとして外部ポートやIP接続に渡せる点が+:の利点であり、モジュール境界ではベクタ+パートセレクト、内部処理では配列、という使い分けも実務的です。

【コード例】
wire [31:0] data;
wire [1:0] sel;
wire [7:0] byte_out = data[8*sel +: 8]; // バイトレーン選択

// 左辺にも使用可:選択バイトのみ書き換え
always @(posedge clk)
if (we) buf_r[8*sel +: 8] <= wdata;

verilog記述のポイント:インデックス付きパートセレクト(+:)でビットフィールドを扱う | 組み込み機器・ハードウェア設計製作.com

補足情報

当事例のような、FPGA設計に関するポイントをまとめた冊子の無料DLが可能です。
是非以下よりご確認ください。

FPGA設計のポイント

>>ダウンロードはこちら!

設計のポイント 一覧

FPGA設計のポイント

お問い合わせ

組み込み機器・ハードウェア 設計製作.comを運営する株式会社アイディアイは、組み込み機器・ハードウェアの設計開発代行サービスを提供しています。
試験装置や制御機器、組み込みボードなど、設計・開発委託先をお探しの皆様、お気軽に当社に御相談ください。

技術資料のダウンロードはこちらから 技術資料ダウンロ―ド メールフォームでのお問い合わせはこちらから ご相談お問合せ