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