module top(a,b,z);
    parameter width_a = 8;
    parameter width_b = 8;
    input [width_a-1:0] a;
    input [width_b-1:0] b;
    output [width_a-1:0] z;
    reg  [width_a-1:0] z;

    always@(a or b)
    begin
        div_u(a,b,z);
    end

    function [width_b:0] minus;
        input [width_b:0] in1;
        input [width_b:0] in2;
        minus = in1 - in2;
    endfunction

    task divmod;
        input [width_a-1:0] l;
        input [width_b-1:0] r;
        output [width_a-1:0] rdiv;
        output [width_b-1:0] rmod;

        parameter llen = width_a;
        parameter rlen = width_b;
        reg [(llen+rlen)-1:0] lbuf;
        reg [rlen:0] diff;
        integer i;
        begin
            lbuf = 0;
            lbuf[llen-1:0] = l;
            for(i=width_a-1;i>=0;i=i-1)
            begin
                diff = minus(lbuf[(llen+rlen)-1:llen-1], {1'b0,r});
                rdiv[i] = ~diff[rlen];
                if(diff[rlen] == 0)
                    lbuf[(llen+rlen)-1:llen-1] = diff;
                lbuf[(llen+rlen)-1:1] = lbuf[(llen+rlen)-2:0];
            end
        rmod = lbuf[(llen+rlen)-1:llen];
        end
    endtask

    task div_u;
        input [width_a-1:0] l;
        input [width_b-1:0] r;
        output [width_a-1:0] rdiv;

        reg [width_a-01:0] rdiv;    // <-- this line causes problem
        reg [width_b-1:0] rmod;
        begin
            divmod(l, r, rdiv, rmod);
        end
    endtask

endmodule