📄 pci_wb_master.v
字号:
n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO end 3'b001 : // If writting of one data is retried begin addr_count = 1'b0 ; last_data_transferred = 1'b0 ; retried_d = 1'b1 ; // there was a retry wait_for_wb_response = 1'b0 ; if(rty_counter_almost_max_value) // If retry counter reached maximum allowed value begin if (last_data_from_pciw_fifo_reg) // if last data was transfered pciw_fifo_renable = 1'b0 ; else // if there wasn't last data of transfere pciw_fifo_renable = 1'b1 ; n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO write_rty_cnt_exp_out = 1'b1 ; // signal for reporting write counter expired pci_error_sig_out = 1'b1 ; error_source_out = 1'b1 ; // error ocuerd because of retry counter end else begin pciw_fifo_renable = 1'b0 ; n_state = S_IDLE ; // go to S_IDLE state for retrying the transaction write_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet pci_error_sig_out = 1'b0 ; error_source_out = 1'b0 ; end end default : begin addr_count = 1'b0 ; last_data_transferred = 1'b0 ; wait_for_wb_response = 1'b1 ; // wait for WB device to response (after 8 clocks RTY CNT is incremented) error_source_out = 1'b0 ; // if error ocures, error source is from other WB bus side if((rty_counter_almost_max_value)&&(set_retry)) // when no WB response and RTY CNT reached maximum allowed value begin retried_d = 1'b1 ; if (last_data_from_pciw_fifo_reg) // if last data was transfered pciw_fifo_renable = 1'b0 ; else // if there wasn't last data of transfere pciw_fifo_renable = 1'b1 ; n_state = S_WRITE_ERR_RTY ; // go here to clean this write transaction from PCIW_FIFO write_rty_cnt_exp_out = 1'b1 ; // signal for reporting write counter expired pci_error_sig_out = 1'b1 ; // signal for error reporting end else begin pciw_fifo_renable = 1'b0 ; retried_d = 1'b0 ; n_state = S_WRITE ; // stay in S_WRITE state to wait WB to response write_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet pci_error_sig_out = 1'b0 ; end end endcase end S_WRITE_ERR_RTY: // Clean current write transaction from PCIW_FIFO if ERROR or Retry counter expired occures begin pciw_fifo_renable = !last_data_from_pciw_fifo_reg ; // put out next data (untill last data or FIFO empty) last_data_transferred = 1'b1 ; // after exiting this state, negedge of this signal is used // Default values for signals not used in this state pcir_fifo_wenable = 1'b0 ; pcir_fifo_control = 4'h0 ; addr_into_cnt = 1'b0 ; read_count_load = 1'b0 ; read_count_enable = 1'b0 ; addr_count = 1'b0 ; pci_error_sig_out = 1'b0 ; error_source_out = 1'b0 ; retried_d = 1'b0 ; wb_read_done = 1'b0 ; write_rty_cnt_exp_out = 1'b0 ; read_rty_cnt_exp_out = 1'b0 ; wait_for_wb_response = 1'b0 ; // If last data is cleaned out from PCIW_FIFO if (last_data_from_pciw_fifo_reg) n_state = S_IDLE ; else n_state = S_WRITE_ERR_RTY ; // Clean until last data is cleaned out from FIFO end S_READ: // READ from WB bus to PCIR_FIFO begin // Default values for signals not used in this state pciw_fifo_renable = 1'b0 ; addr_into_cnt = 1'b0 ; read_count_load = 1'b0 ; pci_error_sig_out = 1'b0 ; error_source_out = 1'b0 ; write_rty_cnt_exp_out = 1'b0 ; case ({wb_ack_i, wb_err_i, wb_rty_i}) 3'b100 : // If reading of one data is acknowledged begin pcir_fifo_wenable = 1'b1 ; // enable writting data into PCIR_FIFO addr_count = 1'b1 ; // prepare next address if there will be burst read_count_enable = 1'b1 ; // decrease counter value for cache line size retried_d = 1'b0 ; // there was no retry read_rty_cnt_exp_out = 1'b0 ; // there was no retry wait_for_wb_response = 1'b0 ; // if last data was transfered if (last_data_to_pcir_fifo) begin pcir_fifo_control[`LAST_CTRL_BIT] = 1'b1 ; // FIFO must indicate LAST data transfered pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b0 ; pcir_fifo_control[`UNUSED_CTRL_BIT] = 1'b0 ; pcir_fifo_control[`ADDR_CTRL_BIT] = 1'b0 ; last_data_transferred = 1'b1 ; // signal for last data transfered wb_read_done = 1'b1 ; // signal last data of read transaction for PCI Target n_state = S_TURN_ARROUND ; end else // if not last data transfered begin pcir_fifo_control = 4'h0 ; // ZERO for control code last_data_transferred = 1'b0 ; // not last data transfered wb_read_done = 1'b0 ; // read is not done yet n_state = S_READ ; end end 3'b010 : // If reading of one data is terminated with ERROR begin pcir_fifo_wenable = 1'b1 ; // enable for writting to FIFO data with ERROR addr_count = 1'b0 ; // no need for new address pcir_fifo_control[`LAST_CTRL_BIT] = 1'b0 ; pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b1 ; // FIFO must indicate the DATA with ERROR pcir_fifo_control[`UNUSED_CTRL_BIT] = 1'b0 ; pcir_fifo_control[`ADDR_CTRL_BIT] = 1'b0 ; last_data_transferred = 1'b1 ; // signal for last data transfered wb_read_done = 1'b1 ; // signal last data of read transaction for PCI Target read_count_enable = 1'b0 ; // no need for cache line, when error occures n_state = S_TURN_ARROUND ; retried_d = 1'b0 ; // there was no retry wait_for_wb_response = 1'b0 ; read_rty_cnt_exp_out = 1'b0 ; // there was no retry end 3'b001 : // If reading of one data is retried begin pcir_fifo_wenable = 1'b0 ; pcir_fifo_control = 4'h0 ; addr_count = 1'b0 ; read_count_enable = 1'b0 ; wait_for_wb_response = 1'b0 ; case ({first_wb_data_access, rty_counter_almost_max_value}) 2'b10 : begin // if first data of the cycle (CYC_O) is retried - after each retry CYC_O goes inactive n_state = S_IDLE ; // go to S_IDLE state for retrying the transaction read_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired yet last_data_transferred = 1'b0 ; wb_read_done = 1'b0 ; retried_d = 1'b1 ; // there was a retry end 2'b11 : begin // if retry counter reached maximum value n_state = S_READ_RTY ; // go here to wait for PCI Target to remove read request read_rty_cnt_exp_out = 1'b1 ; // signal for reporting read counter expired last_data_transferred = 1'b0 ; wb_read_done = 1'b0 ; retried_d = 1'b1 ; // there was a retry end default : // if retry occures after at least 1 data was transferred without breaking cycle (CYC_O inactive) begin // then PCI device will retry access! n_state = S_TURN_ARROUND ; // go to S_TURN_ARROUND state read_rty_cnt_exp_out = 1'b0 ; // retry counter hasn't expired last_data_transferred = 1'b1 ; wb_read_done = 1'b1 ; retried_d = 1'b0 ; // retry must not be retried, since there is not a first data end endcase end default : begin addr_count = 1'b0 ; read_count_enable = 1'b0 ; read_rty_cnt_exp_out = 1'b0 ; wait_for_wb_response = 1'b1 ; // wait for WB device to response (after 8 clocks RTY CNT is incremented) if((rty_counter_almost_max_value)&&(set_retry)) // when no WB response and RTY CNT reached maximum allowed value begin retried_d = 1'b1 ; n_state = S_TURN_ARROUND ; // go here to stop read request pcir_fifo_wenable = 1'b1 ; pcir_fifo_control[`LAST_CTRL_BIT] = 1'b0 ; pcir_fifo_control[`DATA_ERROR_CTRL_BIT] = 1'b1 ; // FIFO must indicate the DATA with ERROR pcir_fifo_control[`UNUSED_CTRL_BIT] = 1'b0 ; pcir_fifo_control[`ADDR_CTRL_BIT] = 1'b0 ; last_data_transferred = 1'b1 ; wb_read_done = 1'b1 ; end else begin retried_d = 1'b0 ; n_state = S_READ ; // stay in S_READ state to wait WB to response pcir_fifo_wenable = 1'b0 ; pcir_fifo_control = 4'h0 ; last_data_transferred = 1'b0 ; wb_read_done = 1'b0 ; end end endcase end S_READ_RTY: // Wait for PCI Target to remove read request, when retry counter reaches maximum value! begin // Default values for signals not used in this state pciw_fifo_renable = 1'b0 ; pcir_fifo_wenable = 1'b0 ; pcir_fifo_control = 4'h0 ; addr_into_cnt = 1'b0 ; read_count_load = 1'b0 ; read_count_enable = 1'b0 ; addr_count = 1'b0 ; pci_error_sig_out = 1'b0 ; error_source_out = 1'b0 ; retried_d = 1'b0 ; wb_read_done = 1'b0 ; write_rty_cnt_exp_out = 1'b0 ; read_rty_cnt_exp_out = 1'b0 ; wait_for_wb_response = 1'b0 ; // wait for PCI Target to remove read request if (pci_tar_read_request) begin n_state = S_READ_RTY ; // stay in this state until read request is removed last_data_transferred = 1'b0 ; end else // when read request is removed begin n_state = S_IDLE ; last_data_transferred = 1'b1 ; // when read request is removed, there is "last" data end end // Turn arround cycle after writting to PCIR_FIFO (for correct data when reading from PCIW_FIFO) default: // S_TURN_ARROUND: begin // Default values for signals not used in this state pciw_fifo_renable = 1'b0 ; pcir_fifo_wenable = 1'b0 ; pcir_fifo_control = 4'h0 ; addr_into_cnt = 1'b0 ; read_count_load = 1'b0 ; read_count_enable = 1'b0 ; addr_count = 1'b0 ; pci_error_sig_out = 1'b0 ; error_source_out = 1'b0 ; retried_d = 1'b0 ; last_data_transferred = 1'b1 ; wb_read_done = 1'b0 ; write_rty_cnt_exp_out = 1'b0 ; read_rty_cnt_exp_out = 1'b0 ; wait_for_wb_response = 1'b0 ; n_state = S_IDLE ; end endcaseend// Signal for retry monitor in state machine when there is read and first (or single) data accesswire ack_rty_response = wb_ack_i || wb_rty_i ;// Signal first_wb_data_access is set when no WB cycle present till end of first data access of WB cycle on WB busalways@(posedge wb_clock_in or posedge reset_in)begin if (reset_in) first_wb_data_access = 1'b1 ; else begin if (~wb_cyc_o) first_wb_data_access = 1'b1 ; else if (ack_rty_response) first_wb_data_access = 1'b0 ; endend// Signals to FIFOassign pcir_fifo_be_out = 4'hf ; // pci_tar_be ;// Signals to Conf. spaceassign pci_error_bc = bc_register ;always@(posedge wb_clock_in or posedge reset_in)begin if (reset_in) wb_read_done_out <= #`FF_DELAY 1'b0 ; else wb_read_done_out <= #`FF_DELAY wb_read_done ;endalways@(pciw_fifo_renable or addr_into_cnt_reg or pciw_fifo_control_in or pciw_fifo_empty_in)begin pciw_fifo_renable_out = pciw_fifo_renable || addr_into_cnt_reg ; last_data_from_pciw_fifo_reg = pciw_fifo_control_in[`ADDR_CTRL_BIT] || pciw_fifo_empty_in ;endendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -