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

📄 afifo36_internal.v

📁 DDR2源代码 DDR2源代码 DDR2源代码
💻 V
📖 第 1 页 / 共 5 页
字号:
			dip_ecc[7] = dip_ecc[0]^dip_ecc[1]^dip_ecc[2]^dip_ecc[3]^dip_ecc[4]^dip_ecc[5]^dip_ecc[6]                                 ^di_in[0]^di_in[1]^di_in[2]^di_in[3]^di_in[4]^di_in[5]^di_in[6]^di_in[7]^di_in[8]^di_in[9]                                 ^di_in[10]^di_in[11]^di_in[12]^di_in[13]^di_in[14]^di_in[15]^di_in[16]^di_in[17]^di_in[18]^di_in[19]                                 ^di_in[20]^di_in[21]^di_in[22]^di_in[23]^di_in[24]^di_in[25]^di_in[26]^di_in[27]^di_in[28]^di_in[29]                                 ^di_in[30]^di_in[31]^di_in[32]^di_in[33]^di_in[34]^di_in[35]^di_in[36]^di_in[37]^di_in[38]^di_in[39]                                 ^di_in[40]^di_in[41]^di_in[42]^di_in[43]^di_in[44]^di_in[45]^di_in[46]^di_in[47]^di_in[48]^di_in[49]                                 ^di_in[50]^di_in[51]^di_in[52]^di_in[53]^di_in[54]^di_in[55]^di_in[56]^di_in[57]^di_in[58]^di_in[59]                                 ^di_in[60]^di_in[61]^di_in[62]^di_in[63];			eccparity_out = dip_ecc;			dip_int = dip_ecc;  // only 64 bits width					    end // if (EN_ECC_WRITE == "TRUE")		    else begin						dip_int = dip_in; // only 64 bits width					    end // else: !if(EN_ECC_WRITE == "TRUE")		    // end ecc encode		    mem[wr_addr] = di_in;		    memp[wr_addr] = dip_int;		    		    wr_addr = (wr_addr + 1) % addr_limit;		    if (wr_addr == 0)			wr_flag = ~wr_flag;		end			    end 	    wrerr_out = (wren_in == 1'b1) && (full_out == 1'b1);	    	    	    if (rden_in == 1'b1) begin		full_out = 1'b0;	    end	    else if (rdcount_out == wr_addr && rdcount_flag != wr_flag)		full_out = 1'b1;	    if ((((rdcount_out + ae_empty) < wr_addr) && (rdcount_flag == wr_flag)) || (((rdcount_out + ae_empty) < (wr_addr + addr_limit) && (rdcount_flag != wr_flag)))) begin				if (rdcount_out <= rdcount_out + ae_empty || rdcount_flag != wr_flag)		    almostempty_out = 1'b0;	    end	    if ((((rdcount_out + addr_limit) <= (wr_addr + ae_full)) && (rdcount_flag == wr_flag)) || ((rdcount_out <= (wr_addr + ae_full)) && (rdcount_flag != wr_flag))) begin		almostfull_out = 1'b1;	    end	    	end	else if (sync == 1'b0) begin	    wren_reg = wren_in;	    if (wren_reg == 1'b1 && (full_out == 1'b0)) begin				// ECC encode		if (EN_ECC_WRITE == "TRUE") begin		    		    dip_ecc[0] = di_in[0]^di_in[1]^di_in[3]^di_in[4]^di_in[6]^di_in[8]		                 ^di_in[10]^di_in[11]^di_in[13]^di_in[15]^di_in[17]^di_in[19]		                 ^di_in[21]^di_in[23]^di_in[25]^di_in[26]^di_in[28]            	                 ^di_in[30]^di_in[32]^di_in[34]^di_in[36]^di_in[38]		                 ^di_in[40]^di_in[42]^di_in[44]^di_in[46]^di_in[48]		                 ^di_in[50]^di_in[52]^di_in[54]^di_in[56]^di_in[57]^di_in[59]		                 ^di_in[61]^di_in[63];		    dip_ecc[1] = di_in[0]^di_in[2]^di_in[3]^di_in[5]^di_in[6]^di_in[9]                                 ^di_in[10]^di_in[12]^di_in[13]^di_in[16]^di_in[17]                                 ^di_in[20]^di_in[21]^di_in[24]^di_in[25]^di_in[27]^di_in[28]                                 ^di_in[31]^di_in[32]^di_in[35]^di_in[36]^di_in[39]                                 ^di_in[40]^di_in[43]^di_in[44]^di_in[47]^di_in[48]                                 ^di_in[51]^di_in[52]^di_in[55]^di_in[56]^di_in[58]^di_in[59]                                 ^di_in[62]^di_in[63];		    dip_ecc[2] = di_in[1]^di_in[2]^di_in[3]^di_in[7]^di_in[8]^di_in[9]                                 ^di_in[10]^di_in[14]^di_in[15]^di_in[16]^di_in[17]                                 ^di_in[22]^di_in[23]^di_in[24]^di_in[25]^di_in[29]                                 ^di_in[30]^di_in[31]^di_in[32]^di_in[37]^di_in[38]^di_in[39]                                 ^di_in[40]^di_in[45]^di_in[46]^di_in[47]^di_in[48]                                 ^di_in[53]^di_in[54]^di_in[55]^di_in[56]                                 ^di_in[60]^di_in[61]^di_in[62]^di_in[63];			    dip_ecc[3] = di_in[4]^di_in[5]^di_in[6]^di_in[7]^di_in[8]^di_in[9]			         ^di_in[10]^di_in[18]^di_in[19]                                 ^di_in[20]^di_in[21]^di_in[22]^di_in[23]^di_in[24]^di_in[25]                                 ^di_in[33]^di_in[34]^di_in[35]^di_in[36]^di_in[37]^di_in[38]^di_in[39]                                 ^di_in[40]^di_in[49]                                 ^di_in[50]^di_in[51]^di_in[52]^di_in[53]^di_in[54]^di_in[55]^di_in[56];		    dip_ecc[4] = di_in[11]^di_in[12]^di_in[13]^di_in[14]^di_in[15]^di_in[16]^di_in[17]^di_in[18]^di_in[19]                                 ^di_in[20]^di_in[21]^di_in[22]^di_in[23]^di_in[24]^di_in[25]                                 ^di_in[41]^di_in[42]^di_in[43]^di_in[44]^di_in[45]^di_in[46]^di_in[47]^di_in[48]^di_in[49]                                 ^di_in[50]^di_in[51]^di_in[52]^di_in[53]^di_in[54]^di_in[55]^di_in[56];		    dip_ecc[5] = di_in[26]^di_in[27]^di_in[28]^di_in[29]                                 ^di_in[30]^di_in[31]^di_in[32]^di_in[33]^di_in[34]^di_in[35]^di_in[36]^di_in[37]^di_in[38]^di_in[39]                                 ^di_in[40]^di_in[41]^di_in[42]^di_in[43]^di_in[44]^di_in[45]^di_in[46]^di_in[47]^di_in[48]^di_in[49]                                 ^di_in[50]^di_in[51]^di_in[52]^di_in[53]^di_in[54]^di_in[55]^di_in[56];		    dip_ecc[6] = di_in[57]^di_in[58]^di_in[59]			         ^di_in[60]^di_in[61]^di_in[62]^di_in[63];		    dip_ecc[7] = dip_ecc[0]^dip_ecc[1]^dip_ecc[2]^dip_ecc[3]^dip_ecc[4]^dip_ecc[5]^dip_ecc[6]                                 ^di_in[0]^di_in[1]^di_in[2]^di_in[3]^di_in[4]^di_in[5]^di_in[6]^di_in[7]^di_in[8]^di_in[9]                                 ^di_in[10]^di_in[11]^di_in[12]^di_in[13]^di_in[14]^di_in[15]^di_in[16]^di_in[17]^di_in[18]^di_in[19]                                 ^di_in[20]^di_in[21]^di_in[22]^di_in[23]^di_in[24]^di_in[25]^di_in[26]^di_in[27]^di_in[28]^di_in[29]                                 ^di_in[30]^di_in[31]^di_in[32]^di_in[33]^di_in[34]^di_in[35]^di_in[36]^di_in[37]^di_in[38]^di_in[39]                                 ^di_in[40]^di_in[41]^di_in[42]^di_in[43]^di_in[44]^di_in[45]^di_in[46]^di_in[47]^di_in[48]^di_in[49]                                 ^di_in[50]^di_in[51]^di_in[52]^di_in[53]^di_in[54]^di_in[55]^di_in[56]^di_in[57]^di_in[58]^di_in[59]                                 ^di_in[60]^di_in[61]^di_in[62]^di_in[63];		    eccparity_out = dip_ecc;		    dip_int = dip_ecc;  // only 64 bits width					end // if (EN_ECC_WRITE == "TRUE")		else begin		    		    dip_int = dip_in; // only 64 bits width		    		end // else: !if(EN_ECC_WRITE == "TRUE")		// end ecc encode		mem[wr_addr] = di_in;		memp[wr_addr] = dip_int;				#1;		wr_addr = (wr_addr + 1) % addr_limit;		if (wr_addr == 0)		    awr_flag = ~awr_flag;		if (wr_addr == addr_limit - 1)		    wr_flag = ~wr_flag;	    end	    wrerr_out = (wren_reg == 1'b1) && (full_out == 1'b1);	    almostfull_out = almostfull_int[3];	    if ((((rdcount_out + addr_limit) <= (wr_addr + ae_full)) && (rdcount_flag == awr_flag)) || ((rdcount_out <= (wr_addr + ae_full)) && (rdcount_flag != awr_flag))) begin		almostfull_int[3] = 1'b1;		almostfull_int[2] = 1'b1;		almostfull_int[1] = 1'b1;		almostfull_int[0] = 1'b1;	    end	    else if (almostfull_int[2] == 1'b0) begin		if (wr_addr <= wr_addr + ae_full || rdcount_flag == awr_flag) begin		    almostfull_int[3] = almostfull_int[0];		    almostfull_int[0] = 1'b0;		    end	    end	    if ((((rdcount_out + ae_empty) < wr_addr) && (rdcount_flag == awr_flag)) || (((rdcount_out + ae_empty) < (wr_addr + addr_limit)) && (rdcount_flag != awr_flag))) begin		if (wren_reg == 1'b1) begin		    almostempty_int[2] = almostempty_int[1];		    almostempty_int[1] = 1'b0;		end	    end	    else begin		almostempty_int[2] = 1'b1;		almostempty_int[1] = 1'b1;	    end	    if (wren_reg == 1'b1 || full_out == 1'b1)		full_out = full_int[1];	    if (((rdcount_out == wr_addr) || (rdcount_out - 1 == wr_addr || (rdcount_out + addr_limit - 1 == wr_addr))) && almostfull_out) begin		full_int[1] = 1'b1;		full_int[0] = 1'b1;	    end	    else begin		full_int[1] = full_int[0];		full_int[0] = 0;	    end	    	end // if (sync == 1'b0)    end // always @ (posedge wrclk_in)        always @(do_out or dop_out or do_outreg or dop_outreg) begin	if (sync == 1)	    	    case (DO_REG)		0 : begin	                do_out_mux = do_out;		        dop_out_mux = dop_out;	            end		1 : begin		        do_out_mux = do_outreg;		        dop_out_mux = dop_outreg;	            end		default : begin	                      $display("Attribute Syntax Error : The attribute DO_REG on AFIFO36_INTERNAL instance %m is set to %2d.  Legal values for this attribute are 0 or 1.", DO_REG);	                      $finish;	                  end	    endcase	else begin	    do_out_mux = do_out;	    dop_out_mux = dop_out;	end // else: !if(sync == 1)	    end // always @ (do_out or dop_out or do_outreg or dop_outreg)        // matching HW behavior to X the unused output bits    assign do_out_out = (DATA_WIDTH == 4) ? {60'bx, do_out_mux[3:0]}                      : (DATA_WIDTH == 9) ? {56'bx, do_out_mux[7:0]}                      : (DATA_WIDTH == 18) ? {48'bx, do_out_mux[15:0]}                      : (DATA_WIDTH == 36) ? {32'bx, do_out_mux[31:0]}	              : (DATA_WIDTH == 72) ? do_out_mux                      : do_out_mux;    // matching HW behavior to X the unused output bits    assign dop_out_out = (DATA_WIDTH ==  9) ? {7'bx, dop_out_mux[0:0]}                       : (DATA_WIDTH == 18) ? {6'bx, dop_out_mux[1:0]}		       : (DATA_WIDTH == 36) ? {4'bx, dop_out_mux[3:0]}	               : (DATA_WIDTH == 72) ? dop_out_mux                       : 8'bx;        // matching HW behavior to pull up the unused output bits    always @(wr_addr) begin 	if (FIFO_SIZE == 18)	    case (DATA_WIDTH)		4 : wr_addr_out = {1'b1, wr_addr[11:0]};		9 : wr_addr_out = {2'b11, wr_addr[10:0]};		18 : wr_addr_out = {3'b111, wr_addr[9:0]};		36 : wr_addr_out = {4'hf, wr_addr[8:0]};		default : wr_addr_out = wr_addr;	    endcase // case(DATA_WIDTH)	else	    case (DATA_WIDTH)		4 : wr_addr_out = wr_addr;		9 : wr_addr_out = {1'b1, wr_addr[11:0]};		18 : wr_addr_out = {2'b11, wr_addr[10:0]};		36 : wr_addr_out = {3'b111, wr_addr[9:0]};		72 : wr_addr_out = {4'hf, wr_addr[8:0]};		default : wr_addr_out = wr_addr;	    endcase // case(DATA_WIDTH)    end // always @ (wr_addr)            // matching HW behavior to pull up the unused output bits    always @(rdcount_out) begin 	if (FIFO_SIZE == 18)	    case (DATA_WIDTH)		4 : rdcount_out_out = {1'b1, rdcount_out[11:0]};		9 : rdcount_out_out = {2'b11, rdcount_out[10:0]};		18 : rdcount_out_out = {3'b111, rdcount_out[9:0]};		36 : rdcount_out_out = {4'hf, rdcount_out[8:0]};		default : rdcount_out_out = rdcount_out;	    endcase // case(DATA_WIDTH)	else	    case (DATA_WIDTH)		4 : rdcount_out_out = rdcount_out;		9 : rdcount_out_out = {1'b1, rdcount_out[11:0]};		18 : rdcount_out_out = {2'b11, rdcount_out[10:0]};		36 : rdcount_out_out = {3'b111, rdcount_out[9:0]};		72 : rdcount_out_out = {4'hf, rdcount_out[8:0]};		default : rdcount_out_out = rdcount_out;	    endcase // case(DATA_WIDTH)	    end // always @ (rdcount_out)    end // if (SIM_MODE == "SAFE")    endgenerate    // end SAFE mode/*************************** FAST mode *********************************/    generate if (SIM_MODE == "FAST") begin    assign DO = do_out_mux;    assign DOP = dop_out_mux;    assign ALMOSTEMPTY = almostempty_out;    assign ALMOSTFULL = almostfull_out;    assign EMPTY = empty_out;    assign FULL = full_out;    assign RDERR = rderr_out;    assign WRERR = wrerr_out;        assign SBITERR = sbiterr_out_out;    assign DBITERR = dbiterr_out_out;    assign ECCPARITY = eccparity_out;    assign RDCOUNT = rdcount_out;    assign WRCOUNT = wr_addr;    always @(GSR)	if (GSR == 1'b1) begin	    assign do_out = 64'b0;	    assign dop_out = 8'b0;	    assign do_outreg = 64'b0;	    assign dop_outreg = 8'b0;	end	else if (GSR == 1'b0) begin	    deassign do_out;	    deassign dop_out;	    deassign do_outreg;	    deassign dop_outreg;	end    always @(GSR or RST)	if (GSR == 1'b1 || RST == 1'b1) begin	    assign almostempty_int = 4'b1111;	    assign almostempty_out = 1'b1;	    assign almostfull_int = 4'b0000;	    assign almostfull_out = 1'b0;	    assign do_in = 64'b00000000000000000000000000000000;	    assign dop_in = 8'b0000;	    assign empty_ram = 4'b1111;	    assign empty_out = 1'b1;	    assign full_int = 4'b0000;	    assign full_out = 1'b0;	    assign rdcount_out = 13'b0;	    assign rderr_out = 0;	    assign wrerr_out = 0;	    assign rd_addr = 0;	    assign rd_prefetch = 0;	    assign wr_addr = 0;	    assign wr1_addr = 0;	    assign rdcount_flag = 0;	    assign rd_flag = 0;	    assign rdprefetch_flag = 0;	    assign wr_flag = 0;	    assign wr1_flag = 0;	    assign awr_flag = 0;	end	else if (GSR == 1'b0 || RST == 1'b0) begin	    deassign almostempty_int;	    deassign almostempty_out;	    deassign almostfull_int;	    deassign almostfull_out;	    deassign do_in;	    deassign dop_in;	    deassign empty_ram;	    deassign empty_out;	    deassign full_int;	    deassign full_out;	    deassign rdcount_out;	    deassign rderr_out;	    deassign wrerr_out;	    deassign rd_addr;

⌨️ 快捷键说明

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