|
@@ -5,20 +5,21 @@
|
|
//
|
|
//
|
|
|
|
|
|
// Parametric synchronous RAM module, dual clock,
|
|
// Parametric synchronous RAM module, dual clock,
|
|
-// one read and one write port; output data registered
|
|
|
|
|
|
+// one read and one write port; output data not
|
|
|
|
+// registered
|
|
module dcqram
|
|
module dcqram
|
|
#(
|
|
#(
|
|
parameter wbits, // log2(size in words)
|
|
parameter wbits, // log2(size in words)
|
|
parameter width = 8
|
|
parameter width = 8
|
|
)
|
|
)
|
|
(
|
|
(
|
|
- input wclk,
|
|
|
|
- input wstb,
|
|
|
|
- input [wbits-1:0] waddr,
|
|
|
|
- input [width-1:0] wdata,
|
|
|
|
|
|
+ input wclk,
|
|
|
|
+ input wstb,
|
|
|
|
+ input [wbits-1:0] waddr,
|
|
|
|
+ input [width-1:0] wdata,
|
|
|
|
|
|
- input rclk,
|
|
|
|
- input [wbits-1:0] raddr,
|
|
|
|
|
|
+ input rclk,
|
|
|
|
+ input [wbits-1:0] raddr,
|
|
output [width-1:0] rdata
|
|
output [width-1:0] rdata
|
|
);
|
|
);
|
|
|
|
|
|
@@ -32,15 +33,11 @@ module dcqram
|
|
mem[waddr] <= wdata;
|
|
mem[waddr] <= wdata;
|
|
|
|
|
|
reg [wbits-1:0] raddr_q;
|
|
reg [wbits-1:0] raddr_q;
|
|
- reg [width-1:0] rdata_q;
|
|
|
|
|
|
|
|
- assign rdata = rdata_q;
|
|
|
|
|
|
+ assign rdata = mem[raddr_q];
|
|
|
|
|
|
always @(posedge rclk)
|
|
always @(posedge rclk)
|
|
- begin
|
|
|
|
- raddr_q <= raddr;
|
|
|
|
- rdata_q <= mem[raddr_q];
|
|
|
|
- end
|
|
|
|
|
|
+ raddr_q <= raddr;
|
|
endmodule // dcqram
|
|
endmodule // dcqram
|
|
|
|
|
|
module dcpktfifo
|
|
module dcpktfifo
|
|
@@ -70,6 +67,8 @@ module dcpktfifo
|
|
output reg [wbits-1:0] rnavail,
|
|
output reg [wbits-1:0] rnavail,
|
|
output reg rempty,
|
|
output reg rempty,
|
|
output reg rlast,
|
|
output reg rlast,
|
|
|
|
+ output reg remptyh, // Cleared only on abort/commit
|
|
|
|
+ output reg rlasth, // Cleared only on abort/commit
|
|
output reg rfull
|
|
output reg rfull
|
|
);
|
|
);
|
|
|
|
|
|
@@ -116,34 +115,34 @@ module dcpktfifo
|
|
wire rabort_w = rtrans ? rabort : 1'b0;
|
|
wire rabort_w = rtrans ? rabort : 1'b0;
|
|
wire [wbits-1:0] rcaddr_w = rtrans ? rcaddr : rtaddr;
|
|
wire [wbits-1:0] rcaddr_w = rtrans ? rcaddr : rtaddr;
|
|
|
|
|
|
- wire rstb_w = rstb & ~rempty;
|
|
|
|
- wire [wbits-1:0] rnused = r_wcaddr - (rtaddr + rstb_w);
|
|
|
|
|
|
+ wire rstb_w = rstb & ~rempty;
|
|
|
|
+
|
|
|
|
+ wire [wbits-1:0] rtaddr_next = (rabort_w & ~rcommit_w)
|
|
|
|
+ ? rcaddr : rtaddr + rstb_w;
|
|
|
|
+ wire [wbits-1:0] rnused_w = r_wcaddr - rtaddr_next;
|
|
|
|
|
|
always @(negedge rst_n or posedge rclk)
|
|
always @(negedge rst_n or posedge rclk)
|
|
if (~rst_n)
|
|
if (~rst_n)
|
|
begin
|
|
begin
|
|
- rtaddr <= 'b0;
|
|
|
|
- rcaddr <= 'b0;
|
|
|
|
- rnavail <= 'b0;
|
|
|
|
- rempty <= 1'b1;
|
|
|
|
- rlast <= 1'b1;
|
|
|
|
- rfull <= 1'b0;
|
|
|
|
|
|
+ rtaddr <= 'b0;
|
|
|
|
+ rcaddr <= 'b0;
|
|
|
|
+ rnavail <= 'b0;
|
|
|
|
+ rempty <= 1'b1;
|
|
|
|
+ rlast <= 1'b1;
|
|
|
|
+ rfull <= 1'b0;
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- if (rabort_w)
|
|
|
|
- rtaddr <= rcaddr_w;
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- rtaddr <= rtaddr + rstb_w;
|
|
|
|
- if (rcommit_w)
|
|
|
|
- rcaddr <= rtaddr + rstb_w;
|
|
|
|
- end // else: !if(rabort_w)
|
|
|
|
-
|
|
|
|
- rnavail <= rnused;
|
|
|
|
- rempty <= ~|rnused;
|
|
|
|
- rlast <= rnused < 2;
|
|
|
|
- rfull <= &rnused;
|
|
|
|
|
|
+ rtaddr <= rtaddr_next;
|
|
|
|
+ if (rcommit_w)
|
|
|
|
+ rcaddr <= rtaddr_next;
|
|
|
|
+
|
|
|
|
+ rnavail <= rnused_w;
|
|
|
|
+ rempty <= ~|rnused_w;
|
|
|
|
+ remptyh <= ~|rnused_w | (remptyh & ~(rcommit_w|rabort_w));
|
|
|
|
+ rlast <= ~|rnused_w[wbits-1:1];
|
|
|
|
+ rlasth <= ~|rnused_w[wbits-1:1] | (rlasth & ~(rcommit_w|rabort_w));
|
|
|
|
+ rfull <= &rnused_w;
|
|
end // else: !if(~rst_n)
|
|
end // else: !if(~rst_n)
|
|
|
|
|
|
// Address pointer synchronizers.
|
|
// Address pointer synchronizers.
|
|
@@ -175,8 +174,17 @@ module dcpktfifo
|
|
.wdata (wdata),
|
|
.wdata (wdata),
|
|
|
|
|
|
.rclk (rclk),
|
|
.rclk (rclk),
|
|
- .raddr (rtaddr),
|
|
|
|
|
|
+ .raddr (rtaddr_next),
|
|
.rdata (rdata)
|
|
.rdata (rdata)
|
|
);
|
|
);
|
|
|
|
|
|
|
|
+ // For debugging
|
|
|
|
+ (* preserve, noprune *) reg wflag;
|
|
|
|
+ always @(posedge wclk)
|
|
|
|
+ wflag <= (wflag | wstb_w) & ~(wcommit|wabort);
|
|
|
|
+
|
|
|
|
+ (* preserve, noprune *) reg rflag;
|
|
|
|
+ always @(posedge rclk)
|
|
|
|
+ rflag <= (rflag | rstb) & ~(rcommit|rabort);
|
|
|
|
+
|
|
endmodule // dcpktfifo
|
|
endmodule // dcpktfifo
|