Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

シングルレートのリソース共有アーキテクチャ

この例では、HDL Coder™ がクロック レート パイプラインのコンテキストにおいて演算の実行をどのように管理するかを示します。既定では、最も速い基本サンプル レートで動作する設計領域でリソース共有が適用されると、面積の最適化のためのリソース共有で説明されているように、局所的なマルチレートのアーキテクチャが合成されます。それよりも遅いサンプル レートで共有リソースが動作している場合、クロック レート パイプラインが有効になっていれば、コード ジェネレーターは、この例で説明するシングルレートのアーキテクチャを合成します。

クロック レート パイプラインは、Simulink の設計から遅いサンプル レートでデータの演算を行っている孤立したロジックを特定し、(それよりも速い) クロック レートでパイプラインとリソース共有のロジックを挿入する最適化です。このような場合、リソース共有は、シングル レートで動作し、レイテンシを伴う、時間多重化されたアーキテクチャとして実装されます。HDL Coder は、依存関係にある演算の実行を調整し、導入された追加のレイテンシを管理するために、適切なスケジューリング ロジックを合成します。モデル hdlcoder_singlerate_sharing.slx について考えてみます。

bdclose('all');
load_system('hdlcoder_singlerate_sharing');
open_system('hdlcoder_singlerate_sharing/Subsystem');
set_param('hdlcoder_singlerate_sharing', 'SimulationCommand', 'update');

このモデルには、オーバーサンプリングの制約がオーバーサンプリング係数を使用して設定されています。これは、FPGA クロック レートを Simulink の基本サンプル時間の何倍の速度にするかを指定する設定です。このモデルでは Oversampling = 30 と設定しています。これは、実質的には、クロック レート パイプラインが適用された領域の実行が完了するまでに 30 クロック サイクルかかることを意味します。

個々のブロックとサブシステムに対する最適化オプションを以下に示します。シングルレートの共有アーキテクチャを理解するために、コードを生成して検証モデルを調べてみます。

hdlsaveparams('hdlcoder_singlerate_sharing/Subsystem');
makehdl('hdlcoder_singlerate_sharing/Subsystem');
%% Set Model 'hdlcoder_singlerate_sharing' HDL parameters
hdlset_param('hdlcoder_singlerate_sharing', 'GenerateValidationModel', 'on');
hdlset_param('hdlcoder_singlerate_sharing', 'HDLSubsystem', 'hdlcoder_singlerate_sharing');
hdlset_param('hdlcoder_singlerate_sharing', 'OptimizationReport', 'on');
hdlset_param('hdlcoder_singlerate_sharing', 'Oversampling', 30);

% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem', 'DistributedPipelining', 'on');

hdlset_param('hdlcoder_singlerate_sharing/Subsystem/Sum_piped', 'Architecture', 'Tree');
% Set Sum HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/Sum_piped', 'OutputPipeline', 2);

% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/share', 'SharingFactor', 2);

% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/stream1', 'StreamingFactor', 2);

% Set Delay HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/stream1/Delay', 'UseRAM', 'on');

% Set SubSystem HDL parameters
hdlset_param('hdlcoder_singlerate_sharing/Subsystem/stream2', 'StreamingFactor', 4);

### Begin compilation of the model 'hdlcoder_singlerate_sharing'...
### Generating HDL for 'hdlcoder_singlerate_sharing/Subsystem'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdlcoder_singlerate_sharing', { 'HDL Code Generation' } )">hdlcoder_singlerate_sharing</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdlcoder_singlerate_sharing'.
### Applying HDL optimizations on the model 'hdlcoder_singlerate_sharing'...
### The DUT requires an initial pipeline setup latency. Each output port experiences these additional delays.
### Output port 1: 1 cycles.
### Begin model generation.
### Model generation complete.
### To highlight blocks that obstruct distributed pipelining, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoder_singlerate_sharing/highlightDistributedPipeliningBarriers')">hdlsrc/hdlcoder_singlerate_sharing/highlightDistributedPipeliningBarriers.m</a>
### To clear highlighting, click the following MATLAB script: <a href="matlab:run('hdlsrc/hdlcoder_singlerate_sharing/clearhighlighting.m')">hdlsrc/hdlcoder_singlerate_sharing/clearhighlighting.m</a>
### Generating new validation model: <a href="matlab:open_system('gm_hdlcoder_singlerate_sharing_vnl')">gm_hdlcoder_singlerate_sharing_vnl</a>.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_singlerate_sharing'.
### MESSAGE: The design requires 30 times faster clock with respect to the base rate = 0.1.
### Working on crp_temp_shared as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_shared.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem/share as hdlsrc/hdlcoder_singlerate_sharing/share.vhd.
### Working on crp_temp_streamed as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed.vhd.
### Working on crp_temp_streamed_block as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed_block.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem/stream1 as hdlsrc/hdlcoder_singlerate_sharing/stream1.vhd.
### Working on crp_temp_streamed_block1 as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed_block1.vhd.
### Working on crp_temp_streamed_block2 as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_streamed_block2.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem/stream2 as hdlsrc/hdlcoder_singlerate_sharing/stream2.vhd.
### Working on crp_temp_MAC as hdlsrc/hdlcoder_singlerate_sharing/crp_temp_MAC.vhd.
### Working on Subsystem_tc as hdlsrc/hdlcoder_singlerate_sharing/Subsystem_tc.vhd.
### Working on hdlcoder_singlerate_sharing/Subsystem as hdlsrc/hdlcoder_singlerate_sharing/Subsystem.vhd.
### Generating package file hdlsrc/hdlcoder_singlerate_sharing/Subsystem_pkg.vhd.
### Code Generation for 'hdlcoder_singlerate_sharing' completed.
### Generating HTML files for code generation report at <a href="matlab:web('/tmp/Bdoc22a_1859087_173093/tpaa541849/ex08973016/hdlsrc/hdlcoder_singlerate_sharing/html/hdlcoder_singlerate_sharing_codegen_rpt.html');">hdlcoder_singlerate_sharing_codegen_rpt.html</a>
### Creating HDL Code Generation Check Report file:///tmp/Bdoc22a_1859087_173093/tpaa541849/ex08973016/hdlsrc/hdlcoder_singlerate_sharing/Subsystem_report.html
### HDL check for 'hdlcoder_singlerate_sharing' complete with 0 errors, 3 warnings, and 4 messages.
### HDL code generation complete.

グローバルなレベルでは、これらの局所的に共有およびストリーミングされるサブシステムは、それぞれのレイテンシに応じてスケジュールされます。スケジューリングの単位は、自動的に特定されてクロックレート パイプラインが適用された領域です。そのような領域のそれぞれで、スケジューリング ロジックのシーケンサーとして簡単な Counter ブロックが使用されます。カウンターはゼロから (クロックレートの割り当て - 1) までカウントします。ここで、割り当ては、共有リソースのサンプル レートと FPGA クロック レートの比として定義されます。この例では、Oversampling = 30 と設定しているため、割り当ては 30 です。コード ジェネレーターは、ストリーミングおよび共有される各サブシステムの実行時間を時間間隔で割り当てます。具体的には、その時間間隔の間だけアクティブになるように、サブシステム自体が Enabled サブシステム内にカプセル化されます。カウンターまたはシーケンサーの値で現在のタイム ステップを指定し、時間間隔を計算するロジックでそれらのサブシステムへのイネーブル入力を駆動します。

リソース共有またはストリーミングを指定する各サブシステムについて、シングルレートのリソース共有アーキテクチャで時分割多重化が実装されます。たとえば、gm_hdlcoder_singlerate_sharing_vnl/Subsystem/share を見てみます。SharingFactor = N の場合、共有アーキテクチャの実行に元の計算のサイクルで N-1 サイクルかかります。

open_system('gm_hdlcoder_singlerate_sharing_vnl/Subsystem/share');
set_param('gm_hdlcoder_singlerate_sharing_vnl', 'SimulationCommand', 'update');

gm_hdlcoder_singlerate_sharing_vnl/Subsystem/share に時間間隔 [2, 3] が割り当てられていることがわかります。これは、DUT の入力とこのサブシステムへの入力の間のパスに、OutputPipeline = 2 の Sum of Elements ブロック hdlcoder_singlerate_sharing/Subsystem/Sum_piped があるためです。共有サブシステムはタイム ステップ 2 で実行を開始し、SharingFactor = 3 であるため、完了までに (3-1 = 2) サイクルかかります。gm_hdlcoder_singlerate_sharing_vnl/Subsystem/share/crp_temp_shared へのイネーブル入力は、グローバル カウンターが 2 以上で 3 以下のときにのみアサートされます。

コード ジェネレーターは、ストリーミングおよび共有されるサブシステムに加え、状態をもつかマルチサイクルの演算を実装するブロックやサブシステムもスケジュールします。たとえば、設計で Multiply-Accumulate ブロックが使用されています。このブロックは、2 つの 4 要素ベクトルのドット積を計算します (gm_hdlcoder_singlerate_sharing_vnl/Subsystem/crp_temp_MAC を参照)。この実行には 4 サイクルかかり、時間間隔 [4, 7] でスケジュールされています。これは、入力からこの Multiply-Accumulate ブロックまでのパスに 2 つのストリーミング領域があるためです。最初のストリーミング領域 gm_hdlcoder_singlerate_sharing_vnl/Subsystem/stream1 は、ストリーミング係数が 2 であるため時間間隔 [0, 1] でスケジュールされ、2 番目のストリーミング領域 gm_hdlcoder_singlerate_sharing_vnl/Subsystem/stream2 は、ストリーミング係数が 4 であるため時間間隔 [1, 4] でスケジュールされています。

生成された検証モデルには自明でない変更がありますが、合成されたシングルレートの共有アーキテクチャの本質を正確に捉えています。また、このモデルは、レイテンシの追加による違いを除いて、この合成されたアーキテクチャの数値を元のモデルと比較します。詳細については、HDL Coder の遅延の均衡化と検証モデル ワークフローを参照してください。再生ボタンを押して検証モデルを実行すると、合成されたモデルと元のモデルの数値が各タイム ステップで比較され、不一致が見つかるとエラーがスローされます。