📄 pci_target32_sm.v
字号:
sm_transfere <= 1'b0 ;
state_default <= 1'b0 ;
n_state <= S_TRANSFERE ;
end
S_TRANSFERE :
begin
state_idle <= 1'b0 ;
state_wait <= 1'b0 ;
sm_transfere <= 1'b1 ;
state_default <= 1'b0 ;
n_state <= S_IDLE ;
end
default :
begin
state_idle <= 1'b0 ;
state_wait <= 1'b0 ;
sm_transfere <= 1'b0 ;
state_default <= 1'b1 ;
n_state <= S_IDLE ;
end
endcase
end
// if not retry and not target abort
// NO CRITICAL SIGNALS
wire trdy_w = (
(state_wait && ~cnf_progress && rw_cbe0 && wr_progress && ~target_abort_in) ||
(state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && ~target_abort_in && !pcir_fifo_data_err_in) ||
(state_wait && ~cnf_progress && ~rw_cbe0 && ~same_read_reg && norm_access_to_conf_reg && ~target_abort_in) ||
(state_wait && cnf_progress && ~target_abort_in)
) ;
// if not disconnect without data and not target abort (only during reads)
// MUST BE ANDED WITH CRITICAL ~FRAME
wire trdy_w_frm = (
(state_transfere && !cnf_progress && !norm_access_to_conf_reg && rw_cbe0 && !disconect_wo_data) ||
(state_transfere && !cnf_progress && !norm_access_to_conf_reg && ~rw_cbe0 && !disconect_wo_data && ~pcir_fifo_data_err_in) ||
(state_transfere && !cnf_progress && !norm_access_to_conf_reg && disconect_w_data && pci_irdy_reg_in &&
((~rw_cbe0 && ~pcir_fifo_data_err_in) || rw_cbe0))
) ;
// if not disconnect without data and not target abort (only during reads)
// MUST BE ANDED WITH CRITICAL ~FRAME AND IRDY
wire trdy_w_frm_irdy = ( ~bckp_trdy_in ) ;
// TRDY critical module used for preserving the architecture because of minimum delay for critical inputs
pci_target32_trdy_crit pci_target_trdy_critical
(
.trdy_w (trdy_w),
.trdy_w_frm (trdy_w_frm),
.trdy_w_frm_irdy (trdy_w_frm_irdy),
.pci_frame_in (pci_frame_in),
.pci_irdy_in (pci_irdy_in),
.pci_trdy_out (pci_trdy_out)
);
// if target abort or retry
// NO CRITICAL SIGNALS
wire stop_w = (
(state_wait && target_abort_in) ||
(state_wait && ~cnf_progress && rw_cbe0 && ~wr_progress) ||
(state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && ~rd_progress) ||
(state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && pcir_fifo_data_err_in) ||
(state_wait && ~cnf_progress && ~rw_cbe0 && ~same_read_reg && ~norm_access_to_conf_reg)
) ;
// if asserted, wait for deactivating the frame
// MUST BE ANDED WITH CRITICAL ~FRAME
wire stop_w_frm = (
(state_backoff && ~bckp_stop_in)
) ;
// if target abort or if disconnect without data (after data transfere)
// MUST BE ANDED WITH CRITICAL ~FRAME AND ~IRDY
wire stop_w_frm_irdy = (
(state_transfere && (disconect_wo_data)) ||
(state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in)
) ;
// STOP critical module used for preserving the architecture because of minimum delay for critical inputs
pci_target32_stop_crit pci_target_stop_critical
(
.stop_w (stop_w),
.stop_w_frm (stop_w_frm),
.stop_w_frm_irdy (stop_w_frm_irdy),
.pci_frame_in (pci_frame_in),
.pci_irdy_in (pci_irdy_in),
.pci_stop_out (pci_stop_out)
);
// if OK to respond and not target abort
// NO CRITICAL SIGNALS
wire devs_w = (
(addr_phase && config_access) ||
(addr_phase && ~config_access && addr_claim_in) ||
(state_wait && ~target_abort_in && !(~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && pcir_fifo_data_err_in) )
) ;
// if not target abort (only during reads) or if asserted, wait for deactivating the frame
// MUST BE ANDED WITH CRITICAL ~FRAME
wire devs_w_frm = (
(state_transfere && rw_cbe0) ||
(state_transfere && ~rw_cbe0 && ~pcir_fifo_data_err_in) ||
(state_backoff && ~bckp_devsel_in)
) ;
// if not target abort (only during reads)
// MUST BE ANDED WITH CRITICAL ~FRAME AND IRDY
wire devs_w_frm_irdy = (
(state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in)
) ;
// DEVSEL critical module used for preserving the architecture because of minimum delay for critical inputs
pci_target32_devs_crit pci_target_devsel_critical
(
.devs_w (devs_w),
.devs_w_frm (devs_w_frm),
.devs_w_frm_irdy (devs_w_frm_irdy),
.pci_frame_in (pci_frame_in),
.pci_irdy_in (pci_irdy_in),
.pci_devsel_out (pci_devsel_out)
);
// signal used in AD enable module with preserving the hierarchy because of minimum delay for critical inputs
assign pci_ad_en_out = (
(addr_phase && config_access && ~pci_cbe_reg_in[0]) ||
(addr_phase && ~config_access && addr_claim_in && ~pci_cbe_reg_in[0]) ||
(state_wait && ~rw_cbe0) ||
(state_transfere && ~rw_cbe0) ||
(state_backoff && ~rw_cbe0 && ~pci_frame_reg_in)
) ;
wire fast_back_to_back = (addr_phase && ~pci_irdy_reg_in) ;
// if cycle will progress or will not be stopped
// NO CRITICAL SIGNALS
wire ctrl_en =
/*(~wbu_frame_en_in && fast_back_to_back) ||*/
(addr_phase && config_access) ||
(addr_phase && ~config_access && addr_claim_in) ||
(state_wait) ||
(state_transfere && ~(pci_frame_reg_in && ~pci_irdy_reg_in && (~pci_stop_reg_in || ~pci_trdy_reg_in))) ||
(state_backoff && ~(pci_frame_reg_in && ~pci_irdy_reg_in && (~pci_stop_reg_in || ~pci_trdy_reg_in))) ;
assign pci_trdy_en_out = ctrl_en ;
assign pci_stop_en_out = ctrl_en ;
assign pci_devsel_en_out = ctrl_en ;
// target ready output signal delayed for one clock used in conjunction with irdy_reg to select which
// data are registered in io mux module - from fifo or medoum register
reg bckp_trdy_reg ;
// delayed indicators for states transfere and backoff
reg state_transfere_reg ;
reg state_backoff_reg ;
always@(posedge clk_in or posedge reset_in)
begin
if (reset_in)
begin
bckp_trdy_reg <= #`FF_DELAY 1'b1 ;
state_transfere_reg <= #`FF_DELAY 1'b0 ;
state_backoff_reg <= #`FF_DELAY 1'b0 ;
end
else
begin
bckp_trdy_reg <= #`FF_DELAY bckp_trdy_in ;
state_transfere_reg <= #`FF_DELAY state_transfere ;
state_backoff_reg <= #`FF_DELAY state_backoff ;
end
end
// Read control signals assignments
assign
fetch_pcir_fifo_out = (
(prepare_rd_fifo_data) ||
(state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~target_abort_in) ||
(bckp_trdy_en_in && ~pci_trdy_reg_in && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~pci_irdy_reg_in)
) ;
assign ad_load_out = (state_wait) ;
assign ad_load_on_transfer_out = (bckp_trdy_en_in && ~rw_cbe0) ;
assign load_medium_reg_out = (
(prepare_rd_fifo_data) ||
(state_wait && ~rw_cbe0 && ~cnf_progress && same_read_reg && rd_from_fifo && ~target_abort_in) ||
(~pci_irdy_reg_in && ~rw_cbe0 && ~cnf_progress && same_read_reg && rd_from_fifo && ~pci_trdy_reg_in && bckp_trdy_en_in)
) ;
assign sel_fifo_mreg_out = (~pci_irdy_reg_in && ~bckp_trdy_reg) ;
`ifdef HOST
`ifdef NO_CNF_IMAGE
assign sel_conf_fifo_out = 1'b0 ;
`else
assign sel_conf_fifo_out = (cnf_progress || norm_access_to_conf_reg) ;
`endif
`else
assign sel_conf_fifo_out = (cnf_progress || norm_access_to_conf_reg) ;
`endif
// Write control signals assignments
assign
load_to_pciw_fifo_out = (
(state_wait && (~cnf_progress && ~norm_access_to_conf_reg) && rw_cbe0 && wr_to_fifo && ~target_abort_in) ||
(state_transfere_reg && ~state_backoff && rw_cbe0 && wr_to_fifo /*&& ~disconect_wo_data_reg*/ && ~pci_irdy_reg_in && ~bckp_trdy_reg && (~cnf_progress && ~norm_access_to_conf_reg)) ||
((state_backoff || state_backoff_reg) && rw_cbe0 && wr_to_fifo && ~pci_irdy_reg_in && ~bckp_trdy_reg && (~cnf_progress && ~norm_access_to_conf_reg))
) ;
`ifdef HOST
`ifdef NO_CNF_IMAGE
assign load_to_conf_out = 1'b0 ;
`else
assign load_to_conf_out = (
(state_transfere_reg && cnf_progress && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) ||
(state_transfere_reg && norm_access_to_conf_reg && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg)
) ;
`endif
`else
assign load_to_conf_out = (
(state_transfere_reg && cnf_progress && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) ||
(state_transfere_reg && norm_access_to_conf_reg && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg)
) ;
`endif
// General control sigal assignments
assign addr_phase_out = addr_phase ;
assign last_reg_out = (pci_frame_reg_in && ~pci_irdy_reg_in) ;
assign frame_reg_out = pci_frame_reg_in ;
assign bckp_devsel_out = bckp_devsel_in ;
assign bckp_trdy_out = bckp_trdy_in ;
assign bckp_stop_out = bckp_stop_in ;
assign target_abort_set_out = (bckp_devsel_in && bckp_trdy_in && ~bckp_stop_in && bckp_trdy_en_in) ;
// request signal for delayed sinc. module
reg master_will_request_read ;
always@(posedge clk_in or posedge reset_in)
begin
if ( reset_in )
master_will_request_read <= #`FF_DELAY 1'b0 ;
else
master_will_request_read <= #`FF_DELAY ((state_wait && ~target_abort_in) || (state_backoff && ~target_abort_set_out)) && ~cnf_progress && ~norm_access_to_conf_reg && ~rw_cbe0 && rd_request ;
end
// MORE OPTIMIZED READS, but not easy to control in a testbench!
//assign req_out = master_will_request_read ;
assign req_out = master_will_request_read && !pci_irdy_reg_in && !read_processing_in ;
// ready tells when address or data are written into fifo - RDY ? DATA : ADDRESS
assign rdy_out = ~bckp_trdy_reg ;
// data and address outputs assignments!
assign pci_ad_out = data_in ;
assign data_out = pci_ad_reg_in ;
assign be_out = pci_cbe_reg_in ;
assign next_be_out = pci_cbe_in ;
assign address_out = pci_ad_reg_in ;
assign bc_out = pci_cbe_reg_in ;
assign bc0_out = rw_cbe0 ;
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -