performance refactoring - rebalanced stream buffers accross the device to enforce output buffering rule at compoments boudaries, finally resolved block ram R/W collusion discrepencies,
This commit is contained in:
@@ -14,13 +14,13 @@ module VX_ipdom_stack #(
|
||||
output wire empty,
|
||||
output wire full
|
||||
);
|
||||
localparam STACK_SIZE = 2 ** DEPTH;
|
||||
localparam ADDRW = $clog2(DEPTH);
|
||||
|
||||
reg is_part [STACK_SIZE-1:0];
|
||||
reg is_part [DEPTH-1:0];
|
||||
|
||||
reg [DEPTH-1:0] rd_ptr, wr_ptr;
|
||||
reg [ADDRW-1:0] rd_ptr, wr_ptr;
|
||||
|
||||
wire [WIDTH - 1:0] d1, d2;
|
||||
wire [WIDTH-1:0] d1, d2;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (reset) begin
|
||||
@@ -29,18 +29,17 @@ module VX_ipdom_stack #(
|
||||
end else begin
|
||||
if (push) begin
|
||||
rd_ptr <= wr_ptr;
|
||||
wr_ptr <= wr_ptr + DEPTH'(1);
|
||||
wr_ptr <= wr_ptr + ADDRW'(1);
|
||||
end else if (pop) begin
|
||||
wr_ptr <= wr_ptr - DEPTH'(is_part[rd_ptr]);
|
||||
rd_ptr <= rd_ptr - DEPTH'(is_part[rd_ptr]);
|
||||
wr_ptr <= wr_ptr - ADDRW'(is_part[rd_ptr]);
|
||||
rd_ptr <= rd_ptr - ADDRW'(is_part[rd_ptr]);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
VX_dp_ram #(
|
||||
.DATAW(WIDTH * 2),
|
||||
.SIZE(STACK_SIZE),
|
||||
.BUFFERED(0),
|
||||
.SIZE(DEPTH),
|
||||
.RWCHECK(0)
|
||||
) store (
|
||||
.clk(clk),
|
||||
@@ -48,7 +47,7 @@ module VX_ipdom_stack #(
|
||||
.raddr(rd_ptr),
|
||||
.wren(push),
|
||||
.byteen(1'b1),
|
||||
.rden(1'b1),
|
||||
.rden(pop),
|
||||
.din({q2, q1}),
|
||||
.dout({d2, d1})
|
||||
);
|
||||
@@ -64,6 +63,6 @@ module VX_ipdom_stack #(
|
||||
|
||||
assign d = p ? d1 : d2;
|
||||
assign empty = ~(| wr_ptr);
|
||||
assign full = ((STACK_SIZE-1) == wr_ptr);
|
||||
assign full = (ADDRW'(DEPTH-1) == wr_ptr);
|
||||
|
||||
endmodule
|
||||
Reference in New Issue
Block a user