SystemVerilog言語の革新

画像

この記事では、言語の合成されたサブセットのVerilog-2001と比較した、データ編成の分野におけるSystemVerilogの革新のいくつかを示します。

SystemVerilogの歴史は、長さと霧のコンテンツです。 Verilog-95標準の採用に始まり、Verilog-2001で頂点に達しました。 ただし、この言語は検証にあまり適していませんでした。「E」ファミリーの言語を使用するエンジニア-VERA、Testbuider。 SystemVerilogは、2005年以降、最新の形で登場しました。 現在、Quartus II、ISE、ModelSim / QuestaSimなどの合成ツールとモデリングがSystemVerilogを自信を持ってサポートしています。 標準はIEEE 1800-2012と呼ばれます。

ご注意 この記事は長い間書かれていますが、公開されていません。 初心者に役立つことを願っています。


SystemVerilogは、多くの新しい興味深いデザインをVerilogの世界にもたらしました。


ユニバーサル型ロジック。


現在、regとwireを選択する必要はありません。ロジックはどこでも使用されています。 シンセサイザーが何をする必要があるかを決定します(VHDLからのhi信号)。

タイプの初期化


SystemVerilogは、改善された型初期化機能を提供します。 今書く必要はありません
reg [63:0] data = 64'hFFFFFFFFFFFFFFFF; 


これだけができます:
 reg [63:0] data = '1; 


data = '0を書き込むと、ベクトルはゼロで初期化され、data =' bzは3番目の状態で初期化されます

列挙型。


最後に、ステートマシンは次のように記述できます。
 enum {WAITE, LOAD, STORE} State, NextState; always_ff @(posedge clock, negedge resetN) if (!resetN) State <= WAITE; else State <= NextState; always_comb begin case (State) WAITE: NextState = LOAD; LOAD: NextState = STORE; STORE: NextState = WAITE; endcase end 


さらに、列挙型に値を割り当てることができます。
 enum {ONE = 1,FIVE = 5,TEN = 10 } state; 


デフォルトでは、列挙型にはint値が割り当てられます。 ただし、このように書くことができます
//幅が1ビットの列挙型。
// 2つの状態のみを受け入れることができます
 enum bit {TRUE, FALSE} Boolean; //     2 . //     enum logic [1:0] {WAITE, LOAD, READY} state; 


列挙型の名前の値を出力するには、次の構成が使用されます。
 $display("\nCurrent state is %s (%b)", State.name); 


構造


次の方法で構造を宣言します。
 struct { int a, b; // 32-bit variables opcode_t opcode; // user-defined type logic [23:0] address; // 24-bit variable bit error; // 1-bit 2-state var. } Instruction_Word; 


構造体でサポートされるTypedef宣言
 typedef struct { // structure definition logic [31:0] a, b; logic [ 7:0] opcode; logic [23:0] address; } instruction_word_t; instruction_word_t IW; // structure allocation 


デフォルトでは、構造は展開された状態で表示されます。 packキーワードを使用すると、構造をパックできます。
 struct packed { logic valid; logic [ 7:0] tag; logic [31:0] data; } data_word; 


この形式では、ベクトルとして表されます。 したがって、そのような構成が可能です。
画像
 data_word.tag = 8'hf0; data_word[39:32] = 8'hf0; //    


連合


ユニオンは、さまざまな種類のデータを格納できるメモリ値ですが、一度に1つだけです。
構文は完全にCに似ています。
 union { int i; int unsigned u; } data; ... data.i = -5; $display("data is %d", data.i); data.u = -5; $display("now data is %d", data.u); 


実用的な最大の関心事は、パックドユニオンです。 固定タイプのビットを使用して、さまざまなタイプを表します。
あるタイプで記録された情報は、別のフォーム(別のタイプ)で読み取ることができます。 例:
 typedef struct packed { logic [15:0] source_address; logic [15:0] destination_address; logic [23:0] data; logic [ 7:0] opcode; } data_packet_t; union packed { data_packet_t packet; // packed structure logic [7:0][7:0] bytes; // packed array } dreg; 


画像
ユニオンはパッケージ化されているため、情報は調整され、ロジック[7:0]を介して記録されたデータはdata_packet_tを介して読み取ることができます。
 initial begin logic [15:0] src, dst; for (i = 0; i <= N; i = i + 1) begin dreg.bytes[i] <= byte_in; //store as bytes end src = dreg.source_address; dst = dreg.destination_address; end 


パックドアレイ


SystemVerilogを使用すると、多次元パック配列を作成できます
 logic [3:0][7:0] data; // 2-D packed array logic [1:0][3:0][7:0] data; // 3-D packed array 


IEEE標準では、これらの要素をメモリに保存する方法を定義しています。 たとえば、
 logic [3:0][7:0] data; // 2-D packed array 


画像
配列はベクトルとしてメモリに保存されるため、ベクトルと同じ操作をすべて使用できます
 logic [3:0][15:0] a, b, result; // packed arrays result = (a << 1) + b; 


ベクターへのアクセスは、要素単位で行うことも、次元全体を含めることもできます。 いわゆるスライス配列。
 logic [1:0][1:0][7:0] a; // 3-D packed array a[1][1][0] = 1'b0; //     a = 32'hF1A3C5E7; //     a[1][0][3:0] = 4'hF; //     a[0] = 16'hFACE; //    


直接アクセスまたはスライスを使用して、ある配列の内容を別の配列にコピーできます
 bit [1:0][15:0] a; //32  ,  bit  0  1 logic [3:0][7:0] b; //32  ,  logic O,1,Z,X logic [15:0] c; // 16   logic [39:0] d; // 40   b = a; //  32   32   c = a; //  16    d = a; //  8    


参照資料


1.www.asic-world.com/systemverilog
2. Stuart Sutherlandによる「SystemVerilog For Design Second Edition」

Source: https://habr.com/ru/post/J221265/


All Articles