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

📄 afifo36_internal.v

📁 DDR2源代码 DDR2源代码 DDR2源代码
💻 V
📖 第 1 页 / 共 5 页
字号:
	end	else begin	    if ((fwft == 1'b0) && ((ALMOST_EMPTY_OFFSET < 1) || (ALMOST_EMPTY_OFFSET > addr_limit - 2))) begin		$display("Attribute Syntax Error : The attribute ALMOST_EMPTY_OFFSET on AFIFO36_INTERNAL instance %m is set to %d.  Legal values for this attribute are %d to %d", ALMOST_EMPTY_OFFSET, 1, addr_limit - 2);		$finish;	    end	    	    if ((fwft == 1'b0) && ((ALMOST_FULL_OFFSET < 1) || (ALMOST_FULL_OFFSET > addr_limit - 2))) begin		$display("Attribute Syntax Error : The attribute ALMOST_FULL_OFFSET on AFIFO36_INTERNAL instance %m is set to %d.  Legal values for this attribute are %d to %d", ALMOST_FULL_OFFSET, 1, addr_limit - 2);		$finish;	    end	end // else: !if(EN_SYN == "FALSE")			// DRC for fwft in sync mode	if (fwft == 1'b1 && EN_SYN == "TRUE") begin	    $display("DRC Error : First word fall through is not supported in synchronous mode on AFIFO36_INTERNAL instance %m.");	    $finish;	end	if (EN_SYN == "FALSE" && DO_REG == 0) begin	    $display("DRC Error : DO_REG = 0 is invalid when EN_SYN is set to FALSE on AFIFO36_INTERNAL instance %m.");	    $finish;	end		if (!(EN_ECC_WRITE == "TRUE" || EN_ECC_WRITE == "FALSE")) begin	    $display("Attribute Syntax Error : The attribute EN_ECC_WRITE on AFIFO36_INTERNAL instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", EN_ECC_WRITE);	    $finish;	end		if (!(EN_ECC_READ == "TRUE" || EN_ECC_READ == "FALSE")) begin	    $display("Attribute Syntax Error : The attribute EN_ECC_READ on AFIFO36_INTERNAL instance %m is set to %s.  Legal values for this attribute are TRUE or FALSE.", EN_ECC_READ);	    $finish;	end		if ((EN_ECC_READ == "TRUE" || EN_ECC_WRITE == "TRUE") && DATA_WIDTH != 72) begin	    $display("DRC Error : The attribute DATA_WIDTH must be set to 72 when AFIFO36_INTERNAL is configured in the ECC mode.");	    $finish;	end    end // initial begin        always @(rst_in or rden_in or wren_in) begin        if (rst_in ==1 && rden_in==1 )            $display("Warning : At time %t,  RDEN on AFIFO36_INTERNAL instance %m is high when RST is high. RDEN should be low during reset.", $stime);        if (rst_in ==1 && wren_in ==1)            $display("Warning : At time %t,  WREN on AFIFO36_INTERNAL instance %m is high when RST is high. WREN should be low during reset.", $stime);    end    always @(posedge rdclk_in) begin          rst_rdckreg[0] <= rst_in;          rst_rdckreg[1] <= rst_rdckreg[0] & rst_in;          rst_rdckreg[2] <= rst_rdckreg[1] & rst_in;    end    always @(posedge wrclk_in) begin          rst_wrckreg[0] <= rst_in ;          rst_wrckreg[1] <= rst_wrckreg[0] & rst_in;          rst_wrckreg[2] <= rst_wrckreg[1] & rst_in;    end    always @(rst_in)    begin       rst_tmp1 = rst_in;       rst_rdclk_flag = 0;       rst_wrclk_flag = 0;	if (rst_tmp1 == 0 && rst_tmp2 == 1) begin            if ((rst_rdckreg[2] & rst_rdckreg[1] & rst_rdckreg[0]) == 0) begin		$display("Error : At time %t,  RST high on AFIFO36_INTERNAL instance %m is short than three RDCLK clock cycles. RST high need be more that three RDCLK clock cycles.", $stime);		rst_rdclk_flag = 1;	    end            if ((rst_wrckreg[2] & rst_wrckreg[1] & rst_wrckreg[0]) == 0) begin		$display("Error : At time %t,  RST high on AFIFO36_INTERNAL instance %m is short than three WRCLK clock cycles. RST high need be more that three WRCLK clock cycles.", $stime);		rst_wrclk_flag = 1;	    end	   	    if ((rst_rdclk_flag | rst_wrclk_flag) == 1) begin	       assign do_out = 64'bx;	       assign dop_out = 8'bx;	       assign do_outreg = 64'bx;	       assign dop_outreg = 8'bx;	       assign full_out = 1'bX;	       assign empty_out = 1'bX;	       assign rderr_out = 1'bX;	       assign wrerr_out = 1'bX;	       assign sbiterr_out_out = 1'bx;	       assign dbiterr_out_out = 1'bx;	       assign eccparity_out = 8'bx;	       assign rdcount_out = 13'bx;	       assign rdcount_out_out = 13'bx;	       assign wr_addr_out = 13'bx;	       assign wr_addr = 13'bx;	       assign wr1_addr = 0;	       assign almostempty_int = 4'b1111;	       assign almostempty_out = 1'bx;	       assign almostfull_int = 4'b0000;	       assign almostfull_out = 1'bx;	       assign do_in = 64'b00000000000000000000000000000000;	       assign dop_in = 8'b0000;	       assign empty_ram = 4'b1111;	       assign full_int = 4'b0000;	       assign rd_addr = 0;	       assign rd_prefetch = 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_in == 1'b0 && rst_in == 1'b0) begin	       deassign do_out;	       deassign dop_out;	       deassign do_outreg;	       deassign dop_outreg;	       deassign full_out;	       deassign empty_out;	       deassign rderr_out;	       deassign wrerr_out;	       deassign sbiterr_out_out;	       deassign dbiterr_out_out;	       deassign eccparity_out;	       deassign rdcount_out;	       rdcount_out = 13'b0;	       deassign wr_addr;	       wr_addr = 13'b0;	       deassign rdcount_out_out;               deassign wr_addr_out;	       deassign wr1_addr;	       deassign almostempty_int;	       deassign almostempty_out;	       deassign almostfull_int;	       deassign almostfull_out;	       deassign do_in;	       deassign dop_in;	       deassign empty_ram;	       deassign full_int;	       deassign rd_addr;	       deassign rd_prefetch;	       deassign rdcount_flag;	       deassign rd_flag;	       deassign rdprefetch_flag;	       deassign wr_flag;	       deassign wr1_flag;	       deassign awr_flag;	   end       end       rst_tmp2 = rst_tmp1;    end    always @(posedge rdclk_in) begin	if (sync == 1'b1) begin	    do_outreg = do_out;	    dop_outreg = dop_out;	    if (rden_in == 1'b1) begin		if (empty_out == 1'b0) begin		    		    do_buf = mem[rdcount_out];		    dop_buf = memp[rdcount_out];		    		    // ECC decode		    if (EN_ECC_READ == "TRUE") begin	  			// regenerate parity			dopr_ecc[0] = do_buf[0]^do_buf[1]^do_buf[3]^do_buf[4]^do_buf[6]^do_buf[8]					  ^do_buf[10]^do_buf[11]^do_buf[13]^do_buf[15]^do_buf[17]^do_buf[19]					  ^do_buf[21]^do_buf[23]^do_buf[25]^do_buf[26]^do_buf[28]            				  ^do_buf[30]^do_buf[32]^do_buf[34]^do_buf[36]^do_buf[38] 		                          ^do_buf[40]^do_buf[42]^do_buf[44]^do_buf[46]^do_buf[48]		                          ^do_buf[50]^do_buf[52]^do_buf[54]^do_buf[56]^do_buf[57]^do_buf[59]		                          ^do_buf[61]^do_buf[63];			dopr_ecc[1] = do_buf[0]^do_buf[2]^do_buf[3]^do_buf[5]^do_buf[6]^do_buf[9]                                          ^do_buf[10]^do_buf[12]^do_buf[13]^do_buf[16]^do_buf[17]                                          ^do_buf[20]^do_buf[21]^do_buf[24]^do_buf[25]^do_buf[27]^do_buf[28]                                          ^do_buf[31]^do_buf[32]^do_buf[35]^do_buf[36]^do_buf[39]                                          ^do_buf[40]^do_buf[43]^do_buf[44]^do_buf[47]^do_buf[48]                                          ^do_buf[51]^do_buf[52]^do_buf[55]^do_buf[56]^do_buf[58]^do_buf[59]                                          ^do_buf[62]^do_buf[63];			dopr_ecc[2] = do_buf[1]^do_buf[2]^do_buf[3]^do_buf[7]^do_buf[8]^do_buf[9]                                          ^do_buf[10]^do_buf[14]^do_buf[15]^do_buf[16]^do_buf[17]                                          ^do_buf[22]^do_buf[23]^do_buf[24]^do_buf[25]^do_buf[29]                                          ^do_buf[30]^do_buf[31]^do_buf[32]^do_buf[37]^do_buf[38]^do_buf[39]                                          ^do_buf[40]^do_buf[45]^do_buf[46]^do_buf[47]^do_buf[48]                                          ^do_buf[53]^do_buf[54]^do_buf[55]^do_buf[56]                                          ^do_buf[60]^do_buf[61]^do_buf[62]^do_buf[63];				dopr_ecc[3] = do_buf[4]^do_buf[5]^do_buf[6]^do_buf[7]^do_buf[8]^do_buf[9]		                          ^do_buf[10]^do_buf[18]^do_buf[19]                                          ^do_buf[20]^do_buf[21]^do_buf[22]^do_buf[23]^do_buf[24]^do_buf[25]                                          ^do_buf[33]^do_buf[34]^do_buf[35]^do_buf[36]^do_buf[37]^do_buf[38]                                          ^do_buf[39]^do_buf[40]^do_buf[49]^do_buf[50]                                          ^do_buf[51]^do_buf[52]^do_buf[53]^do_buf[54]^do_buf[55]^do_buf[56];			dopr_ecc[4] = do_buf[11]^do_buf[12]^do_buf[13]^do_buf[14]^do_buf[15]^do_buf[16]                                          ^do_buf[17]^do_buf[18]^do_buf[19]^do_buf[20]^do_buf[21]^do_buf[22]				          ^do_buf[23]^do_buf[24]^do_buf[25]^do_buf[41]^do_buf[42]^do_buf[43]				          ^do_buf[44]^do_buf[45]^do_buf[46]^do_buf[47]^do_buf[48]^do_buf[49]				          ^do_buf[50]^do_buf[51]^do_buf[52]^do_buf[53]^do_buf[54]^do_buf[55]^do_buf[56];			dopr_ecc[5] = do_buf[26]^do_buf[27]^do_buf[28]^do_buf[29]				          ^do_buf[30]^do_buf[31]^do_buf[32]^do_buf[33]^do_buf[34]^do_buf[35]				          ^do_buf[36]^do_buf[37]^do_buf[38]^do_buf[39]^do_buf[40]				          ^do_buf[41]^do_buf[42]^do_buf[43]^do_buf[44]^do_buf[45]				          ^do_buf[46]^do_buf[47]^do_buf[48]^do_buf[49]^do_buf[50]				          ^do_buf[51]^do_buf[52]^do_buf[53]^do_buf[54]^do_buf[55]^do_buf[56];			dopr_ecc[6] = do_buf[57]^do_buf[58]^do_buf[59]				          ^do_buf[60]^do_buf[61]^do_buf[62]^do_buf[63];			dopr_ecc[7] = dop_buf[0]^dop_buf[1]^dop_buf[2]^dop_buf[3]^dop_buf[4]^dop_buf[5]				          ^dop_buf[6]^do_buf[0]^do_buf[1]^do_buf[2]^do_buf[3]^do_buf[4]				          ^do_buf[5]^do_buf[6]^do_buf[7]^do_buf[8]^do_buf[9]^do_buf[10]				          ^do_buf[11]^do_buf[12]^do_buf[13]^do_buf[14]^do_buf[15]^do_buf[16]				          ^do_buf[17]^do_buf[18]^do_buf[19]^do_buf[20]^do_buf[21]^do_buf[22]				          ^do_buf[23]^do_buf[24]^do_buf[25]^do_buf[26]^do_buf[27]^do_buf[28]				          ^do_buf[29]^do_buf[30]^do_buf[31]^do_buf[32]^do_buf[33]^do_buf[34]				          ^do_buf[35]^do_buf[36]^do_buf[37]^do_buf[38]^do_buf[39]^do_buf[40]				          ^do_buf[41]^do_buf[42]^do_buf[43]^do_buf[44]^do_buf[45]^do_buf[46]				          ^do_buf[47]^do_buf[48]^do_buf[49]^do_buf[50]^do_buf[51]^do_buf[52]				          ^do_buf[53]^do_buf[54]^do_buf[55]^do_buf[56]^do_buf[57]^do_buf[58]				          ^do_buf[59]^do_buf[60]^do_buf[61]^do_buf[62]^do_buf[63];			    			syndrome = dopr_ecc ^ dop_buf;	  			if (syndrome !== 0) begin			    if (syndrome[7]) begin  // dectect single bit error				ecc_bit_position = {do_buf[63:57], dop_buf[6], do_buf[56:26], dop_buf[5], do_buf[25:11], dop_buf[4], do_buf[10:4], dop_buf[3], do_buf[3:1], dop_buf[2], do_buf[0], dop_buf[1:0], dop_buf[7]};				ecc_bit_position[syndrome[6:0]] = ~ecc_bit_position[syndrome[6:0]]; // correct single bit error in the output 				di_in_ecc_corrected = {ecc_bit_position[71:65], ecc_bit_position[63:33], ecc_bit_position[31:17], ecc_bit_position[15:9], ecc_bit_position[7:5], ecc_bit_position[3]}; // correct single bit error in the memory				do_buf = di_in_ecc_corrected;							dip_in_ecc_corrected = {ecc_bit_position[0], ecc_bit_position[64], ecc_bit_position[32], ecc_bit_position[16], ecc_bit_position[8], ecc_bit_position[4], ecc_bit_position[2:1]}; // correct single bit error in the parity memory								dop_buf = dip_in_ecc_corrected;								dbiterr_out_out = 0;  // latch out in sync mode				sbiterr_out_out = 1;			    end			    else if (!syndrome[7]) begin  // double bit error				sbiterr_out_out = 0;				dbiterr_out_out = 1;				    			    end			end // if (syndrome !== 0)			else begin			    dbiterr_out_out = 0;			    sbiterr_out_out = 0;							end // else: !if(syndrome !== 0)			    		    end // if (EN_ECC_READ == "TRUE")		    // end ecc decode		    do_out = do_buf;		    dop_out = dop_buf;		    rdcount_out = (rdcount_out + 1) % addr_limit;		    		    if (rdcount_out == 0)			rdcount_flag = ~rdcount_flag;		end	    end 	    rderr_out = (rden_in == 1'b1) && (empty_out == 1'b1);	    	    	    if (wren_in == 1'b1) begin		empty_out = 1'b0;	    end	    else if (rdcount_out == wr_addr && rdcount_flag == wr_flag)		empty_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		almostempty_out = 1'b1;	    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		if (wr_addr <= wr_addr + ae_full || rdcount_flag == wr_flag)		    almostfull_out = 1'b0;	    end	end	else if (sync == 1'b0) begin	    dbiterr_out_out = dbiterr_out; // reg out in async mode	    sbiterr_out_out = sbiterr_out;	    	    rden_reg = rden_in;	    if (fwft == 1'b0) begin		if ((rden_reg == 1'b1) && (rd_addr != rdcount_out)) begin		    do_out = do_in;		    if (DATA_WIDTH != 4) 			dop_out = dop_in;		    rd_addr = (rd_addr + 1) % addr_limit;		    if (rd_addr == 0)			rd_flag = ~rd_flag;		end		if (((rd_addr == rdcount_out) && (empty_ram[3] == 1'b0)) ||		    ((rden_reg == 1'b1) && (empty_ram[1] == 1'b0))) begin		    do_buf = mem[rdcount_out];		    dop_buf = memp[rdcount_out];		    		// ECC decode		    if (EN_ECC_READ == "TRUE") begin			// regenerate parity			dopr_ecc[0] = do_buf[0]^do_buf[1]^do_buf[3]^do_buf[4]^do_buf[6]^do_buf[8]					  ^do_buf[10]^do_buf[11]^do_buf[13]^do_buf[15]^do_buf[17]^do_buf[19]					  ^do_buf[21]^do_buf[23]^do_buf[25]^do_buf[26]^do_buf[28]            				  ^do_buf[30]^do_buf[32]^do_buf[34]^do_buf[36]^do_buf[38]		                          ^do_buf[40]^do_buf[42]^do_buf[44]^do_buf[46]^do_buf[48]		                          ^do_buf[50]^do_buf[52]^do_buf[54]^do_buf[56]^do_buf[57]^do_buf[59]		                          ^do_buf[61]^do_buf[63];			dopr_ecc[1] = do_buf[0]^do_buf[2]^do_buf[3]^do_buf[5]^do_buf[6]^do_buf[9]                                          ^do_buf[10]^do_buf[12]^do_buf[13]^do_buf[16]^do_buf[17]                                          ^do_buf[20]^do_buf[21]^do_buf[24]^do_buf[25]^do_buf[27]^do_buf[28]                                          ^do_buf[31]^do_buf[32]^do_buf[35]^do_buf[36]^do_buf[39]                                          ^do_buf[40]^do_buf[43]^do_buf[44]^do_buf[47]^do_buf[48]                                          ^do_buf[51]^do_buf[52]^do_buf[55]^do_buf[56]^do_buf[58]^do_buf[59]                                          ^do_buf[62]^do_buf[63];			dopr_ecc[2] = do_buf[1]^do_buf[2]^do_buf[3]^do_buf[7]^do_buf[8]^do_buf[9]                                          ^do_buf[10]^do_buf[14]^do_buf[15]^do_buf[16]^do_buf[17]                                          ^do_buf[22]^do_buf[23]^do_buf[24]^do_buf[25]^do_buf[29]

⌨️ 快捷键说明

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