Line 89... |
Line 89... |
end
|
end
|
|
|
reg [31:0] radrr [0:8];
|
reg [31:0] radrr [0:8];
|
reg wchi_stb, wchi_stb_r;
|
reg wchi_stb, wchi_stb_r;
|
reg [15:0] wchi_sel, wchi_sel_r;
|
reg [15:0] wchi_sel, wchi_sel_r;
|
reg [31:0] wchi_adr;
|
reg [31:0] wchi_adr, wchi_adr1;
|
reg [127:0] wchi_dat;
|
reg [127:0] wchi_dat;
|
|
|
mpmc10_quad_cache_line_t doutb [0:8];
|
mpmc10_quad_cache_line_t doutb [0:8];
|
mpmc10_quad_cache_line_t wrdata, wdata;
|
mpmc10_quad_cache_line_t wrdata, wdata;
|
|
|
reg [31:0] wadr;
|
reg [31:0] wadr;
|
|
reg [127:0] lddat1, lddat2;
|
|
reg [31:0] wadr2;
|
reg wstrb;
|
reg wstrb;
|
reg [$clog2(CACHE_ASSOC)-1:0] wway;
|
reg [$clog2(CACHE_ASSOC)-1:0] wway;
|
|
|
reg [CACHE_ASSOC-1:0] vbito0a;
|
reg [CACHE_ASSOC-1:0] vbito0a;
|
reg [CACHE_ASSOC-1:0] vbito1a;
|
reg [CACHE_ASSOC-1:0] vbito1a;
|
Line 138... |
Line 140... |
always_ff @(posedge ch4clk) radrr[4] <= ch4i.adr;
|
always_ff @(posedge ch4clk) radrr[4] <= ch4i.adr;
|
always_ff @(posedge ch5clk) radrr[5] <= ch5i.adr;
|
always_ff @(posedge ch5clk) radrr[5] <= ch5i.adr;
|
always_ff @(posedge ch6clk) radrr[6] <= ch6i.adr;
|
always_ff @(posedge ch6clk) radrr[6] <= ch6i.adr;
|
always_ff @(posedge ch7clk) radrr[7] <= ch7i.adr;
|
always_ff @(posedge ch7clk) radrr[7] <= ch7i.adr;
|
always_ff @(posedge wclk) radrr[8] <= ld.cyc ? ld.adr : wchi.adr;
|
always_ff @(posedge wclk) radrr[8] <= ld.cyc ? ld.adr : wchi.adr;
|
always_ff @(posedge wclk) wchi_adr <= radrr[8];
|
always_ff @(posedge wclk) wchi_adr1 <= wchi.adr;
|
|
always_ff @(posedge wclk) wchi_adr <= wchi_adr1;
|
|
|
always_ff @(posedge ch0clk) stb0 <= ch0i.stb;
|
always_ff @(posedge ch0clk) stb0 <= ch0i.stb;
|
always_ff @(posedge ch1clk) stb1 <= ch1i.stb;
|
always_ff @(posedge ch1clk) stb1 <= ch1i.stb;
|
always_ff @(posedge ch2clk) stb2 <= ch2i.stb;
|
always_ff @(posedge ch2clk) stb2 <= ch2i.stb;
|
always_ff @(posedge ch3clk) stb3 <= ch3i.stb;
|
always_ff @(posedge ch3clk) stb3 <= ch3i.stb;
|
Line 157... |
Line 160... |
always_comb rstb[3] <= ch3i.stb & ~ch3i.we;
|
always_comb rstb[3] <= ch3i.stb & ~ch3i.we;
|
always_comb rstb[4] <= ch4i.stb & ~ch4i.we;
|
always_comb rstb[4] <= ch4i.stb & ~ch4i.we;
|
always_comb rstb[5] <= ch5i.stb & ~ch5i.we;
|
always_comb rstb[5] <= ch5i.stb & ~ch5i.we;
|
always_comb rstb[6] <= ch6i.stb & ~ch6i.we;
|
always_comb rstb[6] <= ch6i.stb & ~ch6i.we;
|
always_comb rstb[7] <= ch7i.stb & ~ch7i.we;
|
always_comb rstb[7] <= ch7i.stb & ~ch7i.we;
|
always_comb rstb[8] <= ld.stb | wchi.stb;
|
always_comb rstb[8] <= ld.cyc ? ld.stb : wchi.stb;
|
|
|
always_ff @(posedge wclk) wchi_stb_r <= wchi.stb;
|
always_ff @(posedge wclk) wchi_stb_r <= wchi.stb;
|
always_ff @(posedge wclk) wchi_stb <= wchi_stb_r;
|
always_ff @(posedge wclk) wchi_stb <= wchi_stb_r;
|
always_ff @(posedge wclk) wchi_sel_r <= wchi.sel;
|
always_ff @(posedge wclk) wchi_sel_r <= wchi.sel;
|
always_ff @(posedge wclk) wchi_sel <= wchi_sel_r;
|
always_ff @(posedge wclk) wchi_sel <= wchi_sel_r;
|
Line 386... |
Line 389... |
if (ldcycd1) begin
|
if (ldcycd1) begin
|
b0 <= vbit[0][wadr[HIBIT:LOBIT]];
|
b0 <= vbit[0][wadr[HIBIT:LOBIT]];
|
b1 <= vbit[1][wadr[HIBIT:LOBIT]];
|
b1 <= vbit[1][wadr[HIBIT:LOBIT]];
|
b2 <= vbit[2][wadr[HIBIT:LOBIT]];
|
b2 <= vbit[2][wadr[HIBIT:LOBIT]];
|
end
|
end
|
if (|wchi_sel & wchi_stb & ~(ld.cyc|ldcycd1|ldcycd2))
|
if (|hit8a & |wchi_sel & wchi_stb & wchi.we & ~(ld.cyc|ldcycd1|ldcycd2))
|
vbit[wway][wadr[HIBIT:LOBIT]] <= 1'b1;
|
vbit[wway][wadr[HIBIT:LOBIT]] <= 1'b1;
|
else if (inv)
|
else if (inv)
|
vbit[wway][wadr[HIBIT:LOBIT]] <= 1'b0;
|
vbit[wway][wadr[HIBIT:LOBIT]] <= 1'b0;
|
end
|
end
|
|
|
Line 401... |
Line 404... |
begin
|
begin
|
if (ld.cyc)
|
if (ld.cyc)
|
wadr <= ld.adr;
|
wadr <= ld.adr;
|
else if (wchi_stb)
|
else if (wchi_stb)
|
wadr <= wchi_adr;
|
wadr <= wchi_adr;
|
wstrb <= ldcycd2 | (wchi_stb & |hit8a);
|
wstrb <= ldcycd2 | (wchi_stb & |hit8a & wchi.we);
|
end
|
end
|
reg [127:0] lddat1, lddat2;
|
|
reg [31:0] wadr2;
|
|
always_ff @(posedge wclk)
|
always_ff @(posedge wclk)
|
wadr2 <= wadr;
|
wadr2 <= wadr;
|
always_ff @(posedge wclk)
|
always_ff @(posedge wclk)
|
lddat1 <= ld.dat;
|
lddat1 <= ld.dat;
|
always_ff @(posedge wclk)
|
always_ff @(posedge wclk)
|
Line 441... |
Line 442... |
m0 <= wrdata.lines[0].modified;
|
m0 <= wrdata.lines[0].modified;
|
m1 <= wrdata.lines[1].modified;
|
m1 <= wrdata.lines[1].modified;
|
m2 <= wrdata.lines[2].modified;
|
m2 <= wrdata.lines[2].modified;
|
end
|
end
|
if (!(ld.cyc|ldcycd1|ldcycd2)) begin
|
if (!(ld.cyc|ldcycd1|ldcycd2)) begin
|
if (wchi_stb & hit8a[0])
|
if (wchi_stb & hit8a[0] & wchi.we)
|
wdata.lines[0].modified <= 1'b1;
|
wdata.lines[0].modified <= 1'b1;
|
else
|
else
|
wdata.lines[0].modified <= wrdata.lines[0].modified;
|
wdata.lines[0].modified <= wrdata.lines[0].modified;
|
if (wchi_stb & hit8a[1])
|
if (wchi_stb & hit8a[1] & wchi.we)
|
wdata.lines[1].modified <= 1'b1;
|
wdata.lines[1].modified <= 1'b1;
|
else
|
else
|
wdata.lines[1].modified <= wrdata.lines[0].modified;
|
wdata.lines[1].modified <= wrdata.lines[1].modified;
|
if (wchi_stb & hit8a[2])
|
if (wchi_stb & hit8a[2] & wchi.we)
|
wdata.lines[2].modified <= 1'b1;
|
wdata.lines[2].modified <= 1'b1;
|
else
|
else
|
wdata.lines[2].modified <= wrdata.lines[0].modified;
|
wdata.lines[2].modified <= wrdata.lines[2].modified;
|
if (wchi_stb & hit8a[3])
|
if (wchi_stb & hit8a[3] & wchi.we)
|
wdata.lines[3].modified <= 1'b1;
|
wdata.lines[3].modified <= 1'b1;
|
else
|
else
|
wdata.lines[3].modified <= wrdata.lines[0].modified;
|
wdata.lines[3].modified <= wrdata.lines[3].modified;
|
// Tag stays the same, it was hit
|
// Tag stays the same, it was hit
|
wdata.lines[0].tag <= wrdata.lines[0].tag;
|
wdata.lines[0].tag <= wrdata.lines[0].tag;
|
wdata.lines[1].tag <= wrdata.lines[1].tag;
|
wdata.lines[1].tag <= wrdata.lines[1].tag;
|
wdata.lines[2].tag <= wrdata.lines[2].tag;
|
wdata.lines[2].tag <= wrdata.lines[2].tag;
|
wdata.lines[3].tag <= wrdata.lines[3].tag;
|
wdata.lines[3].tag <= wrdata.lines[3].tag;
|
Line 475... |
Line 476... |
wdata.lines[1].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[1].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[2].data[g*8+7:g*8] <= wrdata.lines[1].data[g*8+7:g*8];
|
wdata.lines[2].data[g*8+7:g*8] <= wrdata.lines[1].data[g*8+7:g*8];
|
wdata.lines[3].data[g*8+7:g*8] <= wrdata.lines[2].data[g*8+7:g*8];
|
wdata.lines[3].data[g*8+7:g*8] <= wrdata.lines[2].data[g*8+7:g*8];
|
end
|
end
|
if (!(ld.cyc|ldcycd1|ldcycd2)) begin
|
if (!(ld.cyc|ldcycd1|ldcycd2)) begin
|
if (wchi_stb & hit8a[0])
|
if (wchi_stb & hit8a[0] & wchi.we)
|
wdata.lines[0].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[0].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[0].data[g*8+7:g*8];
|
else
|
else
|
wdata.lines[0].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[0].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
if (wchi_stb & hit8a[1])
|
if (wchi_stb & hit8a[1] & wchi.we)
|
wdata.lines[1].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[1].data[g*8+7:g*8];
|
wdata.lines[1].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[1].data[g*8+7:g*8];
|
else
|
else
|
wdata.lines[1].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[1].data[g*8+7:g*8] <= wrdata.lines[1].data[g*8+7:g*8];
|
if (wchi_stb & hit8a[2])
|
if (wchi_stb & hit8a[2] & wchi.we)
|
wdata.lines[2].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[2].data[g*8+7:g*8];
|
wdata.lines[2].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[2].data[g*8+7:g*8];
|
else
|
else
|
wdata.lines[2].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[2].data[g*8+7:g*8] <= wrdata.lines[2].data[g*8+7:g*8];
|
if (wchi_stb & hit8a[3])
|
if (wchi_stb & hit8a[3] & wchi.we)
|
wdata.lines[3].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[3].data[g*8+7:g*8];
|
wdata.lines[3].data[g*8+7:g*8] <= wchi_sel[g] ? wchi_dat[g*8+7:g*8] : wrdata.lines[3].data[g*8+7:g*8];
|
else
|
else
|
wdata.lines[3].data[g*8+7:g*8] <= wrdata.lines[0].data[g*8+7:g*8];
|
wdata.lines[3].data[g*8+7:g*8] <= wrdata.lines[3].data[g*8+7:g*8];
|
end
|
end
|
end
|
end
|
end
|
end
|
endgenerate
|
endgenerate
|
|
|
Line 505... |
Line 506... |
always_ff @(posedge wclk)
|
always_ff @(posedge wclk)
|
if (rst)
|
if (rst)
|
wack <= 1'b0;
|
wack <= 1'b0;
|
else begin
|
else begin
|
wack <= 1'b0;
|
wack <= 1'b0;
|
if (wchi.stb & ~ld.stb)
|
if (wchi.stb & ~ld.stb & wchi.we)
|
wack <= 1'b1;
|
wack <= 1'b1;
|
end
|
end
|
assign wcho.ack = wack & wchi.stb;
|
assign wcho.ack = wack & wchi.stb;
|
|
|
endmodule
|
endmodule
|