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

📄 lru_data_cache.v

📁 是一个用于soc的32bit risc核
💻 V
字号:
/********************************************************** MODULE:		Sub Level Least Recently Used Data Cache FILE NAME:	lru_data_cache.v VERSION:	1.0 DATE:		May 7th, 2002 AUTHOR:		Hossein Amidi COMPANY:	 CODE TYPE:	Register Transfer Level DESCRIPTION:	This module is the top level RTL code of LRU Data Cache verilog code.  It will instantiate the following blocks in the ASIC: 1)	Data Cache Way 0 2)	Data Cache Way 1 3)	Data Cache Way 2 4)	Data Cache Way 3 Hossein Amidi (C) April 2002*********************************************************/// DEFINES`timescale 1ns / 10ps // TOP MODULEmodule lru_data_cache(// Inputs						reset,						clk0,						cache_host_addr,						cache_host_cmd,						cache_request,						cache_host_datain,						cache_bus_grant,						cache_datain,						// Outputs						cache_host_dataout,						cache_hit,						cache_miss,						cache_bus_request,						cache_addr,						cache_cmd,						cache_dataout						);// Parameter`include        "parameter.v"// Inputsinput reset;input clk0;input [padd_size - 1 : 0]cache_host_addr;input [cmd_size  - 1 : 0]cache_host_cmd;input cache_request;input [data_size - 1 : 0]cache_host_datain;input cache_bus_grant;input [data_size - 1 : 0]cache_datain;// Outputsoutput [data_size - 1 : 0]cache_host_dataout;output cache_hit;output cache_miss;output cache_bus_request;output [padd_size - 1 : 0]cache_addr;output [cmd_size  - 1 : 0]cache_cmd;output [data_size - 1 : 0]cache_dataout;// Signal Declarationswire reset;wire clk0;wire [padd_size - 1 : 0]cache_host_addr;wire [cmd_size  - 1 : 0]cache_host_cmd;wire cache_request;wire [data_size - 1 : 0]cache_host_datain;wire cache_bus_grant;wire [data_size - 1 : 0]cache_datain;reg [data_size - 1 : 0]cache_host_dataout;reg cache_hit;reg cache_miss;wire cache_bus_request;reg [padd_size - 1 : 0]cache_addr;reg [cmd_size  - 1 : 0]cache_cmd;reg [data_size - 1 : 0]cache_dataout;wire [cache_line_size - 1 : 0]data_cache_datain_way0;wire [cache_line_size - 1 : 0]data_cache_datain_way1;wire [cache_line_size - 1 : 0]data_cache_datain_way2;wire [cache_line_size - 1 : 0]data_cache_datain_way3;wire [cache_line_size - 1 : 0]data_cache_dataout_way0;wire [cache_line_size - 1 : 0]data_cache_dataout_way1;wire [cache_line_size - 1 : 0]data_cache_dataout_way2;wire [cache_line_size - 1 : 0]data_cache_dataout_way3;wire cache_wr;reg  [cache_valid - 1 : 0]valid0;reg  [cache_valid - 1 : 0]valid1;reg  [cache_valid - 1 : 0]valid2;reg  [cache_valid - 1 : 0]valid3;wire [cache_tag - 1 : 0]tag;wire [cache_tag - 1 : 0]read_tag0;wire [cache_tag - 1 : 0]read_tag1;wire [cache_tag - 1 : 0]read_tag2;wire [cache_tag - 1 : 0]read_tag3;/********* Internal Register of Data cache configuration *********/reg [cache_reg_width - 1 : 0] cache_register [cache_reg_depth - 1 : 0];// Assignment statmentsassign cache_bus_request = cache_miss;assign cache_wr = (cache_host_cmd == 010) ? 1'b1 : 1'b0;assign tag = cache_host_addr[23:5];assign read_tag0 = data_cache_dataout_way0[50:32];assign read_tag1 = data_cache_dataout_way1[50:32];assign read_tag2 = data_cache_dataout_way2[50:32];assign read_tag3 = data_cache_dataout_way3[50:32];assign data_cache_datain_way0 = ({valid0,tag,cache_datain});assign data_cache_datain_way1 = ({valid1,tag,cache_datain});assign data_cache_datain_way2 = ({valid2,tag,cache_datain});assign data_cache_datain_way3 = ({valid3,tag,cache_datain});/********************************** Sub Level Instantiation *********************************/data_cache_way0 data_cache_way0_0 (// Input																.A(cache_host_addr[4:0]),																.CLK(clk0),																.D(data_cache_datain_way0),																.WE(cache_wr),																.SPO(data_cache_dataout_way0));data_cache_way1 data_cache_way1_0 (// Input																.A(cache_host_addr[4:0]),																.CLK(clk0),																.D(data_cache_datain_way1),																.WE(cache_wr),																.SPO(data_cache_dataout_way1));data_cache_way2 data_cache_way2_0 (// Input																.A(cache_host_addr[4:0]),																.CLK(clk0),																.D(data_cache_datain_way2),																.WE(cache_wr),																.SPO(data_cache_dataout_way2));data_cache_way3 data_cache_way3_0 (// Input																.A(cache_host_addr[4:0]),																.CLK(clk0),																.D(data_cache_datain_way3),																.WE(cache_wr),																.SPO(data_cache_dataout_way3));// Generate the LRU talbealways @(posedge reset or posedge clk0)begin	if(reset == 1'b1)	begin		valid0 <= 2'b00;		valid1 <= 2'b00;		valid2 <= 2'b10;		valid3 <= 2'b10;	end	else		if((cache_wr == 1'b1) && (valid0 == 2'b00))			valid0 <= 2'b01;		else		if((cache_wr == 1'b1) && (valid0 == 2'b01))			valid0 <= 2'b00;		else		if((cache_wr == 1'b1) && (valid1 == 2'b00))			valid1 <= 2'b01;		else		if((cache_wr == 1'b1) && (valid1 == 2'b01))			valid1 <= 2'b00;		else		if((cache_wr == 1'b1) && (valid2 == 2'b10))			valid2 <= 2'b11;		else		if((cache_wr == 1'b1) && (valid2 == 2'b11))			valid2 <= 2'b10;		else		if((cache_wr == 1'b1) && (valid3 == 2'b10))			valid3 <= 2'b11;		else		if((cache_wr == 1'b1) && (valid3 == 2'b11))			valid3 <= 2'b10;end// Check for cache way validity, if matches generate the cache hit signal// else generate cache miss signalalways @(posedge reset or posedge clk0)begin	if(reset == 1'b1)		cache_dataout <= 32'h0;	else	if((cache_request == 1'b1) && (cache_host_cmd == 001) && (read_tag0 == cache_host_addr[23:5]))	begin		cache_hit <= 1'b1;		cache_dataout <= data_cache_dataout_way0[31:0];	end	else	if((cache_request == 1'b1) && (cache_host_cmd == 001) && (read_tag1 == cache_host_addr[23:5]))	begin		cache_hit <= 1'b1;		cache_dataout <= data_cache_dataout_way1[31:0];	end	else	if((cache_request == 1'b1) && (cache_host_cmd == 001) && (read_tag2 == cache_host_addr[23:5]))	begin		cache_hit <= 1'b1;		cache_dataout <= data_cache_dataout_way2[31:0];	end	else	if((cache_request == 1'b1) && (cache_host_cmd == 001) && (read_tag3 == cache_host_addr[23:5]))	begin		cache_hit <= 1'b1;		cache_dataout <= data_cache_dataout_way3[31:0];	end	else	if((cache_request == 1'b1) && (cache_host_cmd == 001))	begin		cache_miss <= 1'b1;		cache_hit  <= 1'b0;		cache_dataout <= 32'h0;	end	else	begin		cache_miss <= 1'b0;		cache_hit  <= 1'b0;		cache_dataout <= 32'h0;	endend// Access to internal register by CPU address and command signals (write/read)always @(posedge reset or posedge clk0)begin	if(reset == 1'b1)	begin		cache_host_dataout <= 32'h0;		cache_register[0] <= 32'h0;		cache_register[1] <= 32'h0;		cache_register[2] <= 32'h0;		cache_register[3] <= 32'h0;		cache_register[4] <= 32'h0;		cache_register[5] <= 32'h0;		cache_register[6] <= 32'h0;		cache_register[7] <= 32'h0;	end	else	begin		if(cache_host_cmd == 3'b010)	// Write from Host to Cache internal Registers		begin			case (cache_host_addr)							24'h080010:	cache_register[0] <= cache_host_datain;	// Status Register				24'h080011:	cache_register[1] <= cache_host_datain;	// Read Master Start Address				24'h080012:	cache_register[2] <= cache_host_datain;	// Write Master Start Address				24'h080013:	cache_register[3] <= cache_host_datain;	// Length in Bytes				24'h080014:	cache_register[4] <= cache_host_datain;	// Reserved				24'h080015:	cache_register[5] <= cache_host_datain; 	// Reserved				24'h080016:	cache_register[6] <= cache_host_datain;	// Control				24'h080017:	cache_register[7] <= cache_host_datain; 	// Reserved			endcase		end		else		if(cache_host_cmd == 3'b001)	// Read from Cache internal Registers to Host		begin			case (cache_host_addr)							24'h080010:	cache_host_dataout <= cache_register[0];				24'h080011:	cache_host_dataout <= cache_register[1];				24'h080012:	cache_host_dataout <= cache_register[2];				24'h080013:	cache_host_dataout <= cache_register[3];				24'h080014:	cache_host_dataout <= cache_register[4];				24'h080015:	cache_host_dataout <= cache_register[5];				24'h080016:	cache_host_dataout <= cache_register[6];				24'h080017:	cache_host_dataout <= cache_register[7];			endcase		end	end	endalways @(posedge reset or posedge clk0)begin	if(reset == 1'b1)	begin		cache_addr <= 24'h0;		cache_cmd <= 3'h0;	end	else	begin		cache_addr <= cache_bus_grant & cache_host_addr;		cache_cmd <= cache_bus_grant & cache_host_cmd;	endendendmodule

⌨️ 快捷键说明

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