SystemVerilog|【union】共用体について考える

Systemverilog
田中太郎
田中太郎

共用体についてまとめます

使い方

共用体は変数のビットを共用します

以下のように定義します

union {
    <型> <変数名>;
    <型> <変数名>;
} <構造体名>;

または、typedefを使用して以下のように定義します

typedef union {
    <型> <変数名>;
    <型> <変数名>;
} <型名>;
<型名> <構造体名>;

構造体の要素には以下のようにアクセスします

<構造体名>.<変数名>

サンプルコード

sample1.sv
module tb;
    union {
        bit [7:0] all;
        bit [1:0][3:0] div;
    } a;
    initial begin
        a.all = 8'b00100001;
        $display("%b", a.all);
        $display("%b", a.div[1]);
        $display("%b", a.div[0]);
        $finish;
    end
endmodule
// 出力
// 00100001
// 0010
// 0001
sample2.sv
module tb;
    typedef union {
        bit [7:0] all;
        bit [1:0][3:0] div;
    } a_t;
    initial begin
        a_t a;
        a.all = 8'b00100001;
        $display("%b", a.all);
        $display("%b", a.div[1]);
        $display("%b", a.div[0]);
        $finish;
    end
endmodule
// 出力
// 00100001
// 0010
// 0001
sample3.sv
module tb;
    union {
        bit [3:0] unsigned_data;
        bit signed [3:0] signed_data;
    } a;
    initial begin
        a.unsigned_data = 4'b0011;
        $display("%d", a.unsigned_data);
        $display("%d", a.signed_data);

        a.unsigned_data = 4'b1100;
        $display("%d", a.unsigned_data);
        $display("%d", a.signed_data);
        $finish;
    end
endmodule
// 出力
// 3
// 3
// 12
// -4

まとめ

共用体の使い方についてまとめました

コメント

タイトルとURLをコピーしました