📄 afifo36_internal.v
字号:
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 + -