vhdl での開発について

ＶＨＤＬ での ＦＰＧＡ 開発について
VHDL 論理合成の環境で最初に注意すべき点はシミュレーション・タイミング検証の為の HDL 記述と論理合成の為の HDL 記
述とを明確に区別して意識することが必要であること、ライブラリーには、予めテクノロジー・ライブラリとして提供されるデバイ
ス・ファミリーに固有の構成要素（たとえばグローバル・クロック・ドライバーなど）があり、一方ではアプリケーション側の ＲＴＬ 記述によって生成される構成要素（たとえばパッケージ化されたカウンタなど）があり、共にライブラリと呼ばれ、ワーク・ディレクトリにコンパイルしてから使用されるので混同し易いことであるように思います。

また、シミュレータとして Ｖｓｙｓｔｅｍ を使った場合のライブラリ／ワークの概念もはっきりと意識して使う必要があります。

小さなデバイスに多くを要求する場合
また、ＡＣＴＥＬ − ＡＣＴ ３ファミリーなど配線資源に種々の制約があるようなデバイスでは、タイミング特性をチューンする為に意図的に階層構造をフラットにして最適化を図った場合に生じる ＬＶＴ 資源の不足問題があります。
これは、ターゲット側のフィッタ／コンパイラが、資源としてセル・ピンの利用率などを認識してフィット可能と判断し、長時間の配置配線の実施に入った後でギブアップする状況になりますが、事前の予測はかなり困難と言えます。

階層構造を保持して LVT 資源の利用を制限する事により、ルーターのギブアッ
プを回避する事が出来る場合がありますが、このような場面に直面した場合の基本的な解決手法としては、設計サイズを小さく抑える工夫に尽きるものと思われます。

ただし、これらの状況は、ターゲットデバイスのフィッターの改版や論理合成
プログラムの改版によって大きくその様相が変化します。
旧版での対応策が新版では逆にパーフォーマンスを低下させる場合もあります
ので十分な注意が必要です。

vhdl での開発について

これまでの基本的な設計方針として
子葉末節の部分について言えば、今回の私共の設計方針では、使用するライブ
ラリを極めて限定し、型変換についてのパッケージなどについても極力、ieee 標準
ライブラリを直接参照するようにしています。
これらの型変換関数などは自分独自のパッケージを作成し、その中で新しい関数を定義して使えばよいのですが、このような手法は緊密な連絡を取り合っている
プロジェクトの中で有効とされているもので、疎な結合連絡形態で作業を進める場
合には、今回のような方法で混乱を避けるほうが良いように思っております。

双方向性のバス信号については、初期のレオナルドで発生した不具合経験から、複数の内部バスを階層最上位のマルチプレクサに接続した後に std_logic_vector に変換してから外部バスへトライステート形式で接続するように統一してあります。
ＶＨＤＬ の処理系によっては（例えばアルテラ社）３２ビットの取扱いを行わないものがありますが、このような場合には一旦レオナルドで ＥＤＩＦ に落としてインポートすれば済む内容なので、わざわざパッケージを作ってオーバーライド
するような事はしておりません。
使用開始初期のレオナルド 4.0x では、バスのメンバーの取扱いに問題があり、バス・メンバーの並び方向指定に downto 構文を使用しても、ターゲット側に正しく伝達解釈されず、ビットの並びが逆転してしまうなどの問題がありましたが、現在の版 4.2x ではこれらの問題はひととおり解決されています。
同様に、ＡＣＴＥＬ ターゲットでの負荷バランスの問題も現在のレオナルドでは解決されていますし、ＣＬＫＩＮＴ マクロの多重生成の障害も発生しなくなっています
ザイリンスクの場合についても同様にレオナルドの改版とザイリンクスのフィッタの能力向上により大幅な能力の向上がありました。
xact6.0.2 版（xnf ネットを取り込んでいた）の時に入り切らなかった規模の設計が、m1.4 版（edif 形式ネットの取り込みができる）では殆ど苦労せずに同一のデバ
イスにフィットさせることができるようになっています。
ただし、ファウンデーションの m1.4 版は基本的に回路図入力を前提にしており、
ネットリストを全て ＥＤＩＦ 形式で吐き出すレオナルドのようなサードパーティ
製品からのエントリーではプロジェクトファイルの作成や、ファイル名ルールに少し注意が必要です。（おそらくアライアンスでの m1.4 には不必要な事だろうという事ですが私共では検証できません）

vhdl での開発について

この資料の構成
添付した資料は、これからレオナルド／ Ｖｓｙｓｔｅｍ を使って実際にシミュレーション／フィティングを行う為に必要な作業の流れと、余りマニュアルに書いていない ＴＩＰＳ を説明するもので、具体例としてアルテラの事例から入り、実例を示した上でザイリンスクでの事例を説明するようにしました。

設計の具体例として実例を利用するのには、余りにも大きな時間と労力が必要とされますので、ＴＯＰ．ＶＨＤという簡単なターゲットの例

ＴＢ．ＶＨＤという、この ＴＯＰ 用のテストベンチを作成し、比較的詳しい解説資料を作成した上で、これを leonardo でコンパイ
ルし、アルテラの maxplusII でフィットするまでの実例ファイルと、フロー解説を
Ａ ３の解説図に纏めてみました。

次に、同じ設計をザイリンクスに適用した場合のフロー＆ ＴＩＰＳ を Ａ ３の解説図に作成し、実例ファイルを作成してあります。

特に、Ｖｓｙｓｔｅｍ 環境は ＣＲＴ 上での解析を目的としたもので、詳細な波形情報や、カーソルで検査したタイミングデータなどの設計資料的な内容の保存はできませんので（WAVE.PS ファイルは作成できますがアウトラインしか判りません）おそらく、このシステムの設計意図にある利用法は、設計者が ＣＲＴ 上で判断した事を証拠に残す必要はなく、そのような場合は TEXTIO を利用するものと想定しているのではないかと思われます。

この資料がお役に立つ事を願っております。

altera-top.vhd
1

5

10

15

20

25

30

------------------------------------------------------------------------- N-bit COUNTER COMPARATOR
for testbench lessons.
-----------------------------------------------------------------------library IEEE;
use IEEE.std_logic_1164.all;
こういうパラメータはジェネリッ
use ieee.std_logic_ARITH.all ;use ieee.std_logic_signed.all ;クとして与えるほうが良いかも知れません。
Entity TOP isport (DBUS : inout Std_Logic_Vector(7 downto 0);
CLK: in Std_Logic;
nRD: in Std_Logic;nWT: in Std_Logic;nCLR : in Std_Logic;
CENBL : in Std_Logic;
RSEL : in Std_Logic;
CVAL : out Std_Logic_Vector(7 downto 1);
EQU: out Std_Logic );end TOP;
Architecture RTL of TOP issignalDRO: Std_Logic_Vector(7 downto 0);
signalCompReg : Std_Logic_Vector(7 downto 0);
signalCntrReg : Std_Logic_Vector(7 downto 0);
signalCounter : Integer range 0 to 255; --Integer’high;begin
GEN1:for I in 0 to 7 GENERATE
DBUS(I)<=DRO(I) when nRD=’0’ else ’Z’;
end GENERATE GEN1;
CntrReg<= Conv_Std_Logic_Vector(Counter,8);

35

40

45

50

55

60

DRO<= CompReg

when RSEL=’0’ else CntrReg;

こういう記述は安易に使わないようにしたほうが無難でしょう。（きちんとした体系を作って設計するなら別）
実際にこれを試してみると分かります
が深い階層下で起きると厄介なバグになりかねません (‑‑;)--------------------------------------------------------------------------RegLdProc: Process(CLK,DBUS,nWT,CompReg)--------------------------------------------------------------------------begin
if(CLK’EVENT and CLK=’1’) thenif(nWT=’0’) then
CompReg<= DBUS;
else
CompReg<= CompReg;
end if;end if;end Process RegLdProc;----------------------------------------------------------------------------------------------------------------------------------------------------CountProc: Process(CLK,CENBL,nCLR,nWT,Counter,CompReg)--------------------------------------------------------------------------begin
if(nCLR=’0’ or nWT=’0’) thenCounter<=0;
elsif(CLK’EVENT and CLK=’1’) thenif(CENBL=’1’) then Counter<= Counter+1;
elseCounter<= Counter;end if;end if;
CVAL<= Conv_Std_Logic_Vector(Counter,7);
end Process CountProc;---------------------------------------------------------------------------

65

EQU<=’1’ when (Counter= Conv_Integer(Compreg))else ’0’;
end RTL;

意図して遅延のある信号を取り出していますaltera tb.vhd

1

5

10

15

20

Entity TestBench isend;------------------------------------------------------library IEEE;
use IEEE.std_logic_1164.all;
被テスト設計をコンポーネント宣言し
use ieee.std_logic_ARITH.all ;use ieee.std_logic_signed.all ;（実体は別にコンパイルされている）
Architecture TestMain of TestBench iscomponent TOP
port (DBUS
CLK
nRD
nWT
nCLR
CENBL
RSEL
CVAL
EQU
);
end component;-- This is the TARGET design ---: inout Std_Logic_Vector(7 downto 0);: in Std_Logic;: in Std_Logic;: in Std_Logic;: in Std_Logic;: in Std_Logic;: in Std_Logic;: out Std_Logic_Vector(6 downto 0);: out Std_Logic

25

30

Type TestRecordT is record -- TestVector format definition.
nRD,nWt : Std_Logic ;CE,RSEL : Std_Logic ;DBUS: Std_Logic_Vector(7 downto 0) ;EOV
: Std_Logic ;印加したいテストベクタ値を設定する
End record;
Type TestArrayT is array(positive range <>) of TestRecordT;

35

40

45

50

55

60

constant TestPattern : TestArrayT := ((nRD=>’1’,nWT=>’1’,CE=>’0’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’0’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’0’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’0’,CE=>’1’,RSEL=>’0’,DBUS => "00000101",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’1’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1
プリンタドライバのミス(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’0’,CE=>’1’,RSEL=>’0’,DBUS => "00001010",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’1’,DBUS => "ZZZZZZZZ",EOV=>’1’) );altera tb.vhd
65

signal INDX: positive :=1;-- Index of TestPattern(INDX) 0 not allowed

constant MAXCOUNT : INTEGER:= 3; -- for Patern-Gen repeat count value
signal
CLKCOUNT : INTEGER:= 0; -- CLOCK counter to increment Pattern-Gen
7075-- Internal signals for Test-Bench operations ----------------------------signal DBUS
: Std_Logic_Vector(7 downto 0);
signal CVAL
: Std_Logic_Vector(7 downto 1);
signal CLK,nRD : Std_Logic;
signal nWt,nCLR : Std_Logic;
signal CE,RSEL : Std_Logic;
signal EQU: Std_Logic;-------------------------------------------------------------------------------

80

Begin
-- Test Bench MAIN. Connect target entity with test vector signals -------------------------------------------------------------------------------nCLR<= ’0’, ’1’ after 200 ns,’0’ after 1 us,’1’ after 1.2 us;85--------------------------------------------------------------------------クロックの発生例、当然ジェネ

90

CLK_P : Process-- Clock pulse generator
リックで与えてもよい--------------------------------------------------------------------------Begin
CLK<=’0’;
wait for 25 ns;
CLK<=’1’;
wait for 25 ns;
End Process CLK_P;----------------------------------------------------------------------------------------------------------------------------------------------------

95

100

105

110

115

120

125

CLKCOUNT_P : process(CLKCOUNT,CLK) -- @CLKCOUNT=0 increment (INDX)--------------------------------------------------------------------------- You can modify TestStim process to control INDX increment timing NOT-- with CLKCOUNT=0 event BUT with some responce signal from the Target.
-- This will provide a TestBench-Target handshaking.
-------------------------------------------------------------------------Beginif(CLK’EVENT and CLK=’1’) thenif(CLKCOUNT=MAXCOUNT) then CLKCOUNT<=0;else
CLKCOUNT<=CLKCOUNT+1;
end if;end if;
End Process CLKCOUNT_P;--------------------------------------------------------------------------- provide stimulus ------------------------------------------------------TestStim: process(CLKCOUNT)-Read Test-Vectors into signals.
--------------------------------------------------------------------------variable Vector : TestRecordT;
variable EOV: Std_Logic;
Beginif(CLKCOUNT=0) then
Vector := TestPattern(INDX);nRD<= Vector.nRD;-- apply the stimuls
nWT<= Vector.nWT;
CE<= Vector.CE;
ここではテストベクターを CLKCOUNT̲P に
RSEL<= Vector.RSEL;
合わせて順次読込んでいるが、任意の方法
DBUS<= Vector.DBUS;
をとればよい。
EOV:= Vector.EOV;
INDX<= INDX+1;
if(EOV=’1’) then assert FALSE report "End.";end if;end if;
End Process TestStim;--------------------------------------------------------------------------

altera tb.vhd
130

被テスト設計をインスタンス化してテストベンチの信号とを接続する。

-----------------------------------------------------------------------------UUT: TOP-- Notice this is the sdf applicant REGION-----------------------------------------------------------------------------PORT MAP(
DBUS=>DBUS,
CLK=>CLK,
nRD=>nRD,
nWT=>nWT ,nCLR=>nCLR,
CENBL=>CE ,RSEL=>RSEL,CVAL=>CVAL,
EQU
=>EQU
);
END;
------------------------------------------------------------------------------

135

140

145

.sdfのデータを（個別に）適用する対象、レジョン名がＵＵＴとなる。
-----------------------------------------------------------------------------configuration RTL of TestBench isfor TestMain
for all: TOP
アルテラのバック・アノテート出力 .vho の
use entity work.TOP(RTL);
場合は、フィットしたデバイス名がアーキテ
end for;
クチャ名になるので、これを指定したコンフ
end for;end RTL;ィギュレーションを作っておく。

150

155

-----------------------------------------------------------------------------configuration ALTERA_TEST of TestBench isfor TestMain
for all: TOP
use entity work.TOP(EPM7032SLC44_a10);-- From Top.vho output
end for;end for;end ALTERA_TEST;

160

165

170

-----------------------------------------------------------------------------configuration XILINX_FIT of TestBench isfor TestMain
for all: TOP
use entity work.TOP(STRUCTURE);
end for;end for;end XILINX_FIT;

ザイリンクスでのバックアノテートファイルは time̲sim.vhd time̲sim.sdfの２つになる（バイタル）time̲sim.vhd ：フィットしたデバイス内部のネットリスト
time̲sim.sdf ：使用されているプリミティブの遅延データ

ｖｓｉｍするとき、エンティティを指定する方法と、コンフィギュレーションを指定する
方法のどちらも使えるので、ワーク内にコンパイルしてあれば差はない。
エンティティから指定する方法を取った場合には、アーキテクチャ名も指定する事になる。

LEONARDO‑ALTERA‑VSYSTEM 簡略化作業フロー概念図

leonardoのワーク！注意 top.vhdなどのように設計と同じ名前でラッパーを作成しないようにします

WRAPPER

TOP.VHD

最上位のエンティティをＳｔｄＬｏｇｉｃで再定義

Ｆ６Ｋ etc

LAYER.VHD

目的はシミュレーション。手書きでも可。

TEXTIO

ieee.std

別階層の
デザイン

VSYSTEMのワーク

トップ
デザイン

テクノロジ
ライブラリ

ライブラリマッピングしておく

パッケージ
＠work

タイミング制約を与えオプティマイズし、故意にスラックさせ、REPORT̲DELAYをＶiewＣriticalPathチェックで実行
してハイライトファイル（ex temp.hlt)しながらネットス
コープ起動。ハイライトボタンで目的ネットを検索すると便利です。

EXEMPLAR
leonardo

TOP(RTL)

TB.VHD

netscope
ＥＤＩＦ
ビュワー
デザイン
ブラウザ

Vsystem
VCOM

テスト
ベンチ

RTLモデル

ＴＢ
ワーク内に
コンパイル

TOP.EDF
階層の組み替え（オプティマイズ対象の構成変更）
インスタンス・ポート名・プリミティブの確認
特に配線資源が微妙な場合に有効

エンティティ・コンフィギュレーション(ＲＴＬ)を指定してシミュレートしますが、論理合成とは関係なく処理されます。

EDIF出力VSIM

WAVE.PS
この段階で、すでにＲＴＬ記述ではなくなっている事に注意しますコンパイラ／インターフェース／EDIFネットリーダ設定でEXEMPLARを指定
SHOW LMF マッピングをチェックしておくとOPミスに気が付く事があります。
メニュー／コンパイラ／インターフェース／VHDLネットライタの設定で参照される
バイタル・ライブラリ。
インストールしてあればよい（筈）です

maxplus2
フィッター

アルテラの場合、バイタルは
maxplusII に読込ませて利用できます

コンパイラ／インターフェース／VHDLライタセッティング
でVHOを選択、同じくインターフェース／VHDLライタをセッ
トしてコンパイルします。
アルテラの場合のシミュレーションはこのＶＨＯファイル
だけで十分です

TOP.VHO

ALT̲VTL.VHD
ALT̲VTL.CMP

実フィットデバイス名がアーキテクチャ名として出力されるので、ＴＢでは この新しいバインディングを使います。

TOP.SDO
SDOファイル

デバイス
ファイル

アルテラでは同じデバイス・パッケージであっても速度ランクが異なる場合には再度コンパイルする事になるので、スマート・コンパイルオプションを使っておくと良
いかも知れません。（ザイリンクスの場合はＰＡＲ以後の処理で済みます）

maxplusIIのワーク

このファイルは使用プリミティブの個別
タイミングデータを返すものでネット情報は持っていません。
どうしても sdf を使いたい場合には、
maxplusII/vhdl87/vital/v3̲0でvlibしてworkを作成し、alt̲vtlを全てvcomし、これをvlibでマッピングして使います。

WAVE.PS
実デバイス

ＳＤＦファイルを使う場合はVSIM/SDFで適用するREGIONを指定して使います。

外部テキストファイル(テストベクタ）
取込み、アサート文による警告レベル
デバイスとハンドシェークしたシミュ
レーション、ブレーク条件などが制御できます。 テストベクタなどの配列
はインデックスが１から始まることに注意します。

GATEモデル

基本的にはWYSWYGでフィットさせます

POFファイル
SOFファイル

テキスト記述を修正してバインディングを切替え
ます。

波形出力
ファイル出力Vsystem
VCOM

VHOファイル
遅延データ内蔵V8.3までの maxplusIIのVHDLリーダはパーサが貧弱なので使用しな
いほうがよいと思いま
すが、コンパイラがハングした時は Vsystemやleonardoで調べると文法ミスなどのハング原因が判る事がありま
す

ワーク内に
コンパイル

ここで読み込むのはtop.VHOファイルです（top.vhdをVCOMするとRTLモデルになります）その次にtb.vhdをVCOMしてVSIMします。

TB.VHD
TOP.VHO
適用すべきバインディングはもはやＲＴＬではない事に注意します。
アルテラの場合、対象となるアーキ
テクチャ名＝デバイス名になります。

VSIM
VSIMのwave/メニュー/signals/addtowaveformで
signals in designを選択すると全信号がモニタできます

maxplusIIでは処理が困難な外部遅延素子（メモリなど）のモデル化が容易
です。

波形出力
ファイル出力

ソース
記述依存

タイミング
データ包括

テスト
ベクタ

ソース記述
依存の構造

ゲートレベル
変換済の構造leonardoのワークしたもの,目的はシミュレーションで利用価値は不明です。

テクノロジ
ライブラリ

トップ
デザイン

！注意 top.vhdなどのように設計と同じ名前でラッパーを作成しないようにしましょう。

EXEMPLAR
leonardo①動作環境を設計

netscope
ＥＤＩＦ
ビュワー③ 詰込、ピン指定、タイミング
負荷分散、階層組替え、等の処理。 ターゲット側からの資源制約もここで解決します

デザイン
ブラウザ
階層の組み替え（オプティマイズ対象の構成変更）インスタンス・ポート名・プ
リミティブの確認等。
特に配線資源が微妙な場合に有効です。

TOP.EDN

デバイス指定はデザインマネージャ
で再度行いますもし、ツールがうまく動作しない場合
フローエンジンのコマンドヒストリをテキストで開き、同じ内容をＤＯＳ窓から実行すると処理できる場合があります（トランスレート／マップまで）
このような場合には、インストールの問題か、プロジェクトファイルの問題
か、環境変数の設定が原因かをつきとめて対策とします。（当然、ルータはＤＯＳ窓からは実行 できません）
問題の発生した場所がトランスレート
やマッピングの段階であれば、ログフ
ァイルをよく検討して、プリミティブの使い方などの基本的な間違いを検出できることがあります。

FOUNDATIONPROJECT MGR
M1.4

FOUNDATION
Design MGR
M1.4

PROJECT MANAGER(.pdf)を使うとバイタルライブラリ SIMPRIMsが自動的に検索されますが、フローエンジン／設定／オプション／タイ
ミングシミュレーションデータの生成をチェックしておく事が必要です。
／オプション／コンフィギュレーション／
テンプレートで、スタートアップ・タイ・
コンフィギュレーション・CMOS/TTL等を設定します。

ビットストリーム
ファイル

Xilinx のワーク

vhdファイル

M1.3/1.4

必ず フローエンジン／設定／オプション／インプリメンテーション／テンプレート／インターフェースで、
フォーマットをvhdlに指定します。

⑦デバイス作成
タイミングアナライザでの時間制約条件
確認した後、電力計算に満足できれば、ＲＯＭの作成を行う為、以下の例のようなＤＯＳのコマンドを実行します（PROMに近いデバイスから順にビットファイルを列挙するだけですがバージョン管理には十分に注意します）

promgen ‑p mcs ‑o MX0pMX1 ‑s 512 ‑u 0 mx0̲bd0.bit mx1.bit
MX0pMX1.MCS
書込み器に合わせたフォーマットのＲＯＭファイルtime̲sim.vhd

実デバイス
デバッグへ

time̲sim.sdf

ワーク内に
コンパイル

Vsystem
VCOM

シミュレーションを停止させる為に意図的にエラーを発生させる事がよくあります。

ＴＢ
コンパイルには順序があります

ワーク内に
コンパイル

WAVE.PSVSIMEDIF出力⑤シミュレーションファイルの作成
Top.BitTB.VHD

波形出力
ファイル出力xilinxの場合、leonardo出力ファイル名
をTOP.EDNとしておきます
ファウンデーションでの処理の場合にはプロジェクトマネージャからメニューで/NEW PROJECT/としてフォルダを作成します、この操作でディレクトリ階層が１つ下がりますのでDOCUMENT/ADD で１つ上の階層の TOP.EDN ファイルを指定し、インプリメントアイコンでデザインマネージ
ャを起動します。
この時、EDIFネットが SCHネットより古いから更新するか？と問い合わせて来ますので必ずＮＯとします。

TOP(RTL)

テスト
ベンチ

タイミング制約を与えてオプティマイズし、故意にスラックさせ、REPORT̲DELAYをＶiewＣriticalPath
チェックで実行してネットスコープ起動。ハイライ
トファイル（temp.hlt)しながら目的ネットを検索すると便利です。

④ＥＤIＦ作成

VSYSTEMのワークライブラリマッピングをしておきます①設計を準備パッケージ
＠work

TEXTIO

ieee.std

別階層の
デザイン

TOP.VHD

Wrapperとは最上位のエンティティを StdLogic で再定義

Ｘe4K etc

leonardo‑Xilinx‑VSYSTEM 簡略化作業概念図

LAYER.VHD②基本動作確認し、問題点を修正する為に①へ戻る
ループ（または③経由）で設計を完成します。
エンティティ名は元のTOPですが、フィットされた結果、デバイス内部結線を反映した
アーキテクチャを持つvhdファイルです。

アーキテクチャ名は元設計名とは無関係にstructure として出力される
のでＴＢでは新しいバインディングを使います。
このファイルは vhdl 形式のネット
リストになっていますが、アルテラの.vhoと異なり、遅延情報は含まれていません。

エンティティまたはコンフィギュレーシ
ョンを指定してシミュレートしますが、
実デバイスとは関係なく処理されます。
ソースの文法チェックや、ＴＢの機能のチェックに非常に有用です。

予め記述を加工してバインディングを切替えられるよ
うにしておくと楽です。

予めザイリンクスの SIMPRIMは
インストール・ディレクトリ内
にてvlibしてworkを作成し、ＶＣＯＭしておき、実作業時 vlib マッピング指定
で SIMPRIM ライブラリ名をフルパスでこのディレクトリに指定します。

Vsystem
VCOM
SIMPRIM

time̲sim.vhd

ライブラリ
マッピング

ワーク内に
コンパイル

sdfファイル
このファイルは使用しているプリミティブの個別タイミングデータを返すもので、ネット情報は一切持っていません。

sdfファイルを使う時には VSIM/SDFで適用する REGION を指定して使います。
xilinxのシミュレーションでは、VSIMのメニューで以下の項目をチェックし
Use VITAL2.2b Mapping
VITAL Disable Timing Checks
同じくSpecify Genericsで設計外パラ
メタWIDTHを0以外の値に設定します。
等価コマンドラインは以下のとおりです

WAVE.PS
波形出力
ファイル出力VSIM⑥タイミング問題の発見
動作条件の確定

印刷して使うのは避けます
4.6Gでは印字バグあり
基本的にＣＲＴ上での解析のみの利用を考えたシステ
ムです。 textioが有効。

ソース
記述依存

！適用すべきバインディングはもはやＲＴＬ
ではない事に注意します。
ザイリンクスでは対象となるアーキテクチャ
名は常に"structure" となります

タイミング
データ包括

テスト
ベクタ

ソース記述
依存の構造

ゲートレベル
変換済の構造vsim ‑Gwidth=1 +notimingchecks ‑vital2.2b ‑sdftype uut=d:¥***¥time̲sim.sdf xilinx̲fit（または testbench testmain）
以下、wave * /view * / run ‑all などとします。assert文などtextioを利用しブレーク条件を使うとvhdlになります。

意味：レジョンuutにtime̲sim.sdfを適用し、コンフィギュレーション xilinx̲fitをシミュレートせよ。
またはエンティティ指定で、（ファイルtb.vhdの）エンティティ名testbench内のアーキテクチャ
testmainで、実デバイスに対応するレジョンuut（time̲sim.vhdのtop）をシミュレートせよ。
どちらでも結果は同じになります。混在シミュレーションでは複数のレジョンに複数のsdfを指定します。

xilinx top.vhd
1

5

10

15

------------------------------------------------------------------------- N-bit COUNTER COMPARATOR
for testbench lessons.
-----------------------------------------------------------------------library IEEE;
use IEEE.std_logic_1164.all;use ieee.std_logic_ARITH.all ;use ieee.std_logic_signed.all ;Entity TOP isport (DBUS : inout Std_Logic_Vector(7 downto 0);
P_CLK : in Std_Logic;
nRD: in Std_Logic;nWT: in Std_Logic;
P_nCLR: in Std_Logic;
CENBL : in Std_Logic;
RSEL : in Std_Logic;
CVAL : out Std_Logic_Vector(7 downto 1);
EQU: out Std_Logic );end TOP;

20

25

Architecture RTL of TOP is-- for Xilinx fitting --------------------------------------------------------COMPONENT BUFG PORT( I: IN Std_Logic; O: OUT Std_Logic ); END COMPONENT ;------------------------------------------------------------------------------signal
DRO: Std_Logic_Vector(7 downto 0);
signalCompReg : Std_Logic_Vector(7 downto 0);
signalCntrReg : Std_Logic_Vector(7 downto 0);
signalCounter : Integer range 0 to 255; -- Integer’high;signal
CLK,nCLR: Std_Logic;

30

35

Begin
-- for Xilinx fitting --------------------------------------------------------ux0: BUFGPORT MAP( I => P_CLK, O => CLK );ux1: BUFGPORT MAP( I => P_nCLR,O => nCLR );------------------------------------------------------------------------------GEN1:for I in 0 to 7 GENERATE
DBUS(I)<=DRO(I) when nRD=’0’ else ’Z’;
end GENERATE GEN1;

40
CntrReg<= Conv_Std_Logic_Vector(Counter,8);
DRO<= CompReg
when RSEL=’0’ else CntrReg;
4550--------------------------------------------------------------------------RegLdProc: Process(CLK,DBUS,nWT,CompReg)--------------------------------------------------------------------------begin
if(CLK’EVENT and CLK=’1’) thenif(nWT=’0’) then
CompReg<= DBUS;
else
CompReg<= CompReg;
end if;end if;end Process RegLdProc;---------------------------------------------------------------------------

55

60

65

--------------------------------------------------------------------------CountProc: Process(CLK,CENBL,nCLR,nWT,Counter,CompReg)--------------------------------------------------------------------------begin
if(nCLR=’0’ or nWT=’0’) thenCounter<=0;
elsif(CLK’EVENT and CLK=’1’) thenif(CENBL=’1’) then Counter<= Counter+1;
elseCounter<= Counter;end if;end if;
CVAL<= Conv_Std_Logic_Vector(Counter,7);
end Process CountProc;---------------------------------------------------------------------------

70
EQU<=’1’ when (Counter= Conv_Integer(Compreg))else ’0’;
end RTL;

xilinx tb.vhd

1

5

10

Entity TestBench isend;------------------------------------------------------library IEEE;
use IEEE.std_logic_1164.all;use ieee.std_logic_ARITH.all ;use ieee.std_logic_signed.all ;Architecture TestMain of TestBench iscomponent TOP
port (DBUS
P_CLK
nRD
nWT
P_nCLR
CENBL
RSEL
CVAL
EQU
);
end component;

15

20-- This is the TARGET design ---: inout Std_Logic_Vector(7 downto 0);: in Std_Logic;: in Std_Logic;: in Std_Logic;: in Std_Logic;: in Std_Logic;: in Std_Logic;: out Std_Logic_Vector(6 downto 0);: out Std_Logic

25
Type TestRecordT is record -- TestVector format definition.
nRD,nWt : Std_Logic ;CE,RSEL : Std_Logic ;DBUS: Std_Logic_Vector(7 downto 0) ;EOV
: Std_Logic ;End record;

30

Type TestArrayT is array(positive range <>) of TestRecordT;
35

constant TestPattern : TestArrayT := ((nRD=>’1’,nWT=>’1’,CE=>’0’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’0’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’0’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’0’,CE=>’1’,RSEL=>’0’,DBUS => "00000101",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’1’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),

40

45

50

(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’0’,CE=>’1’,RSEL=>’0’,DBUS => "00001010",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "00000000",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’)

55

,
60

(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’1’,nWT=>’1’,CE=>’1’,RSEL=>’0’,DBUS => "ZZZZZZZZ",EOV=>’0’),(nRD=>’0’,nWT=>’1’,CE=>’1’,RSEL=>’1’,DBUS => "ZZZZZZZZ",EOV=>’1’) );65

signal INDX: positive :=1;-- Index value of TestPattern(INDX)

constant MAXCOUNT : INTEGER:= 3; -- for Patern-Gen repeat count value
signal
CLKCOUNT : INTEGER:= 0; -- CLOCK counter to increment Pattern-Gen

xilinx tb.vhd

7075-- Internal signals for Test-Bench operations ----------------------------signal DBUS
: Std_Logic_Vector(7 downto 0);
signal CVAL
: Std_Logic_Vector(7 downto 1);
signal CLK,nRD : Std_Logic;
signal nWt,nCLR : Std_Logic;
signal CE,RSEL : Std_Logic;
signal EQU: Std_Logic;-------------------------------------------------------------------------------

80

Begin
-- Test Bench MAIN. Connect target entity with test vector signals -------------------------------------------------------------------------------nCLR

85

90<= ’0’, ’1’ after 200 ns,’0’ after 1 us,’1’ after 1.2 us;--------------------------------------------------------------------------CLK_P : Process-- Clock pulse generator--------------------------------------------------------------------------Begin
CLK<=’0’;
wait for 25 ns;
CLK<=’1’;
wait for 25 ns;
End Process CLK_P;----------------------------------------------------------------------------------------------------------------------------------------------------

95

100

105

110

115

120

125

130

CLKCOUNT_P : process(CLKCOUNT,CLK) -- @CLKCOUNT=0 increment (INDX)--------------------------------------------------------------------------- You can modify TestStim process to control INDX increment timing NOT-- with CLKCOUNT=0 event BUT with some responce signal from the Target.
-- This will provide a TestBench-Target handshaking.
-------------------------------------------------------------------------Beginif(CLK’EVENT and CLK=’1’) thenif(CLKCOUNT=MAXCOUNT) then CLKCOUNT<=0;else
CLKCOUNT<=CLKCOUNT+1;
end if;end if;
End Process CLKCOUNT_P;--------------------------------------------------------------------------- provide stimulus ------------------------------------------------------TestStim: process(CLKCOUNT)-Read Test-Vectors into signals.
--------------------------------------------------------------------------variable Vector : TestRecordT;
variable EOV: Std_Logic;
Beginif(CLKCOUNT=0) then
Vector := TestPattern(INDX);nRD<= Vector.nRD;-- apply the stimuls
nWT<= Vector.nWT;
CE<= Vector.CE;
RSEL<= Vector.RSEL;
DBUS<= Vector.DBUS;
EOV:= Vector.EOV;
INDX<= INDX+1;
if(EOV=’1’) then assert FALSE report "End.";end if;end if;
End Process TestStim;------------------------------------------------------------------------------------------------------------------------------------------------------UUT: TOP-- Notice this is the sdf applicant REGION------------------------------------------------------------------------------

xilinx tb.vhd

PORT MAP(
135

140

145

150

155

160

DBUS
P_CLK
nRD
nWT
P_nCLR
CENBL
RSEL
CVAL
EQU
);

=>DBUS,=>CLK,=>nRD,=>nWT ,=>nCLR,=>CE ,=>RSEL,=>CVAL,=>EQU --,

END;----------------------------------------------------------------------------------------------------------------------------------------------------------configuration RTL of TestBench isfor TestMain
for all: TOP
use entity work.TOP(RTL);
end for;end for;end RTL;-----------------------------------------------------------------------------configuration ALTERA_FIT of TestBench isfor TestMain
for all: TOP
use entity work.TOP(EPF6016TC144_a3);
end for;end for;end ALTERA_FIT;

165

170

-----------------------------------------------------------------------------configuration XILINX_FIT of TestBench isfor TestMain
for all: TOP
use entity work.TOP(STRUCTURE);
end for;end for;end XILINX_FIT;