struct_part_select_param.sv 3.12 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 88 89 90 91 92 93 94 95 96 97 98 99 100 101
module Example;
    // The test is equivalent to the struct_part_select test, except that all of
    // the dimensions and indices have been replaced with parameters. This
    // ensures sv2v can generate reasonable output even when nothing can be
    // simplified down at the time of conversion.
    parameter ONE = 1;
    parameter TWO = 2;
    parameter THREE = 3;
    parameter FOUR = 4;
    parameter FIVE = 5;
    parameter SIX = 6;
    parameter SEVEN = 7;
    parameter EIGHT = 8;
    parameter NINE = 9;
    parameter TEN = 10;

    typedef struct packed {
        logic [TEN:FOUR] a;
        logic [ONE:THREE] bx;
        logic [THREE:ONE] by;
        logic [THREE:FOUR][FIVE:SEVEN] cw;
        logic [FOUR:THREE][FIVE:SEVEN] cx;
        logic [THREE:FOUR][SEVEN:FIVE] cy;
        logic [FOUR:THREE][SEVEN:FIVE] cz;
    } T;
    T t;
    initial begin
        $monitor("%2d %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b %b", $time,
            t, t.a, t.bx, t.by,
            t.cw, t.cw[THREE], t.cw[FOUR],
            t.cx, t.cx[THREE], t.cx[FOUR],
            t.cy, t.cy[THREE], t.cy[FOUR],
            t.cz, t.cz[THREE], t.cz[FOUR]
            );

        #1 t.a = 1;
        #1 t.a[FIVE+:TWO] = '1;
        #1 t.a[EIGHT-:THREE] = '1;
        #1 t.a[TEN] = 1;
        #1 t.a[SEVEN] = 0;

        #1 t.bx[ONE+:ONE] = 1;
        #1 t.bx[ONE:TWO] = 1;
        #1 t.bx[THREE] = 0;
        #1 t.bx[THREE-:TWO] = 1;
        #1 t.bx[TWO] = 0;

        #1 t.by[ONE+:ONE] = 1;
        #1 t.by[TWO:ONE] = 1;
        #1 t.by[THREE] = 0;
        #1 t.by[THREE-:TWO] = 1;
        #1 t.by[TWO] = 0;

        #1 t.cw[THREE][SIX+:ONE] = 1;
        #1 t.cw[THREE][SEVEN-:TWO] = 1;
        #1 t.cw[THREE][FIVE+:TWO] = 0;
        #1 t.cw[THREE][SIX:SEVEN] = 2'b10;
        #1 t.cw[THREE][SIX:SEVEN] = 2'b01;
        #1 t.cw[THREE:FOUR] = '1;
        #1 t.cw[FOUR][FIVE] = 0;
        #1 t.cw[FOUR][SIX:SEVEN] = 0;
        #1 t.cw[THREE+:TWO] = 6'b010011;
        #1 t.cw[FOUR-:TWO] = 6'b101011;

        #1 t.cx[THREE][SIX+:ONE] = 1;
        #1 t.cx[THREE][SEVEN-:TWO] = 1;
        #1 t.cx[THREE][FIVE+:TWO] = 0;
        #1 t.cx[THREE][SIX:SEVEN] = 2'b10;
        #1 t.cx[THREE][SIX:SEVEN] = 2'b01;
        #1 t.cx[FOUR:THREE] = '1;
        #1 t.cx[FOUR][FIVE] = 0;
        #1 t.cx[FOUR][SIX:SEVEN] = 0;
        #1 t.cx[THREE+:TWO] = 6'b010011;
        #1 t.cx[FOUR-:TWO] = 6'b101011;

        #1 t.cy[THREE][SIX+:ONE] = 1;
        #1 t.cy[THREE][SEVEN-:TWO] = 1;
        #1 t.cy[THREE][FIVE+:TWO] = 0;
        #1 t.cy[THREE][SEVEN:SIX] = 2'b10;
        #1 t.cy[THREE][SEVEN:SIX] = 2'b01;
        #1 t.cy[THREE:FOUR] = '1;
        #1 t.cy[FOUR][FIVE] = 0;
        #1 t.cy[FOUR][SEVEN:SIX] = 0;
        #1 t.cy[THREE+:TWO] = 6'b010011;
        #1 t.cy[FOUR-:TWO] = 6'b101011;

        #1 t.cz[THREE][SIX+:ONE] = 1;
        #1 t.cz[THREE][SEVEN-:TWO] = 1;
        #1 t.cz[THREE][FIVE+:TWO] = 0;
        #1 t.cz[THREE][SEVEN:SIX] = 2'b10;
        #1 t.cz[THREE][SEVEN:SIX] = 2'b01;
        #1 t.cz[FOUR:THREE] = '1;
        #1 t.cz[FOUR][FIVE] = 0;
        #1 t.cz[FOUR][SEVEN:SIX] = 0;
        #1 t.cz[THREE+:TWO] = 6'b010011;
        #1 t.cz[FOUR-:TWO] = 6'b101011;

    end
endmodule
module top;
endmodule