AR# 51835

Vivado 合成のデザイン アシスタント - SystemVerilog プロセスのサポート

説明

このアンサーでは、Vivado 合成でサポートされる SystemVerilog のプロセスについて説明し、そのコード例を紹介します。このコード例は、このアンサーの最後にあるリンクからダウンロードできます。また、このアンサーには既知の問題、コード記述事例も含まれます。

注記 : 各コード例は Vivado プロジェクトを作成するのに直接使用できます。各例に含まれる SystemVerilog コンストラクトは、各ソース ファイルのヘッダーを参照してください。

ソリューション

Vivado 合成でサポートされている SystemVerilog プロセス

プロセスに関連したコード例については、このアンサーの最後にある表 1-1 を参照してください。

1. always プロシージャ

Verilog-2001 にはスタティック プロセスを定義する always 文があります。組み合わせ、ラッチ、および順次ロジックに対して特化したブロックが SystemVerilog によって追加されます。

Vivado 合成では次の 4 つの always プロセス文がサポートされています。

1.1. always
   このブロックの構文およびその使用方法は Verilog-2001 規格で定義されてるものと同じで、Vivado 合成に対して例外はありません。

1.2. always_comb
   このブロックは SystemVerilog でのみ定義されており、組み合わせロジックのビヘイビアーをモデリングするためのプロシージャです。例 :
   always_comb
   a = b & c;

この always_comb プロシージャの機能は標準の always プロシージャとは異なります。
   推論された極性リストがあり、そのリストに式が含まれています。
   割り当ての左側に書かれている変数はほかのプロセスによって書き込まれてはいけません。
   すべての initial および always ブロックが開始した後、このプロシージャはゼロ時に 1 度だけ自動的にトリガーされ、プロシージャの出力と入力が一致するようになります。

1.3. always_latch
   このブロックは SystemVerilog でのみ定義されており、ラッチ ロジックのビヘイビアーをモデリングするためのプロシージャです。例 :
   always_latch
   if(ck) q <= d;
   always_latch プロシージャはその極性を決定し、always_comb プロシージャと同じように実行します。

1.4. always_ff
   このブロックは SystemVerilog でのみ定義されており、合成可能な順次ロジックのビヘイビアーをモデリングするためのプロシージャです。例 :
   always_ff @(posedge clock or posedge reset) begin
   r1 <= reset ? 0 : r2 + 1;
   ...
   end

2. ブロック文

SystemVerilog のブロック文は、複数の文をグループにまとめるために使用します。ブロック全体を識別するためブロックに名前を付けます。名前が付けられたブロックは 1 つの新しい階層になります。このブロック内で変数を定義することができますが、これらの変数はそのブロックに特化したものになります。SystemVerilog では、ブロックの end 文の後にコロンを付け、その後に最初に指定したのと同じブロック名を続けることができます。これで end 文がどの begin 文、またはほかのブロックが入れ子になっている場合の fork 文に対応しているか分かりやすくなります。
Vivado 合成ではブロック文の使用がサポートされています。

構文 :
seq_block ::=
begin [ : block_identifier ] { block_item_declaration } { statement_or_null }
end [ : block_identifier ]

例 :
begin : my_block
logic temp;
temp = in1 & in2;
out1 = temp;
end : my_block

注記 : end 文の後にブロック名を記述するのは必須ではありませんが、コードが分かりやすくなります。
Vivado 合成でサポートされていないもの : SystemVerilog のパラレル ブロック (または Fork..Join ブロック) は Vivado 合成ではサポートされていません。

3. プロシージャ タイミング制御


Vivado 合成では、SystemVerilog 規格で定義されているプロシージャ タイミング制御がサポートされています。

3.1. 遅延制御
    構文 :
    delay_control ::=
    # delay_value
 

    例 :
    # 10 q = p;
 

このコンストラクトは、文とその実行までの時間を指定します。合成に対してはこれは便利なものではありませんが、Vivado 合成では割り当てに対してロジックが作成されるものの、この文は無視されます。
 
3.2. イベント制御
    Syntax:
    event_control ::=
    @ ( event_expression )
    | @*
    | @ (*)

   例 :
   always@(posedge clk)

このコンストラクトは特定イベントがあると割り当てを実行します。これは Verilog と同じです。極性リストが間違っていることが原因で発生するシミュレーションの不一致をなくす、この SystemVerilog @* イベント制御は Vivado 合成でサポートされています。 

 例 :
 Logic always@* begin

また、極性リストを分けるための論理 or またはカンマの使用が Vivado 合成でサポートされています。

 例 :
 always@(a or b or c)
 always@(a,b,c)
 
プロセスのコード例

表 1-1

コード例の名前 プロセス コンストラクト

 processes_example1.zip

  •  always プロシージャ ブロック
  •  always_ff プロシージャ ブロック
  •  演算子 : &
  •  プロシージャ タイミング制御

 processes_example2.zip

  • always_comb プロシージャ ブロック
  • always_ff プロシージャ ブロック
  • 演算子 : &

 processes_example3.zip

  • always_comb プロシージャ ブロック
  • operator: ==
  • ブロック文
 processes_example4.zip
  • always_ff プロシージャ ブロック
processes_example5.zip
  • always_ff プロシージャ ブロック
  • 演算子 : ++
processes_example6.zip
  • always_latch プロシージャ ブロック
processes_example7.zip
  • ブロック文
  • 演算子 : &
processes_example8.zip
  • イベント制御 : @(*), @(a or b)
  • 遅延制御 : #delay
  • 演算子 : &

 

添付ファイル

関連添付ファイル

タイトル サイズ ファイルタイプ
processes_example1.zip 934 Bytes ZIP
processes_example2.zip 960 Bytes ZIP
processes_example3.zip 956 Bytes ZIP
processes_example4.zip 898 Bytes ZIP
processes_example5.zip 921 Bytes ZIP
processes_example6.zip 912 Bytes ZIP
processes_example7.zip 924 Bytes ZIP
processes_example8.zip 1 KB ZIP

アンサー レコード リファレンス

マスター アンサー レコード

Answer Number アンサータイトル 問題の発生したバージョン 修正バージョン
51360 Vivado 合成のデザイン アシスタント - SystemVerilog のサポート N/A N/A
AR# 51835
日付 05/10/2013
ステータス アクティブ
種類 ソリューション センター
ツール