SystemVerilog:構造体と共用体

SystemVerilogから導入された「構造体(struct)と共用体(union)」のお話を少々。
考え方はC/C++と同じだと思っているのですが、違っていたらすいません。

○構造体(struct)
構造体は、複数の関連する変数をまとめたものです。
参考に「●C言語編 第33章 構造体

・構造体記述例 - tydedefを使って任意のデータ型にしています。

 1 module testbench();
 2   //構造体のデータ型
 3   typedef struct {
 4     int          i;
 5     int unsigned j;
 6     bit[3:0]     k; 
 7   } st_data_t;
 8 
 9   st_data_t st_data;
10 
11   initial begin
12     st_data.= -10;
13     $display("i=%d, j=%d, k=%d", st_data.i, st_data.j, st_data.k);  
14     st_data.= 10;
15     $display("i=%d, j=%d, k=%d", st_data.i, st_data.j, st_data.k);  
16     st_data.= 4'b0101;
17     $display("i=%d, j=%d, k=%d", st_data.i, st_data.j, st_data.k);  
18     $finish();
19   end
20 
21 endmodule


シミュレーション結果はこちら

i,j,kとも各変数に異なる値が入っているのがわかると思います。

○共用体(union)
共用体とは、2つ以上の変数が、同じメモリ領域を共有するという構造のこと。
参考に「●C言語編 第47章 共用体

・共用体記述例 - tydedefを使って任意のデータ型にしています。

 1 module testbench();
 2   //共用体のデータ型
 3   typedef union {
 4     int          i;
 5     int unsigned j;
 6     bit[3:0]     k; 
 7   } un_data_t;
 8 
 9   un_data_t un_data;
10 
11   initial begin
12     un_data.= -10;
13     $display("i=%d, j=%d, k=%d", un_data.i, un_data.j, un_data.k);  
14     un_data.= 10;
15     $display("i=%d, j=%d, k=%d", un_data.i, un_data.j, un_data.k);  
16     un_data.= 4'b0101;
17     $display("i=%d, j=%d, k=%d", un_data.i, un_data.j, un_data.k);  
18     $finish();
19   end
20 
21 endmodule


シミュレーション結果はこちら

i,j,kとも各変数に同じ値が入っているのがわかると思います。
ただ、最初の代入で「j」はマイナス値(-10)なので、unsigned化されて表示されます。

次回はPackedのお話を。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数