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