added define for UART-debugging of BIST exclusively

This commit is contained in:
AngeloJacobo 2025-12-27 13:01:19 +08:00
parent 356c6cc1a2
commit 0b3bb30fae
1 changed files with 62 additions and 59 deletions

View File

@ -50,6 +50,7 @@
// `define UART_DEBUG_READ_LEVEL // `define UART_DEBUG_READ_LEVEL
// `define UART_DEBUG_WRITE_LEVEL // `define UART_DEBUG_WRITE_LEVEL
// `define UART_DEBUG_ALIGN // `define UART_DEBUG_ALIGN
// `define UART_DEBUG_BIST
`ifdef UART_DEBUG_READ_LEVEL `ifdef UART_DEBUG_READ_LEVEL
@ -58,6 +59,8 @@
`define UART_DEBUG `define UART_DEBUG
`elsif UART_DEBUG_ALIGN `elsif UART_DEBUG_ALIGN
`define UART_DEBUG `define UART_DEBUG
`elsif UART_DEBUG_BIST
`define UART_DEBUG
`endif `endif
module ddr3_controller #( module ddr3_controller #(
@ -1840,62 +1843,62 @@ module ddr3_controller #(
// pending request on stage 1 // pending request on stage 1
// if DDR3_CLK_PERIOD == 1250, then remove this anticipate stage 1 to pass timing // if DDR3_CLK_PERIOD == 1250, then remove this anticipate stage 1 to pass timing
// if(DDR3_CLK_PERIOD != 1_250) begin if(DDR3_CLK_PERIOD != 1_250) begin
// if(stage1_pending && !((stage1_next_bank == stage2_bank) && stage2_pending)) begin if(stage1_pending && !((stage1_next_bank == stage2_bank) && stage2_pending)) begin
// //stage 1 will mainly be for anticipation (if next requests need to jump to new bank then //stage 1 will mainly be for anticipation (if next requests need to jump to new bank then
// //anticipate the precharging and activate of that next bank, BUT it can also handle //anticipate the precharging and activate of that next bank, BUT it can also handle
// //precharge and activate of CURRENT wishbone request. //precharge and activate of CURRENT wishbone request.
// //Anticipate will depend if the request is on the end of the row //Anticipate will depend if the request is on the end of the row
// // and must start the anticipation. For example if we have 10 rows in a bank: // and must start the anticipation. For example if we have 10 rows in a bank:
// //[R][R][R][R][R][R][R][A][A][A] -> [next bank] //[R][R][R][R][R][R][R][A][A][A] -> [next bank]
// // //
// //R = Request, A = Anticipate //R = Request, A = Anticipate
// //Unless we are near the third to the last column, stage 1 will //Unless we are near the third to the last column, stage 1 will
// //issue Activate and Precharge on the CURRENT bank. Else, stage //issue Activate and Precharge on the CURRENT bank. Else, stage
// //1 will issue Activate and Precharge for the NEXT bank //1 will issue Activate and Precharge for the NEXT bank
// // Thus stage 1 anticipate makes sure smooth burst operation that jumps banks // Thus stage 1 anticipate makes sure smooth burst operation that jumps banks
// if(bank_status_q[stage1_next_bank] && bank_active_row_q[stage1_next_bank] != stage1_next_row && delay_before_precharge_counter_q[stage1_next_bank] ==0 && !precharge_slot_busy) begin if(bank_status_q[stage1_next_bank] && bank_active_row_q[stage1_next_bank] != stage1_next_row && delay_before_precharge_counter_q[stage1_next_bank] ==0 && !precharge_slot_busy) begin
// //set-up delay before read and write //set-up delay before read and write
// delay_before_activate_counter_d[stage1_next_bank] = PRECHARGE_TO_ACTIVATE_DELAY; delay_before_activate_counter_d[stage1_next_bank] = PRECHARGE_TO_ACTIVATE_DELAY;
// if(DUAL_RANK_DIMM[0]) begin if(DUAL_RANK_DIMM[0]) begin
// cmd_d[PRECHARGE_SLOT] = {!stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], CMD_PRE[2:0], cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank[BA_BITS-1:0], { {{ROW_BITS-32'd11}{1'b0}} , 1'b0 , stage1_next_row[(DUAL_RANK_DIMM[0]? 9 : 8):0] } }; cmd_d[PRECHARGE_SLOT] = {!stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], CMD_PRE[2:0], cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank[BA_BITS-1:0], { {{ROW_BITS-32'd11}{1'b0}} , 1'b0 , stage1_next_row[(DUAL_RANK_DIMM[0]? 9 : 8):0] } };
// end end
// else begin else begin
// cmd_d[PRECHARGE_SLOT] = {1'b0, CMD_PRE[2:0], cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank, { {{ROW_BITS-32'd11}{1'b0}} , 1'b0 , stage1_next_row[9:0] } }; cmd_d[PRECHARGE_SLOT] = {1'b0, CMD_PRE[2:0], cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank, { {{ROW_BITS-32'd11}{1'b0}} , 1'b0 , stage1_next_row[9:0] } };
// end end
// bank_status_d[stage1_next_bank] = 1'b0; bank_status_d[stage1_next_bank] = 1'b0;
// end //end of anticipate precharge end //end of anticipate precharge
// //anticipated bank is idle so do activate //anticipated bank is idle so do activate
// else if(!bank_status_q[stage1_next_bank] && delay_before_activate_counter_q[stage1_next_bank] == 0 && !activate_slot_busy) begin else if(!bank_status_q[stage1_next_bank] && delay_before_activate_counter_q[stage1_next_bank] == 0 && !activate_slot_busy) begin
// // must meet TRRD (activate to activate delay) // must meet TRRD (activate to activate delay)
// for(index=0; index < (1<<(BA_BITS+DUAL_RANK_DIMM)); index=index+1) begin //the activate to activate delay applies to all banks for(index=0; index < (1<<(BA_BITS+DUAL_RANK_DIMM)); index=index+1) begin //the activate to activate delay applies to all banks
// if(delay_before_activate_counter_d[index] <= ACTIVATE_TO_ACTIVATE_DELAY) begin // if delay is > ACTIVATE_TO_ACTIVATE_DELAY, then updating it to the lower delay will cause the previous delay to be violated if(delay_before_activate_counter_d[index] <= ACTIVATE_TO_ACTIVATE_DELAY) begin // if delay is > ACTIVATE_TO_ACTIVATE_DELAY, then updating it to the lower delay will cause the previous delay to be violated
// delay_before_activate_counter_d[index] = ACTIVATE_TO_ACTIVATE_DELAY; delay_before_activate_counter_d[index] = ACTIVATE_TO_ACTIVATE_DELAY;
// end end
// end end
// delay_before_precharge_counter_d[stage1_next_bank] = ACTIVATE_TO_PRECHARGE_DELAY; delay_before_precharge_counter_d[stage1_next_bank] = ACTIVATE_TO_PRECHARGE_DELAY;
// //set-up delay before read and write //set-up delay before read and write
// if(delay_before_read_counter_d[stage1_next_bank] <= ACTIVATE_TO_READ_DELAY) begin // if current delay is > ACTIVATE_TO_READ_DELAY, then updating it to the lower delay will cause the previous delay to be violated if(delay_before_read_counter_d[stage1_next_bank] <= ACTIVATE_TO_READ_DELAY) begin // if current delay is > ACTIVATE_TO_READ_DELAY, then updating it to the lower delay will cause the previous delay to be violated
// delay_before_read_counter_d[stage1_next_bank] = ACTIVATE_TO_READ_DELAY; delay_before_read_counter_d[stage1_next_bank] = ACTIVATE_TO_READ_DELAY;
// end end
// if(delay_before_write_counter_d[stage1_next_bank] <= ACTIVATE_TO_WRITE_DELAY) begin // if current delay is > ACTIVATE_TO_WRITE_DELAY, then updating it to the lower delay will cause the previous delay to be violated if(delay_before_write_counter_d[stage1_next_bank] <= ACTIVATE_TO_WRITE_DELAY) begin // if current delay is > ACTIVATE_TO_WRITE_DELAY, then updating it to the lower delay will cause the previous delay to be violated
// delay_before_write_counter_d[stage1_next_bank] = ACTIVATE_TO_WRITE_DELAY; delay_before_write_counter_d[stage1_next_bank] = ACTIVATE_TO_WRITE_DELAY;
// end end
// if(DUAL_RANK_DIMM[0]) begin if(DUAL_RANK_DIMM[0]) begin
// cmd_d[ACTIVATE_SLOT] = {!stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], CMD_ACT[2:0] , cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank[BA_BITS-1:0] , stage1_next_row[(DUAL_RANK_DIMM[0]? ROW_BITS-1 : ROW_BITS-2):0]}; cmd_d[ACTIVATE_SLOT] = {!stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], stage1_next_bank[(DUAL_RANK_DIMM[0]? BA_BITS : 0)], CMD_ACT[2:0] , cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank[BA_BITS-1:0] , stage1_next_row[(DUAL_RANK_DIMM[0]? ROW_BITS-1 : ROW_BITS-2):0]};
// end end
// else begin else begin
// cmd_d[ACTIVATE_SLOT] = {1'b0, CMD_ACT[2:0] , cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank , stage1_next_row}; cmd_d[ACTIVATE_SLOT] = {1'b0, CMD_ACT[2:0] , cmd_odt, cmd_ck_en, cmd_reset_n, stage1_next_bank , stage1_next_row};
// end end
// bank_status_d[stage1_next_bank] = 1'b1; bank_status_d[stage1_next_bank] = 1'b1;
// bank_active_row_d[stage1_next_bank] = stage1_next_row; bank_active_row_d[stage1_next_bank] = stage1_next_row;
// end //end of anticipate activate end //end of anticipate activate
// end //end of stage1 anticipate end //end of stage1 anticipate
// end end
// control stage 1 stall // control stage 1 stall
if(stage1_pending) begin //raise stall only if stage2 will still be busy next clock if(stage1_pending) begin //raise stall only if stage2 will still be busy next clock
@ -3071,7 +3074,7 @@ BITSLIP_DQS_TRAIN_3: if(train_delay == 0) begin //train again the ISERDES to cap
write_test_address_counter <= 0; write_test_address_counter <= 0;
end end
state_calibrate <= BURST_READ; state_calibrate <= BURST_READ;
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE BURST WRITE (PER BYTE): BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a}; uart_text <= {"DONE BURST WRITE (PER BYTE): BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a};
state_calibrate <= WAIT_UART; state_calibrate <= WAIT_UART;
@ -3094,7 +3097,7 @@ BITSLIP_DQS_TRAIN_3: if(train_delay == 0) begin //train again the ISERDES to cap
write_test_address_counter <= 0; write_test_address_counter <= 0;
end end
state_calibrate <= BURST_READ; state_calibrate <= BURST_READ;
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE BURST WRITE (ALL BYTES): BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a}; uart_text <= {"DONE BURST WRITE (ALL BYTES): BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a};
state_calibrate <= WAIT_UART; state_calibrate <= WAIT_UART;
@ -3117,7 +3120,7 @@ BITSLIP_DQS_TRAIN_3: if(train_delay == 0) begin //train again the ISERDES to cap
read_test_address_counter <= 0; read_test_address_counter <= 0;
end end
state_calibrate <= RANDOM_WRITE; state_calibrate <= RANDOM_WRITE;
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE BURST READ: BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a}; uart_text <= {"DONE BURST READ: BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a};
state_calibrate <= WAIT_UART; state_calibrate <= WAIT_UART;
@ -3145,7 +3148,7 @@ BITSLIP_DQS_TRAIN_3: if(train_delay == 0) begin //train again the ISERDES to cap
write_test_address_counter <= 0; write_test_address_counter <= 0;
end end
state_calibrate <= RANDOM_READ; state_calibrate <= RANDOM_READ;
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE RANDOM WRITE: BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a}; uart_text <= {"DONE RANDOM WRITE: BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a};
state_calibrate <= WAIT_UART; state_calibrate <= WAIT_UART;
@ -3171,7 +3174,7 @@ BITSLIP_DQS_TRAIN_3: if(train_delay == 0) begin //train again the ISERDES to cap
read_test_address_counter <= 0; read_test_address_counter <= 0;
end end
state_calibrate <= ALTERNATE_WRITE_READ; state_calibrate <= ALTERNATE_WRITE_READ;
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE RANDOM READ: BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a}; uart_text <= {"DONE RANDOM READ: BIST_MODE=",hex_to_ascii(BIST_MODE),8'h0a};
state_calibrate <= WAIT_UART; state_calibrate <= WAIT_UART;
@ -3195,7 +3198,7 @@ ALTERNATE_WRITE_READ: if(!o_wb_stall_calib) begin
/* verilator lint_on WIDTHEXPAND */ /* verilator lint_on WIDTHEXPAND */
train_delay <= 15; train_delay <= 15;
state_calibrate <= FINISH_READ; state_calibrate <= FINISH_READ;
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE ALTERNATING WRITE-READ",8'h0a}; uart_text <= {"DONE ALTERNATING WRITE-READ",8'h0a};
state_calibrate <= WAIT_UART; state_calibrate <= WAIT_UART;
@ -3219,7 +3222,7 @@ ALTERNATE_WRITE_READ: if(!o_wb_stall_calib) begin
state_calibrate <= DONE_CALIBRATE; state_calibrate <= DONE_CALIBRATE;
final_calibration_done <= 1'b1; final_calibration_done <= 1'b1;
end end
`ifdef UART_DEBUG_ALIGN `ifdef UART_DEBUG_BIST
uart_start_send <= 1'b1; uart_start_send <= 1'b1;
uart_text <= {"DONE BIST_MODE=",hex_to_ascii(BIST_MODE),", correct_read_data=", uart_text <= {"DONE BIST_MODE=",hex_to_ascii(BIST_MODE),", correct_read_data=",
8'h0a, 8'h0a, correct_read_data, 8'h0a, 8'h0a, 8'h0a, 8'h0a 8'h0a, 8'h0a, correct_read_data, 8'h0a, 8'h0a, 8'h0a, 8'h0a