📄 afifo36_internal.v
字号:
^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 = 0; sbiterr_out = 1; end else if (!syndrome[7]) begin // double bit error sbiterr_out = 0; dbiterr_out = 1; end end // if (syndrome !== 0) else begin dbiterr_out = 0; sbiterr_out = 0; end // else: !if(syndrome !== 0) end // if (EN_ECC_READ == "TRUE") // end ecc decode do_in = do_buf; dop_in = dop_buf; #1; rdcount_out = (rdcount_out + 1) % addr_limit; if (rdcount_out == 0) begin rdcount_flag = ~rdcount_flag; end end end if (fwft == 1'b1) begin if ((rden_reg == 1'b1) && (rd_addr != rd_prefetch)) begin rd_prefetch = (rd_prefetch + 1) % addr_limit; if (rd_prefetch == 0) rdprefetch_flag = ~rdprefetch_flag; end if ((rd_prefetch == rd_addr) && (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)) || ((rden_reg == 1'b0) && (empty_ram[1] == 1'b0) && (rd_addr == rdcount_out))) 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 = 0; sbiterr_out = 1; end else if (!syndrome[7]) begin // double bit error sbiterr_out = 0; dbiterr_out = 1; end end // if (syndrome !== 0) else begin dbiterr_out = 0; sbiterr_out = 0; end // else: !if(syndrome !== 0) end // if (EN_ECC_READ == "TRUE") // end ecc decode do_in = do_buf; dop_in = dop_buf; #1; rdcount_out = (rdcount_out + 1) % addr_limit; if (rdcount_out == 0) rdcount_flag = ~rdcount_flag; end end // if (fwft == 1'b1) rderr_out = (rden_reg == 1'b1) && (empty_out == 1'b1); almostempty_out = almostempty_int[3]; if ((((rdcount_out + ae_empty) >= wr_addr) && (rdcount_flag == awr_flag)) || (((rdcount_out + ae_empty) >= (wr_addr + addr_limit)) && (rdcount_flag != awr_flag))) begin almostempty_int[3] = 1'b1; almostempty_int[2] = 1'b1; almostempty_int[1] = 1'b1; almostempty_int[0] = 1'b1; end else if (almostempty_int[2] == 1'b0) begin if (rdcount_out <= rdcount_out + ae_empty || rdcount_flag != awr_flag) begin almostempty_int[3] = almostempty_int[0]; almostempty_int[0] = 1'b0; end end if ((((rdcount_out + addr_limit) > (wr_addr + ae_full)) && (rdcount_flag == awr_flag)) || ((rdcount_out > (wr_addr + ae_full)) && (rdcount_flag != awr_flag))) begin if (((rden_reg == 1'b1) && (empty_out == 1'b0)) || ((((rd_addr + 1) % addr_limit) == rdcount_out) && (almostfull_int[1] == 1'b1))) begin almostfull_int[2] = almostfull_int[1]; almostfull_int[1] = 1'b0; end end else begin almostfull_int[2] = 1'b1; almostfull_int[1] = 1'b1; end if (fwft == 1'b0) begin if ((rdcount_out == rd_addr) && (rdcount_flag == rd_flag)) begin empty_out = 1'b1; end else begin empty_out = 1'b0; end end // if (fwft == 1'b0) else if (fwft == 1'b1) begin if ((rd_prefetch == rd_addr) && (rdprefetch_flag == rd_flag)) begin empty_out = 1'b1; end else begin empty_out = 1'b0; end end if ((rdcount_out == wr_addr) && (rdcount_flag == awr_flag)) begin empty_ram[2] = 1'b1; empty_ram[1] = 1'b1; empty_ram[0] = 1'b1; end else begin empty_ram[2] = empty_ram[1]; empty_ram[1] = empty_ram[0]; empty_ram[0] = 1'b0; end if ((rdcount_out == wr1_addr) && (rdcount_flag == wr1_flag)) begin empty_ram[3] = 1'b1; end else begin empty_ram[3] = 1'b0; end wr1_addr = wr_addr; wr1_flag = awr_flag; end // if (sync == 1'b0) end // always @ (posedge rdclk_in) always @(posedge wrclk_in) begin if (sync == 1'b1) begin if (wren_in == 1'b1) begin if (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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -