最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
これらのガイドラインは、HDL コード生成用に設計をモデル化する際の行列信号とベクトル信号の使用に関する推奨される方法を示したものです。各ガイドラインに準拠要件のレベルを示す重大度レベルが割り当てられています。詳細については、HDL モデリング ガイドラインの重大度レベルを参照してください。
ガイドライン ID
1.3.1
重大度
必須
説明
HDL Coder™ では、DUT インターフェイスでの行列データ型の使用はサポートされていません。2 次元行列の信号を DUT サブシステムに入力する場合は、その前に Reshape ブロックを使用して信号を 1 次元ベクトルに変換します。DUT サブシステム内部で、Reshape ブロックを使用してベクトルを行列に変換し直してから行列計算を実行できます。計算の実行が完了したら、DUT 出力インターフェイスで行列をベクトル信号に再度変換しなければなりません。DUT インターフェイスの外部では、ベクトル信号を行列に変換し直すことができます。
モデル化における考慮事項
Reshape ブロックを使用してベクトルを 2 次元行列に変換するときは、出力の次元の指定が適切であることを確認してください。
Product ブロックを使用するときは、適切な乗算モードを使用してください。このモードを使用すると、行列の乗算または要素単位の乗算のいずれかを実行できます。乗算モードに応じて、乗算の出力の次元が異なる場合があります。
Product ブロックを使用して行列の乗算を実行する場合、Matrix Multiply ブロックを Subsystem ブロックの内部に配置します。コードを生成して生成されたモデルを開くと、HDL Coder で行列の乗算が複数の Product ブロックと Add ブロックに展開されることがわかります。Matrix Multiply ブロックをサブシステムの内部に配置すると、生成されたモデルが理解しやすくなります。また、Matrix Multiply ブロックに 2 つを超える入力を指定しないようにしてください。
行列データを抽出する場合は、Selector ブロックと Assignment ブロックを使用します。ブロックのインデックスの入力端子に固定小数点データ型を使用しないようにしてください。
例
この例では、HDL Coder™ での行列タイプの使用方法を説明します。hdlcoder_matrix_multiply
モデルを開きます。モデルには、行列入力を DUT サブシステム インターフェイスの 1 次元ベクトルに変換する Reshape ブロックが含まれます。
open_system('hdlcoder_matrix_multiply') set_param('hdlcoder_matrix_multiply', 'SimulationCommand', 'update') sim('hdlcoder_matrix_multiply')
DUT サブシステムを開くと、2 つのサブシステムが表示されます。Reshape ブロックは 1 次元配列をサブシステムに対する入力の 2 行 2 列の行列に戻します。1 つのサブシステムは Matrix Multiply ブロックを使用し、もう一方のサブシステムは要素単位の乗算を実行します。出力結果はベクトルに変換し直されます。
open_system('hdlcoder_matrix_multiply/DUT')
DUT サブシステムの HDL コードを生成して生成されたモデルを開くと、乗算演算の実行方法が示されます。
1.3.2
強く推奨
MATLAB® では、配列の既定のビット順序は昇順です。この場合、生成された VHDL コードは std_logic_vector (0 to
n)
の宣言を使用します。この信号宣言は、特定の HDL コーディング標準ルールに違反しているため、警告を生成します。いくつかのシナリオは次のとおりです。
昇順のビット順序のシナリオ
シナリオ | 問題例 | 回避方法 |
---|---|---|
[遅延の長さ] が | この例は、[遅延の長さ] が ENTITY Subsystem1 IS PORT( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic; In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic -- ufix1 ); END Subsystem1; ARCHITECTURE rtl OF Subsystem1 IS -- Signals SIGNAL Delay_reg : std_logic_vector(0 TO 4); -- ufix1 [5] SIGNAL Delay_out1 : std_logic; -- ufix1 | [遅延の長さ] が ENTITY Subsystem1 IS PORT( clk : IN std_logic; reset : IN std_logic; enb : IN std_logic; In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic -- ufix1 ); END Subsystem1; ARCHITECTURE rtl OF Subsystem1 IS -- Signals SIGNAL Delay_out1 : std_logic; -- ufix1 SIGNAL Delay1_out1 : std_logic; -- ufix1 SIGNAL Delay2_out1 : std_logic; -- ufix1 SIGNAL Delay3_out1 : std_logic; -- ufix1 SIGNAL Delay4_out1 : std_logic; -- ufix1 |
Mux ブロックを使用して複数の入力信号をベクトル信号に結合。 | この例は、Mux ブロックを使用して ENTITY Subsystem IS PORT( In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic_vector(0 TO 3) -- ufix1 [4] ); END Subsystem; ARCHITECTURE rtl OF Subsystem IS -- Signals SIGNAL Mux_out1 : std_logic_vector(0 TO 3); -- ufix1 [4] | Bit
Concat ブロックを使用して入力信号を結合します。この例は、 ENTITY Subsystem IS PORT( In1 : IN std_logic; -- ufix1 Out1 : OUT std_logic_vector(3 DOWNTO 0) -- ufix4 ); END Subsystem; ARCHITECTURE rtl OF Subsystem IS -- Signals SIGNAL Bit_Concat_out1 : unsigned(3 DOWNTO 0); -- ufix4 |
Constant ブロックを使用してベクトル信号を生成。 | この例は、Constant ブロックを使用して ENTITY Subsystem2 IS PORT( Out1 : OUT std_logic_vector(0 TO 3) -- boolean [4] ); END Subsystem; ARCHITECTURE rtl OF Subsystem2 IS -- Signals SIGNAL Constant_out1 : std_logic_vector(0 TO 3); -- boolean [4] | Constant ブロックの後に Demux ブロックに続けて Bit
Concat ブロックを使用します。この例は、 ENTITY Subsystem2 IS PORT( Out1 : OUT std_logic_vector(3 DOWNTO 0) -- ufix4 ); END Subsystem2; ARCHITECTURE rtl OF Subsystem2 IS -- Signals SIGNAL Constant_out1 : std_logic_vector(0 TO 3); -- boolean [4] SIGNAL Constant_out1_0 : std_logic; SIGNAL Constant_out1_1 : std_logic; SIGNAL Constant_out1_2 : std_logic; SIGNAL Constant_out1_3 : std_logic; SIGNAL Bit_Concat_out1 : unsigned(3 DOWNTO 0); -- ufix4 ] |