行列とベクトルの設計に関する考慮事項
これらのガイドラインは、HDL コード生成用に設計をモデル化する際の行列信号とベクトル信号の使用に関する推奨される方法を示します。各ガイドラインに準拠要件のレベルを示す重大度レベルが割り当てられています。詳細については、HDL モデリング ガイドラインの重大度レベルを参照してください。
行列のモデル化の要件
ガイドライン ID
1.3.1
重大度
必須
説明
HDL Coder™ では、DUT インターフェイスで行列データ型がサポートされます。2 次元または 3 次元の行列を DUT インターフェイスへの入力として使用して、モデルの HDL コードを生成できます。
例
この例では、HDL Coder™ での行列タイプの使用方法を説明します。hdlcoder_matrix_multiply
モデルを開きます。
open_system('hdlcoder_matrix_multiply') set_param('hdlcoder_matrix_multiply', 'SimulationCommand', 'update') sim('hdlcoder_matrix_multiply')
DUT サブシステムを開くと、2 つのサブシステムが表示されます。1 つのサブシステムは Matrix Multiply ブロックを使用し、もう一方のサブシステムは要素単位の乗算を実行します。
open_system('hdlcoder_matrix_multiply/DUT')
DUT サブシステムの HDL コードを生成して生成されたモデルを開くと、乗算演算の実行方法が示されます。
モデル化における考慮事項
Product ブロックを使用するときは、適切な乗算モードを使用してください。このモードを使用すると、行列の乗算または要素単位の乗算のいずれかを実行できます。乗算モードに応じて、乗算の出力の次元が異なる場合があります。
Product ブロックを使用して行列の乗算を実行する場合、Matrix Multiply ブロックを Subsystem ブロックの内部に配置します。コードを生成して生成されたモデルを開くと、HDL Coder で行列の乗算が複数の Product ブロックと Add ブロックに展開されることがわかります。Matrix Multiply ブロックをサブシステムの内部に配置すると、生成されたモデルが理解しやすくなります。また、Matrix Multiply ブロックに 2 つを超える入力を指定しないようにしてください。
制限
HDL コード生成では、次の HDL ワークフローでの行列の入力はサポートされません。
コシミュレーション モデルの生成
FPGA インザループ
IP コアの生成
ベクトル信号からの HDL コードでの昇順のビット順序の生成を避ける
ガイドライン ID
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 ] |