struct_scope.sv 1.91 KB
Newer Older
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
module top;
    typedef struct packed {
        logic x;
        logic [1:0] y;
    } A;
    typedef struct packed {
        logic [2:0] x;
        logic [3:0] y;
    } B;
    typedef struct packed {
        logic [4:0] x;
        logic [5:0] y;
        B z;
    } C;

    A a;
    B b;
    C c;

    generate
        begin : foo
            typedef struct packed {
                logic [6:0] x;
                logic [7:0] y;
            } B;
            typedef struct packed {
                logic [8:0] x;
                logic [9:0] y;
                B z;
            } D;

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

`define INSPECT_SIZE(expr) $display(`"expr -> %0d`", $bits(expr));
`define INSPECT_DATA(expr) $display(`"expr -> %b`", expr);
    initial begin
        `INSPECT_SIZE(a);
        `INSPECT_SIZE(a.x);
        `INSPECT_SIZE(a.y);

        `INSPECT_SIZE(b);
        `INSPECT_SIZE(b.x);
        `INSPECT_SIZE(b.y);

        `INSPECT_SIZE(c);
        `INSPECT_SIZE(c.x);
        `INSPECT_SIZE(c.y);
        `INSPECT_SIZE(c.z);
        `INSPECT_SIZE(c.z.x);
        `INSPECT_SIZE(c.z.y);

        `INSPECT_SIZE(foo.a);
        `INSPECT_SIZE(foo.a.x);
        `INSPECT_SIZE(foo.a.y);

        `INSPECT_SIZE(foo.b);
        `INSPECT_SIZE(foo.b.x);
        `INSPECT_SIZE(foo.b.y);

        `INSPECT_SIZE(foo.c);
        `INSPECT_SIZE(foo.c.x);
        `INSPECT_SIZE(foo.c.y);
        `INSPECT_SIZE(foo.c.z);
        `INSPECT_SIZE(foo.c.z.x);
        `INSPECT_SIZE(foo.c.z.y);

        `INSPECT_SIZE(foo.d);
        `INSPECT_SIZE(foo.d.x);
        `INSPECT_SIZE(foo.d.y);
        `INSPECT_SIZE(foo.d.z);
        `INSPECT_SIZE(foo.d.z.x);
        `INSPECT_SIZE(foo.d.z.y);

        `INSPECT_DATA(a);
        `INSPECT_DATA(b);
        `INSPECT_DATA(c);
        `INSPECT_DATA(foo.a);
        `INSPECT_DATA(foo.b);
        `INSPECT_DATA(foo.c);
        `INSPECT_DATA(foo.d);
    end
endmodule