VivadoのSystemVerilog対応状況(合成編) のバックアップソース(No.2)

更新

[[公開メモ]]

#contents

* Xilinx の最新開発環境 Vivado における System Verilog 対応状況を調べてみました [#y37e954e]

System Verilog を学ぶにあたって、とりあえず使える範囲から学ばないと無駄になりそうなので、
という意味合いで、対応状況を確認してみました。

"Vivado Design Suite User Guide - Synthesis" UG901 (v2015.2) June 24, 2015 
の7章を参考にしています。

* Data Type [#h09b1f12]

- integer_vector_type: bit, logic, or reg
- integer_atom_type: byte, shortint, int, longint, integer, or time
- non_integer_type: shortreal, real, or realtime
- struct
- enum

変数宣言の際の var は省略可能。

** Integer Data Types [#sf4cb9f7]

|~01 / 01XZ|~type|~bits|~default|h
|2-state|shortint|16-bit|signed|
|~|int     |32-bit|signed|
|~|longint |64-bit|signed|
|~|byte    |8-bit |signed|
|~|bit     |user defined vector size|unsigned|
|4-state|logic   |user defined vector size|unsigned|
|~|reg     |user-defined vector size|unsigned|
|~|integer |32-bit|signed|
|~|time    |64-bit|unsigned|

むむぅ。int と integer は違うのか・・・

** Real Numbers [#p438835e]

- real
- shortreal
- realtime

パラメータとして与えることはできても、計算する回路を生成することはできない。

** Void Data Type [#n6475c9c]

値を返さない function を定義する際にだけ使える。

** User-Defined Types [#ma695177]

typedef により定義可能。

 typedef data_type type_identifier {size};
 typedef [enum, struct, union] type_identifier;

** Enum Types [#wfffa2b9]

 enum [type] {enum_name1, enum_name2,...enum_namex} identifier

type のデフォルトは int なので、それ以外にしたい場合に指定する。

数字の割り当ては enum_name1 = 0 であり、それ以降1ずつ増える。

Cと同様に enum_name2=3 などとして数値を指定することも可能。

 enum {day[7]} day_of_week;  // これは次の行と同じ意味
 enum {day0, day1, day2, day3, day4, day5, day6} day_of_week;
 
 enum {day[1:7]} day_of_week; // creates day1,day2...day7
 enum {day[7] = 5} day_of_week; //creates day0=5, day1=6... day6=11

** Constants [#l9bceb27]

- parameter
- localparam
- specparam : Synthesis では無視される
- const

パラメータには type やビット幅、符号のありなしを指定できる。

** Casting [#lbcbc48e]

System Verilog では異なる type 間での代入はエラーになるので明示的にキャストしなければならない

 casting_type'(expression)

** Aggregate Data Types - structure [#r0b50799]

 struct {struct_member1; struct_member2;...struct_memberx;} structure_name;

** Aggregate Data Types - union [#p873ee2a]

 typedef union {int i; logic [7:0] j} my_union;
 my_union sig1;
 my_union sig2;
 sig1.i = 32; //sig1 gets the int format
 sig2.j = 8’b00001111; //sig2 get the 8bit logic format

** Aggregate Data Types - Packed and Unpacked Arrays [#r7dc100f]

 logic [5:0] sig1; //packed array
 logic sig2 [5:0]; //unpacked array
 
 integer sig3; //equivalent to logic signed [31:0] sig3

* Processes [#g8c0288c]

** Always Procedures [#z401b4e0]

- always
- always_comb
- always_latch
- always_ff

 always_comb out1 = in1 & in2;
 //  always @(in1 or in2)
 //    out1 = in1 & in2;
 
 always_latch
   if(gate_en) q <= d;
 
 always_ff@(posedge clk)
   out1 <= in1;

** Block Statements [#i6b3e0fc]

begin ~ end で囲まれたブロックの中でローカル変数を定義可能。

 begin [: block name]
   [declarations]
   [statements]
 end [: block name]

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

end の後のブロック名は省略可能

Parallel blocks (あるいは fork join blocks) は Vivado synthesis ではサポート外。

** Procedural Timing Controls [#m32f2054]

Delay Control は Synthesis では無視される

Event Control は always に与える形で使う。

 always@(posedge clk)
 always@(a or b or c)
 always@(a,b,c)
 always@*

** Operators [#ub24bb8c]

:代入演算子| =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, <<<=, >>>=
:単項演算子| +, -, !, ~, &, ~&, |, ~|, ^, ~^, ^~
:増減演算子| ++, --
:二項演算子| +, -, *, /, %, ==, ~=, ===, ~==, &&, ||, **, < , <=, >, >=, &, |, ^, ^~, ~^, >>, <<, >>>, <<<
:三項演算子| ? :
:連接演算子| { }

- 単項演算子の &, ~&, |, ~|, ^, ~^, ^~ はCには無いので注目に値する
- 二項演算子の ===, ~==, **, ^~, ~^, >>>, <<< も特殊
- A**B は A が 2 の累乗であるか、B が定数であるときに限り有効である
- 引数の type によって符号付き・符号なし演算が適切に行われる

* Procedural Programming Assignments [#ra619739]

Counter: 15263 (from 2010/06/03), today: 3, yesterday: 0