OpenCores
URL https://opencores.org/ocsvn/mpmc8/mpmc8/trunk

Subversion Repositories mpmc8

[/] [mpmc8/] [trunk/] [rtl/] [mpmc10/] [mpcm10_cache_wb.sv] - Diff between revs 5 and 7

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 5 Rev 7
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.