module handslv (/*AUTOARG*/ // Outputs start, act, ack, // Inputs clk, xrst, finish, req ); // public // private parameter P_DELAY = 1; parameter P_INIT = 1'b0; parameter P_ACK = 1'b1; input clk ; // I : input xrst ; // I : output start ; // O : output act ; // O : input finish ; // I : input req ; // I : output ack ; // O : reg w_state ; reg r_state ; reg r_req0 ; reg r_req1 ; reg r_ack ; reg r_start ; reg r_act ; reg r_finish ; assign start = r_start; assign act = r_act; assign ack = r_ack; // w_state always @(/*AS*/r_finish or r_req1 or r_state) begin case (r_state) P_INIT: if (r_req1 == 1'b1) begin w_state = P_ACK; end else begin w_state = r_state; end P_ACK: if (r_req1 == 1'b0 && r_finish == 1'b1) begin w_state = P_INIT; end else begin w_state = r_state; end default: w_state = P_INIT; endcase end // r_state always @(posedge clk or negedge xrst) begin if (!xrst) begin r_state <= #P_DELAY P_INIT; end else begin r_state <= #P_DELAY w_state; end end // r_req0 // r_req1 always @(posedge clk or negedge xrst) begin if (!xrst) begin r_req0 <= #P_DELAY 1'b0; r_req1 <= #P_DELAY 1'b0; end else begin r_req0 <= #P_DELAY req; r_req1 <= #P_DELAY r_req0; end end // r_ack always @(posedge clk or negedge xrst) begin if (!xrst) begin r_ack <= #P_DELAY 1'b0; end else if (r_state == P_INIT && w_state == P_ACK) begin r_ack <= #P_DELAY 1'b1; end else if (r_state == P_ACK && w_state == P_INIT) begin r_ack <= #P_DELAY 1'b0; end end // r_start always @(posedge clk or negedge xrst) begin if (!xrst) begin r_start <= #P_DELAY 1'b0; end else if (r_state == P_INIT && w_state == P_ACK) begin r_start <= #P_DELAY 1'b1; end else begin r_start <= #P_DELAY 1'b0; end end // r_act always @(posedge clk or negedge xrst) begin if (!xrst) begin r_act <= #P_DELAY 1'b0; end else if (r_state == P_ACK && finish == 1'b1) begin r_act <= #P_DELAY 1'b0; end else if (r_state == P_INIT && w_state == P_ACK) begin r_act <= #P_DELAY 1'b1; end end // r_finish always @(posedge clk or negedge xrst) begin if (!xrst) begin r_finish <= #P_DELAY 1'b0; end else if (r_state == P_ACK && w_state == P_INIT) begin r_finish <= #P_DELAY 1'b0; end else if (r_state == P_ACK && finish == 1'b1) begin r_finish <= #P_DELAY 1'b1; end end endmodule