⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cache.v

📁 MIPS CPU tested in Icarus Verilog
💻 V
字号:
module Cache (Clock, Reset, Write, Data_in, Data_out, Hit);   parameter DATAWIDTH = 32; //Width of data   parameter INDEX = 12; //2^12 = 4k lines of 2 sets (1 word/set)   // ---------------------------- Input ports ----------------------------   input Clock;   input Reset;   input Write; //Write to Cache?   input Data_in; //Input Data   // ---------------------------- Output ports ----------------------------   output Data_out; //Output Data   output Hit; //Hit?   // ---------------------------- Type of Input ports ----------------------------   wire Clock;   wire Reset;   wire Write; //Write signal   wire [DATAWIDTH-1:0]       Data_in;   wire [INDEX-1:0] 	      Index;   wire [DATAWIDTH-INDEX-1:0] Tag_in;   wire 		      Valid_in;   // ---------------------------- Type of Output ports ----------------------------   reg [DATAWIDTH-1:0] 	      Data_out;   reg 			      Hit;   reg [DATAWIDTH-INDEX-1:0]  Tag_out;   reg 			      Valid;   reg [0:4095] 	      LRU; //Least recently used set in a line;   reg [105:0] 		      TEMPO;   parameter 		      SIZE = 53; // Valid + Tag + Data   reg [SIZE*2-1:0] 	      memcache [0:4095]; //Lines 0-4095   integer 		      i;   assign 		      Tag_in = Data_in[DATAWIDTH-1:INDEX];   assign 		      Index = Data_in[INDEX-1:0];   assign 		      Valid_in = (Index < 4096) ? 1 : 0;   always @ (posedge Clock)     begin	if(Reset == 1'b1)	  begin	     for(i=0;i<4096;i=i+1)	       begin		  memcache[i] = 0;		  LRU[i] = 0;	       end	  end	else	  begin	     if(Write == 1'b1)	       begin		  if(LRU[Index] == 1'b0) //Write on the least recently used item		    begin		       //Tag_out = memcache[51:32][Index];		       TEMPO = memcache[Index];		       Tag_out = TEMPO[104:85];		       Hit = (Tag_in == Tag_out);		       //Tag_in = Tag_out;		       //memcache[52:0][Index] = {Valid_in, Tag_in, Data_in};		       TEMPO[105:53] = {Valid_in, Tag_out, Data_in};		       memcache[Index] = TEMPO;		       Data_out = Data_in;		    end		  else		    begin		       TEMPO = memcache[Index];		       Tag_out = TEMPO[51:32];		       Hit = (Tag_in == Tag_out);		       //Tag_in = Tag_out;		       TEMPO[52:0] = {Valid_in, Tag_out, Data_in};		       Data_out = Data_in;		    end // else: !if(LRU[Index] == 1'b0)		  LRU[Index] = ~LRU[Index];	       end // if (Write == 1'b1)	     else // Write = 0, Read from cache	       begin		  if(LRU[Index] == 1'b1) //Read least least recently element		    begin		       TEMPO = memcache[Index];		       Data_out = TEMPO[84:53];		       Tag_out = TEMPO[104:85];		       Valid = TEMPO[105];		       Hit = (Tag_in == Tag_out);		    end		  else		    begin		       TEMPO = memcache[Index];		       Data_out = TEMPO[31:0];		       Tag_out = TEMPO[51:32];		       Valid = TEMPO[52];		       Hit = (Tag_in == Tag_out);		    end // else: !if(LRU[Index] == 1'b1)		  LRU[Index] = ~LRU[Index];	       end // else: !if(Write == 1'b1)	  end // else: !if(Reset == 1'b1)     end // always @ (posedge Clock)endmodule // Cache

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -