top.v 1.42 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
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