VivadoのSystemVerilog対応状況(合成編) の履歴(No.2)
更新Xilinx の最新開発環境 Vivado における System Verilog 対応状況を調べてみました†
System Verilog を学ぶにあたって、とりあえず使える範囲から学ばないと無駄になりそうなので、 という意味合いで、対応状況を確認してみました。
"Vivado Design Suite User Guide - Synthesis" UG901 (v2015.2) June 24, 2015 の7章を参考にしています。
Data Type†
- 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†
| 01 / 01XZ | type | bits | default | 
|---|---|---|---|
| 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†
- real
 - shortreal
 - realtime
 
パラメータとして与えることはできても、計算する回路を生成することはできない。
Void Data Type†
値を返さない function を定義する際にだけ使える。
User-Defined Types†
typedef により定義可能。
typedef data_type type_identifier {size};
typedef [enum, struct, union] type_identifier;
Enum Types†
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†
- parameter
 - localparam
 - specparam : Synthesis では無視される
 - const
 
パラメータには type やビット幅、符号のありなしを指定できる。
Casting†
System Verilog では異なる type 間での代入はエラーになるので明示的にキャストしなければならない
casting_type'(expression)
Aggregate Data Types - structure†
struct {struct_member1; struct_member2;...struct_memberx;} structure_name;
Aggregate Data Types - union†
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†
logic [5:0] sig1; //packed array logic sig2 [5:0]; //unpacked array integer sig3; //equivalent to logic signed [31:0] sig3
Processes†
Always Procedures†
- 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†
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†
Delay Control は Synthesis では無視される
Event Control は always に与える形で使う。
always@(posedge clk) always@(a or b or c) always@(a,b,c) always@*
Operators†
- 代入演算子
 - =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, <<<=, >>>=
 - 単項演算子
 - +, -, !, ~, &, ~&, |, ~|, ^, ~^, ^
 - 増減演算子
 - ++, --
 - 二項演算子
 - +, -, *, /, %, ==, ~=, ===, ~==, &&, ||, **, < , <=, >, >=, &, |, ^, ^~, ~^, >>, <<, >>>, <<<
 - 三項演算子
 - ? :
 - 連接演算子
 - { }
 
- 単項演算子の &, ~&, |, ~|, ^, ~^, ^~ はCには無いので注目に値する
 - 二項演算子の ===, ~==, **, ^~, ~^, >>>, <<< も特殊
 - A**B は A が 2 の累乗であるか、B が定数であるときに限り有効である
 - 引数の type によって符号付き・符号なし演算が適切に行われる
 
Procedural Programming Assignments†
Counter: 17037 (from 2010/06/03), 
today: 1,
yesterday: 2