Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

HDL Coder での HDL Verifier コシミュレーション モデルの生成

この例では、既存の Simulink® モデルを再利用し、HDL Verifier™ コシミュレーション テスト ベンチを使って HDL Coder™ で生成されたハードウェア設計を検証する方法を示します。

はじめに

コシミュレーションは難しい作業であり、自動生成されたコードでは特に難しくなります。コード生成時に使用されたサンプル レート、フィードフォワード/フィードスルー システム、その他各種のパラメーターや設定など、ソース モデルのさまざまな側面について同期を維持しながら、HDL Verifier コシミュレーション ブロックとターゲットの HDL シミュレーターを設定することが重要です。

コシミュレーション モデルの自動生成では、コンパイル済みモデルとコード生成のすべての情報を解読することで、HDL Cosimulation ブロックとシミュレーターの設定から当て推量が排除されます。自動設定された内容は、生成されたスクリプトにすべて記録されます。最終的に、生成されたコードの検証にすぐに使用できるコシミュレーション モデルとなります。

主な例では、Mentor Graphics® ModelSim®/Questa® の使用方法を示していますが、サポートされている他のシミュレーターには Cadence® Xcelium™ (以前の Incisive®) や Xilinx® Vivado™ Simulator などがあります。最後に、これらのシミュレーターの特定の makehdltb の例を示します。

HDL およびコシミュレーション モデルの生成

このセクションでは、Simulink での基本的な積和設計を示します。HDL 設計を生成し、コシミュレーション テスト ベンチ モデルを生成します。次に、テスト ベンチ モデルがどのように動作するかについて詳しく説明します。

HDL 設計を生成

Simulink での簡単なアキュムレータの設計について、そのコシミュレーション モデルをテスト ベンチの生成の一環として自動的に生成します。

% Generate VHDL code using the |makehdl| function.
makehdl('hdl_cosim_demo1/MAC', 'targetlang', 'vhdl')
### Generating HDL for 'hdl_cosim_demo1/MAC'.
### Using the config set for model <a href="matlab:configset.showParameterGroup('hdl_cosim_demo1', { 'HDL Code Generation' } )">hdl_cosim_demo1</a> for HDL code generation parameters.
### Running HDL checks on the model 'hdl_cosim_demo1'.
### Begin compilation of the model 'hdl_cosim_demo1'...
### Working on the model 'hdl_cosim_demo1'...
### Working on... <a href="matlab:configset.internal.open('hdl_cosim_demo1', 'GenerateModel')">GenerateModel</a>
### Begin model generation 'gm_hdl_cosim_demo1' ....
### Copying DUT to the generated model....
### Model generation complete.
### Begin VHDL Code Generation for 'hdl_cosim_demo1'.
### Working on hdl_cosim_demo1/MAC as hdlsrc/hdl_cosim_demo1/MAC.vhd.
### Code Generation for 'hdl_cosim_demo1' completed.
### Creating HDL Code Generation Check Report file:///tmp/Bdoc23b_2355056_2722640/tpc8722662/hdlcoder-ex48550583/hdlsrc/hdl_cosim_demo1/MAC_report.html
### HDL check for 'hdl_cosim_demo1' complete with 0 errors, 0 warnings, and 0 messages.
### HDL code generation complete.

HDL テスト ベンチとしてコシミュレーション モデルを生成

Simulink 設計の作成に使用したモデルを開始点として使用して、HDL テスト ベンチとして使用するコシミュレーション モデルを生成します。HDL シミュレーターを選択するように makehdl パラメーター GenerateCosimModel を設定します。サポート対象の値には、ModelSimIncisive、または Vivado Simulator があります。

% Generate the cosimulation test bench for the MAC HDL
makehdltb('hdl_cosim_demo1/MAC', 'targetlang', 'vhdl', 'GenerateCosimModel', 'ModelSim')
### Begin TestBench generation.
### Generating HDL TestBench for 'hdl_cosim_demo1/MAC'.
### Begin compilation of the model 'hdl_cosim_demo1'...
### Begin compilation of the model 'gm_hdl_cosim_demo1'...
### Generating new cosimulation model: <a href="matlab:open_system('gm_hdl_cosim_demo1_mq')">gm_hdl_cosim_demo1_mq</a>.
### Generating new cosimulation tcl script: hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_mq_tcl.m.
### Generating new cosimulation tcl script: hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_mq_batch_tcl.m.
### Note: Option 'Allow direct feedthrough' has been set to 'on' on 'gm_hdl_cosim_demo1_mq/MAC_mq'
### Begin simulation of the model 'gm_hdl_cosim_demo1'...

### Collecting data...
### Generating test bench data file: hdlsrc/hdl_cosim_demo1/In1.dat.
### Generating test bench data file: hdlsrc/hdl_cosim_demo1/In2.dat.
### Generating test bench data file: hdlsrc/hdl_cosim_demo1/Out1_expected.dat.
### Working on MAC_tb as hdlsrc/hdl_cosim_demo1/MAC_tb.vhd.
### Generating package file hdlsrc/hdl_cosim_demo1/MAC_tb_pkg.vhd.
### HDL TestBench generation complete.
 

新規コード生成メッセージ

コマンド ウィンドウに表示される追加のコード生成メッセージからわかるように、コシミュレーション モデル gm_hdl_cosim_demo1_mq が生成されます。Simulink とのコシミュレーションに使用するターゲット シミュレーターの準備として、ターゲット ディレクトリ hdlsrc に生成されるコードに加え、追加のコシミュレーション スクリプト gm_hdl_cosim_demo1_mq_tcl.m が生成されています。

### Generating new cosimulation model: gm_hdl_cosim_demo1_mq
### Generating new cosimulation tcl script: hdlsrc/gm_hdl_cosim_demo1_mq_tcl.m
### Cosimulation Model Generation Complete.

(オプション) HDL コード カバレッジ レポートとデータベースの生成

HDL シミュレーターをインストルメント化してコード カバレッジ データベースを生成するには、以下のいずれかを行います。

a) [HDL コード生成]、[テスト ベンチ] ペインで、[HDL コード カバレッジ] というラベルのチェック ボックスをオンにします。

b) makehdltb を呼び出すときに、HDLCodeCoverageon に設定します。以下に例を示します。

makehdltb('hdl_cosim_demo1/MAC', 'targetlang', 'vh', 'GenerateCosimModel', 'ModelSim','HDLCodeCoverage','on');

テスト ベンチのシミュレーション後に、ソース ディレクトリに HDL コード カバレッジのアーティファクトが生成されます。

コシミュレーション モデルのテスト ベンチ機能の検査

スティミュラスと応答の取得

コシミュレーション モデルからわかるように、元のテスト対象デバイス (DUT) は 2 つのサブシステム ToCosimSrcToCosimSink によってインターセプトされます。これらの 2 つのサブシステムの目的は、DUT のスティミュラスと応答を取得し、Goto ブロックを使用したコシミュレーションの駆動に使用することです。次の各サブシステム内の Goto ブロックの数は、DUT の入力および出力の数と一致します。

ToCosimSrc:

ToCosimSink:

HDL Cosimulation ブロックのスティミュラス

最初に DUT を駆動するスティミュラスは、以下に示すように、完全に構成された HDL Cosimulation ブロックに From ブロックを使用して送られます。場合によっては、入力スティミュラス信号を HDL Cosimulation ブロックに直接送れないことがあります。たとえば、HDL 設計では、複素信号やベクトル化された信号などの構造化されたデータ型がフラットにされている可能性があり、HDL Cosimulation ブロックは RTL インターフェイスを反映しています。このような場合、入力スティミュラス信号のさらなる変換が自動的に行われます。現在のモデルでは、From ブロックから対応する Goto ブロックの内容が直接送られています。

FromCosimSrc:

結果の比較

応答データの可視化用に Simulink で提供されている Sink ブロックを使用して、元の DUT からの応答が HDL Verifier での HDL Cosimulation ブロックからの応答と比較されます。

Compare:

生成されたモデルでのアサーションのチェック

テスト対象デバイス サブシステムの各出力について、次のアサーションチェック モデルが生成されます。このモデルは、元の出力 (dut ref) をコシミュレーションの出力 (cosim) と照合し、Assertion ブロックへの入力で不一致を検出するとアサーション メッセージを生成します。

Assert_Out1:

Assertion ブロックの使用

アサーションは Assertion ブロックで有効になっていますが、シミュレーションは停止しません。コシミュレーションの一環として次のブロックからのアサーションがある場合は、Assertion ブロックからの警告を確認してください。

Warning: Assertion detected in 'gm_hdl_cosim_demo1_mq/Compare/Assert_Out1/AssertEq' at time 1.000000

HDL シミュレーター固有のサポートの検査

HDL Cosimulation ブロックの設定

HDL Cosimulation ブロックには、DUT のコンパイル済みの入出力インターフェイスが自動的に取り込まれます。[Ports] パネルの [Full HDL Name][Sample Time]、および [Data type] の情報がすべて取り込まれます。同様に、HDL Cosimulation ブロックの各種のセットアップ パラメーター ([Timescale] ペインや [tcl port] ペインなど) も自動的に取り込まれます。コシミュレーション モデルの [Connection method] は常に Shared Memory と設定されることに注意してください。

MAC_mq:

Warning: Expected localHostName to be a row vector. 

ターゲット シミュレーターの起動と設定

次に、ターゲット シミュレーター (ModelSim/Questa、Incisive/Xcelium、または Vivado シミュレーター) の起動と設定に関連する自動化について確認します。生成されたモデルの最上位レベルを確認すると、以下のコールバック関数をもつ Start Simulator という名前のサブシステムが生成されていることがわかります。このサブシステムを使用して、いずれかのターゲット シミュレーターが起動されます。

OpenFcn:

ans =

    'try
        cosimDirName = pwd;
        cd 'hdlsrc/hdl_cosim_demo1';
        vsim('tclstart',gm_hdl_cosim_demo1_mq_tcl);
        cd (cosimDirName);
        clear cosimDirName;
     catch me
        disp('Failed to launch cosimulator with "vsim"');
        disp (me.message);
        cd (cosimDirName);
        clear cosimDirName;
     end'

コシミュレーション モデルのシミュレーション

コールバックに関連付けられたコードはシミュレーターに固有のものであり、HDL シミュレーターを起動して実行するために必要なコマンドを実行します。ModelSim/Questa の場合、vsim の呼び出しが行われます。Incisive/Xcelium の場合、nclaunch の呼び出しが行われます。Vivado シミュレーターの場合、個別のプロセスまたはデバッグ環境はありません。代わりに、システム コマンドが設計をコシミュレーション用の共有ライブラリにコンパイルします。

ModelSim/Questa の詳細を次に示します。

vsim('tclstart',gm_hdl_cosim_demo1_mq_tcl)

ModelSim 用の MATLAB コマンド vsim は、ターゲット シミュレーターをコシミュレーション用の必要な設定と共に MATLAB 環境内から起動します。vsim コマンドは、シミュレーターを起動時に設定する tcl 文字列を受け入れる tclstart オプションを指定して呼び出されます。HDL Coder によって、コシミュレーション モデルと一緒にファイル gm_hdl_cosim_demo1_mq_tcl も自動的に生成されます。

生成される tclstart コマンド ファイルの内容

生成された tclstart ファイルには、起動したシミュレーターを設定するためのコマンドに加え、コシミュレーション モデルの各種設定の生成方法に関するコメントが含まれています。

hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_mq_tcl:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Auto generated cosimulation 'tclstart' script 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Source Model         : hdl_cosim_demo1
%  Generated Model      : gm_hdl_cosim_demo1
%  Cosimulation Model   : gm_hdl_cosim_demo1_mq
%
%  Source DUT           : gm_hdl_cosim_demo1_mq/MAC
%  Cosimulation DUT     : gm_hdl_cosim_demo1_mq/MAC_mq
%
%  File Location        : hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_mq_tcl.m
%  Created              : 2023-08-15 01:02:47
%
%  Generated by MATLAB 23.2, HDL Coder 23.2, and Simulink 23.2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ClockName           : clk
%  ResetName           : reset 
%  ClockEnableName     : clk_enable
%
%  ClockLowTime        : 5ns
%  ClockHighTime       : 5ns
%  ClockPeriod         : 10ns
%
%  ResetLength         : 20ns
%  ClockEnableDelay    : 10ns
%  HoldTime            : 2ns
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ModelBaseSampleTime   : 1
%  DutBaseSampleTime     : 1
%  OverClockFactor     : 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  Mapping of DutBaseSampleTime to ClockPeriod
%
%  N = (ClockPeriod / DutBaseSampleTime) * OverClockFactor
%  1 sec in Simulink corresponds to 10ns in the HDL Simulator(N = 10)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  ResetHighAt          : (ClockLowTime + ResetLength + HoldTime)
%  ResetRiseEdge        : 27ns
%  ResetType            : async
%  ResetAssertedLevel   : 1
%
%  ClockEnableHighAt    : (ClockLowTime + ResetLength + ClockEnableDelay + HoldTime)
%  ClockEnableRiseEdge  : 37ns
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function tclCmds = gm_hdl_cosim_demo1_mq_tcl
tclCmds = {
    'do MAC_compile.do',...% Compile the generated code
    'vsimulink -voptargs=+acc  work.MAC',...% Initiate cosimulation
    'add wave  /MAC/clk',...% Add wave commands for chip input signals
    'add wave  /MAC/reset',...
    'add wave  /MAC/clk_enable',...
    'add wave  /MAC/In1',...
    'add wave  /MAC/In2',...
    'add wave  /MAC/ce_out',...% Add wave commands for chip output signals
    'add wave  /MAC/Out1',...
    'set UserTimeUnit ns',...% Set simulation time unit
    'puts ""',...
    'puts "Ready for cosimulation..."',...
};
end

tclstart ファイルのヘッダー コメント

tclstart ファイルのコメントに、ソース モデル、生成されたモデル、コシミュレーション モデル、およびソースとコシミュレーションの DUT サブシステムが記載されています。コシミュレーションの DUT は、生成された HDL コードとソース モデルの DUT の相違点を取得するために、コシミュレーション モデルにソース モデルの DUT と並べて配置されます。コシミュレーション モデルは、生成されたコードのサイクル アキュレートでビットトゥルーな動作を検証します。

HDL 信号の可視化

最上位のすべてのインターフェイス信号に対して wave コマンドが追加されます。

シミュレーション前のコマンド

HDL Cosimulation ブロックには、[Pre-simulation Tcl commands] パラメーターにクロック バンドル (クロック、クロックイネーブル、リセット) を駆動する force コマンドが含まれています。[Time to run HDL simulator before cosimulation starts] パラメーターは、チップをリセットから復旧するのに必要な実行時間を設定してシミュレーションを開始します。

Cosim ブロック TclPreSimCommand:

ans =

    'puts "Running Simulink Cosimulation block.";
      puts "Chip Name: --> hdl_cosim_demo1/MAC";
      puts "Target language: --> vhdl";
      puts "Target directory: --> hdlsrc/hdl_cosim_demo1";
      puts [clock format [clock seconds]];
     # Clock force command;
     force /MAC/clk 0 0ns, 1 5ns -r 10ns;
     # Clock enable force command;
     force /MAC/clk_enable 0 0ns, 1 37ns;
     # Reset force command;
     force /MAC/reset 1 0ns, 0 27ns;
     
     '

コシミュレーション モデルの生成に影響するテスト ベンチ オプション

tclstart スクリプト ファイルの次の部分には、HDL Coder でサポートされるすべての makehdltb テスト ベンチ パラメーターと、コシミュレーション スクリプトで使用されるそれらの初期値が示されます。

ClockName, ResetName, ClockEnableName
ClockLowTime, ClockHighTime, ClockPeriod
ResetLength, ClockEnableDelay, HoldTime

モデルのサンプル時間と DutBaseSampleTime の ClockPeriod へのマッピング

コメント セクションの次の部分には、モデルのサンプル時間と、それらが HDL Verifier での HDL Cosimulation ブロックのクロックにどのように影響したかが示されます。

  N = (ClockPeriod / DutBaseSampleTime) * OverClockFactor
  1 sec in Simulink corresponds to 10ns in the HDL Simulator(N = 10)

生成される tclstart スクリプトの出力

gm_hdl_cosim_demo1_mq_tcl の関数により、必要な tcl コマンド文字列 (tclCmds) が生成されます。

EDAScriptGeneration オプションを on にして、makehdl の一環として ModelSim のコンパイル用の do ファイルを生成する場合、単一の do コマンドが生成されます。EDAScriptGeneration オプションを off にした場合は、DUT の生成された HDL コードをコンパイルするための明示的なコンパイル コマンドが追加されます。

シミュレーターの起動とコシミュレーション テスト ベンチの実行

Start Simulator ブロックをダブルクリックすると、生成された tclstart MATLAB スクリプトの tcl コマンドを使用してシミュレーターが起動されます。シミュレーターが起動すると、すべての生成されたコードがコンパイルされ、HDL Cosimulation ブロックのシミュレーションの準備が整います。

テスト ベンチを実行するには、[実行] ボタンを押します。元の Simulink 設計と HDL 設計の間のデータ値またはサイクル タイミングの違いに、アサーションによってフラグが付けられます。

その他の HDL インターフェイス変換のサポート

複素信号のサポート

モデル hdl_cosim_demo2 に複素数データ型を使用する MAC サブシステムが含まれています。コシミュレーション テスト ベンチの生成では、HDL 端子のインターフェイスと一致するように、Simulink 型の変換が自動的に処理されます。

% Generate the HDL for a MAC design using complex data types and its
% corresponding cosimulation test bench model:
load_system('hdl_cosim_demo2');
open_system('hdl_cosim_demo2/Complex MAC');
makehdl('hdl_cosim_demo2/Complex MAC', 'targetlang', 'vh');
makehdltb('hdl_cosim_demo2/Complex MAC', 'targetlang', 'vh', 'GenerateCosimModel', 'ModelSim')

FromCosimSrc サブシステムを確認: HDL Cosimulation ブロックを駆動する前に、入力複素信号が実数部と虚数部に自動的に分けられます。

比較セクションで、複素数出力の実数部と虚数部の結果が別々に確認されることがわかります。

ベクトル信号のサポート

モデル hdl_cosim_demo3 にベクトル化されたデータ信号を使用する MAC サブシステムが含まれています。コシミュレーション テスト ベンチの生成では、フラットにされた HDL 端子のインターフェイスと一致するように、Simulink 型の変換が自動的に処理されます。

% Generate the HDL for a MAC design using vectored signals and its
% corresponding cosimulation test bench model:
load_system('hdl_cosim_demo3');
open_system('hdl_cosim_demo3/Vector MAC');
makehdl('hdl_cosim_demo3/Vector MAC', 'targetlang', 've');
makehdltb('hdl_cosim_demo3/Vector MAC', 'targetlang', 've', 'GenerateCosimModel', 'ModelSim')

ベクトル化された信号が FromCosimSrc サブシステムと Compare サブシステムでどのように処理されるか確認します。

ローカル マルチレートのサポート

モデル hdl_cosim_demo4 に、Sum of Elements ブロックをもつ MAC サブシステムが含まれています。このブロックは、コード生成メッセージからわかるように、カスケード実装で構成されていて、オーバークロックを必要とします。コシミュレーション テスト ベンチの生成では、Simulink のタイミング インターフェイスから HDL 実装に必要なインターフェイスへの変換を自動的に処理します。

% Generate the HDL for a MAC design with 5x overclocking and its
% corresponding cosimulation test bench model:
load_system('hdl_cosim_demo4');
open_system('hdl_cosim_demo4/LocalMR MAC');
makehdl('hdl_cosim_demo4/LocalMR MAC', 'targetlang', 'vh');
makehdltb('hdl_cosim_demo4/LocalMR MAC', 'targetlang', 'vh', 'GenerateCosimModel', 'ModelSim');

マルチレート システムでのオーバークロックをオフセットするために、時間とスケールの設定がどのように変化するか注意してください。

コード生成メッセージに、モデルの基本レートの 5 倍の速さのクロックを必要とするオーバークロックが示されています。この情報は、次のメッセージに示されるように、コシミュレーション モデルでは時間スケール設定の一部としてカプセル化されています。

N = (ClockPeriod / DutBaseSampleTime) * OverClockFactor
1 sec in Simulink corresponds to 50ns in the HDL Simulator(N = 50)

Incisive/Xcelium のサポート

最初のモデルの Incisive/Xcelium コシミュレーション テスト ベンチを作成するための具体的なコマンドを以下に示します。

% Generate the HDL and cosimulation model for Incisive/Xcelium
load_system('hdl_cosim_demo1')
makehdl('hdl_cosim_demo1/MAC', 'targetlang', 'vh')
makehdltb('hdl_cosim_demo1/MAC', 'targetlang', 'vh', 'GenerateCosimModel', 'Incisive')
type hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_in_tcl

Vivado シミュレーターのサポート

最初のモデルの Vivado シミュレーターのコシミュレーション テスト ベンチを作成するための具体的なコマンドを以下に示します。

% Generate the HDL and cosimulation model for Vivado Simulator
load_system('hdl_cosim_demo1')
makehdl('hdl_cosim_demo1/MAC', 'targetlang', 'vh')
makehdltb('hdl_cosim_demo1/MAC', 'targetlang', 'vh', 'GenerateCosimModel', 'Vivado Simulator')
type hdlsrc/hdl_cosim_demo1/gm_hdl_cosim_demo1_vs.tcl