stream.sv 3.72 KB
Newer Older
1 2 3 4 5 6 7 8
module top;

    // Derived from: https://www.amiq.com/consulting/2017/05/29/how-to-pack-data-using-systemverilog-streaming-operators/
    typedef struct packed {
        logic [3:0] addr;
        logic [3:0] data;
    } packet_t;
    initial begin
9
        logic [1:0] array[] = '{ 2'b10, 2'b01, 2'b11, 2'b00 };
10 11 12 13 14
        packet_t packet = {<<4{ {<<2{array}} }};
        $display("packet addr = %b", packet.addr);
        $display("packet data = %b", packet.data);
    end

15 16 17 18 19 20 21 22 23 24 25
    function automatic [23:0] indirect;
        input [23:0] inp;
        indirect = inp;
    endfunction

    task printer;
        input [23:0] inpA;
        input [23:0] inpB;
        $display("printer(%h, %h)", inpA, inpB);
    endtask

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
    initial begin
        logic [23:0] temp;

        temp = {>>byte{24'h060708}};
        $display("%h", temp);
        temp = {<<byte{24'h060708}};
        $display("%h", temp);

        temp = {>>bit{24'h060708}};
        $display("%h", temp);
        temp = {<<bit{24'h060708}};
        $display("%h", temp);

        temp = {>>7{24'h060708}};
        $display("%h", temp);
        temp = {<<7{24'h060708}};
        $display("%h", temp);

        temp = {>>7{20'h60708}};
        $display("%h", temp);
46 47
        temp = {<<7{20'h60708}};
        $display("%h", temp);
48 49 50 51 52

        temp = {>>7{16'h0708}};
        $display("%h", temp);
        temp = {<<7{16'h0708}};
        $display("%h", temp);
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

        temp = indirect({>>7{16'h0708}});
        $display("%h", temp);
        temp = indirect({<<7{16'h0708}});
        $display("%h", temp);

        printer({>>7{16'h0708}}, {<<7{16'h0708}});
    end

    reg [23:0] init_simple_stream_var = {<<7{16'h0718}};
    wire [23:0] init_simple_stream_net = {<<7{16'h0728}};
    reg [23:0] init_indirect_stream_var = indirect({<<7{16'h0738}});
    wire [23:0] init_indirect_stream_net = indirect({<<7{16'h0748}});

    reg [23:0] asgn_simple_stream_var;
    wire [23:0] asgn_simple_stream_net;
    reg [23:0] asgn_indirect_stream_var;
    wire [23:0] asgn_indirect_stream_net;
    initial asgn_simple_stream_var = {<<7{16'h0758}};
    assign asgn_simple_stream_net = {<<7{16'h0768}};
    initial asgn_indirect_stream_var = indirect({<<7{16'h0778}});
    assign asgn_indirect_stream_net = indirect({<<7{16'h0788}});

    initial begin
        #1;
        $display("%b", init_simple_stream_var);
        $display("%b", init_simple_stream_net);
        $display("%b", init_indirect_stream_var);
        $display("%b", init_indirect_stream_net);
        $display("%b", asgn_simple_stream_var);
        $display("%b", asgn_simple_stream_net);
        $display("%b", asgn_indirect_stream_var);
        $display("%b", asgn_indirect_stream_net);
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
    end

    task test_unpack;
        input logic [23:0] in;
        logic [0:0] i;
        logic [1:0] j;
        logic [2:0] k;
        logic [5:0] l;
        logic [11:0] m;
        {>>byte{i, j, k, l, m}} = in;
        $display("%b %b %b %b %b", i, j, k, l, m);
        {<<byte{i, j, k, l, m}} = in;
        $display("%b %b %b %b %b", i, j, k, l, m);
        {>>bit{i, j, k, l, m}} = in;
        $display("%b %b %b %b %b", i, j, k, l, m);
        {<<bit{i, j, k, l, m}} = in;
        $display("%b %b %b %b %b", i, j, k, l, m);
        {>>7{i, j, k, l, m}} = in;
        $display("%b %b %b %b %b", i, j, k, l, m);
        {<<7{i, j, k, l, m}} = in;
        $display("%b %b %b %b %b", i, j, k, l, m);
    endtask
    initial begin
        test_unpack(24'h060708);
        test_unpack(24'hC02375);
        test_unpack(24'h12E3B8);
    end

114 115 116 117 118 119 120 121 122 123 124 125 126
    logic [0:0] i;
    logic [1:0] j;
    logic [2:0] k;
    logic [5:0] l;
    logic [11:0] m;
    logic [23:0] in;
    assign {<<7{i, j, k, l, m}} = in;
    initial begin
        #1 in = 24'h060708;
        #1 in = 24'hC02375;
        #1 in = 24'h12E3B8;
    end

127
endmodule