union.sv 1.18 KB
Newer Older
1
typedef union packed {
2 3
    logic [4:0] x;
    logic [4:0] y;
4 5 6
} A;

typedef union packed {
7 8
    logic [4:0] x;
    logic [0:4] y;
9 10 11
} B;

typedef union packed {
12 13
    logic [4:0] x;
    logic [1:5] y;
14 15 16
} C;

typedef union packed {
17 18 19 20 21 22 23 24 25
    logic [4:0] x;
    struct packed {
        logic [2:0] a;
        logic [1:0] b;
    } y;
    struct packed {
        logic [1:0] a;
        logic [0:2] b;
    } z;
26 27 28 29 30 31 32 33 34
} D;

module wrap;

    A a;
    B b;
    C c;
    D d;

35 36
    localparam delay = 10;

37 38 39
    initial begin

        $monitor($time, " %b %b", a.x, a.y);
40 41
        a.x = 5'b01101; #delay;
        a.y = 5'b11101; #delay;
42 43

        $monitor($time, " %b %b", b.x, b.y);
44 45
        b.x = 5'b01101; #delay;
        b.y = 5'b11101; #delay;
46 47

        $monitor($time, " %b %b", c.x, c.y);
48 49
        c.x = 5'b01101; #delay;
        c.y = 5'b11101; #delay;
50 51 52

        $monitor($time, " %b %b {%b %b} %b {%b %b}", d.x, d.y, d.y.a, d.y.b,
            d.z, d.z.a, d.z.b);
53 54 55 56 57 58 59
        d.x = 5'b01101; #delay;
        d.y = '{ a: 3'b110, b: 2'b01 }; #delay;
        d.z = '{ b: 3'b110, a: 2'b01 }; #delay;
        d.y.a = 3'b010; #delay;
        d.y.b = 2'b10; #delay;
        d.z.a = 2'b11; #delay;
        d.z.b = 3'b101; #delay;
60 61 62 63

    end

endmodule