Warp-LC/fpga/Prefetch.v

64 lines
1.2 KiB
Coq
Raw Normal View History

2021-11-01 16:12:16 +00:00
/* L2 Prefetch Buffer
2021-11-02 04:38:46 +00:00
* Prefetch tag RAM - 128 x 20 bits
2021-11-01 16:12:16 +00:00
* (1) Valid
2021-11-02 04:38:46 +00:00
* (19) Tag - {A[30], A[28], A[25:2]}
2021-11-01 16:12:16 +00:00
* Prefetch data RAM -
*/
module L2Prefetch(
input CLK,
input CPUCLKr,
input [27:2] RDA,
2021-11-02 04:38:46 +00:00
input RDFixed7k5SEL,
2021-11-01 16:12:16 +00:00
output [31:0] RDD,
output Match,
input [27:2] WRA,
input [31:0] WRD,
input WR,
input [3:0] WRM,
input CLR);
/* Read Address */
wire [18:0] RDATag = RDA[27:9];
wire [6:0] RDAIndex = RDA[8:2];
/* Write Address */
wire [18:0] WRATag = WRA[27:9];
wire [6:0] WRAIndex = WRA[8:2];
/* Tag & Valid */
wire [18:0] RDTag;
wire [18:0] TSTag;
wire RDValid;
wire TSValid;
wire RDMatch = RDValid && RDTag==RDATag;
wire TSMatch = TSValid && TSTag==WRATag;
2021-11-02 04:38:46 +00:00
PrefetchTagRAM tag (
2021-11-01 16:12:16 +00:00
.clk(CLK),
.we(WR && (WRM[3:0]==4'b1111 || TSMatch)),
.a(WRAIndex),
.d({~CLR, WRATag}),
.spo({TSValid, TSTag}),
.dpra(RDAIndex),
.dpo({RDValid, RDTag}));
2021-11-02 04:38:46 +00:00
assign Match = RDMatch || RDFixed7k5SEL;
2021-11-01 16:12:16 +00:00
/* Data */
2021-11-02 04:38:46 +00:00
PrefetchDataRAM data (
2021-11-01 16:12:16 +00:00
.clka(CLK),
.ena(~CPUCLKr),
2021-11-02 04:38:46 +00:00
.wea(4'b0),
2021-11-02 18:18:24 +00:00
.addra({RDFixed7k5SEL ? RDA[12:9] : 4'hF , RDAIndex}),
2021-11-02 04:38:46 +00:00
.dina(32'b0),
.douta(RDD[31:0]),
.clkb(CLK),
.enb(1'b0),
.web(WRM[3:0]),
2021-11-02 18:18:24 +00:00
.addrb({RDFixed7k5SEL ? WRA[12:9] : 4'hF , WRAIndex}),
2021-11-02 04:38:46 +00:00
.dinb(WRD[31:0]));
2021-11-01 16:12:16 +00:00
endmodule