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