module bufctl (/*AUTOARG*/ // Outputs bufsize, // Inputs clk, xrst, wren, wsz, rden, rsz ); // public parameter P_PTR = 1; // queue pointer radix // private parameter P_DELAY = 1; parameter P_QSZ = P_PTR + 1; // queue size input clk ; // I : input xrst ; // I : input wren ; // I : input [P_QSZ-1:0] wsz ; // I : input rden ; // I : input [P_QSZ-1:0] rsz ; // I : output [P_QSZ-1:0] bufsize ; // O : reg [P_QSZ-1:0] r_bufsize ; assign bufsize = r_bufsize; wire [P_QSZ-1:0] w_wszminus ; // // Buffer control // // w_wszminus[P_QSZ-1:0] assign w_wszminus = wsz - rsz; // r_bufsize[P_QSZ-1:0] always @(posedge clk or negedge xrst) begin if (!xrst) r_bufsize <= #P_DELAY {P_QSZ{1'b0}}; else if (wren && rden) r_bufsize <= #P_DELAY r_bufsize + w_wszminus; else if (wren) r_bufsize <= #P_DELAY r_bufsize + wsz; else if (rden && (|r_bufsize)) r_bufsize <= #P_DELAY r_bufsize - rsz; end endmodule