string_param.vh 1.43 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
`define COUNT_ONES(expr) (0 \
        + ((expr) >>  0 & 1'b1) + ((expr) >>  1 & 1'b1) + ((expr) >>  2 & 1'b1) + ((expr) >>  3 & 1'b1) \
        + ((expr) >>  4 & 1'b1) + ((expr) >>  5 & 1'b1) + ((expr) >>  6 & 1'b1) + ((expr) >>  7 & 1'b1) \
        + ((expr) >>  8 & 1'b1) + ((expr) >>  9 & 1'b1) + ((expr) >> 10 & 1'b1) + ((expr) >> 11 & 1'b1) \
        + ((expr) >> 12 & 1'b1) + ((expr) >> 13 & 1'b1) + ((expr) >> 14 & 1'b1) + ((expr) >> 15 & 1'b1) \
        + ((expr) >> 16 & 1'b1) + ((expr) >> 17 & 1'b1) + ((expr) >> 18 & 1'b1) + ((expr) >> 19 & 1'b1) \
        + ((expr) >> 20 & 1'b1) + ((expr) >> 21 & 1'b1) + ((expr) >> 22 & 1'b1) + ((expr) >> 23 & 1'b1) \
        + ((expr) >> 24 & 1'b1) + ((expr) >> 25 & 1'b1) + ((expr) >> 26 & 1'b1) + ((expr) >> 27 & 1'b1) \
        + ((expr) >> 28 & 1'b1) + ((expr) >> 29 & 1'b1) + ((expr) >> 30 & 1'b1) + ((expr) >> 31 & 1'b1) \
    )

module top;
    reg [31:0] data;

`define TEST(idx, pattern, in_width, out_width) \
    localparam p``idx = pattern; \
    wire [in_width - 1:0] i``idx; \
    wire [out_width - 1:0] o``idx; \
    assign i``idx = data[0+:in_width]; \
    Example #(p``idx, in_width) e``idx(i``idx, o``idx);

    `TEST(1, 5'b10101, 5, 3)
    `TEST(2, 10'b1110001111, 10, 7)

    integer i;
    initial begin
        data = 0;
        for (i = 0; i < 100; i = i + 1) begin
            data = 1664525 * data + 1013904223;
            #1 $display("%b %b %b", data, o1, o2);
        end
    end
endmodule