diff options
| author | Eric Dao <eric@erickhangdao.com> | 2025-03-10 17:54:31 -0400 |
|---|---|---|
| committer | Eric Dao <eric@erickhangdao.com> | 2025-03-10 17:54:31 -0400 |
| commit | ab224e2e6ba65f5a369ec392f99cd8845ad06c98 (patch) | |
| tree | a1e757e9341863ed52b8ad4c5a1c45933aab9da4 /python/openvino/demo/ip/intel_ai_ip/verilog/dla_streamer_fsm.sv | |
| parent | 40da1752f2c8639186b72f6838aa415e854d0b1d (diff) | |
| download | thesis-master.tar.gz thesis-master.tar.bz2 thesis-master.zip | |
Diffstat (limited to 'python/openvino/demo/ip/intel_ai_ip/verilog/dla_streamer_fsm.sv')
| -rw-r--r-- | python/openvino/demo/ip/intel_ai_ip/verilog/dla_streamer_fsm.sv | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/python/openvino/demo/ip/intel_ai_ip/verilog/dla_streamer_fsm.sv b/python/openvino/demo/ip/intel_ai_ip/verilog/dla_streamer_fsm.sv new file mode 100644 index 0000000..9286e39 --- /dev/null +++ b/python/openvino/demo/ip/intel_ai_ip/verilog/dla_streamer_fsm.sv @@ -0,0 +1,136 @@ +// Copyright 2024 Intel Corporation. +// +// This software and the related documents are Intel copyrighted materials, +// and your use of them is governed by the express license under which they +// were provided to you ("License"). Unless the License provides otherwise, +// you may not use, modify, copy, publish, distribute, disclose or transmit +// this software or the related documents without Intel's prior written +// permission. +// +// This software and the related documents are provided as is, with no express +// or implied warranties, other than those that are expressly stated in the +// License. + +/* + * dla_streamer_fsm.sv + * + * This module implements a state machine to produce the correct AXI-s o_tready signal for CoreDLA + * input streaming. The goal is to make sure that the o_ready signal goes low as soon as the last + * input transmission for the current frame is received, and does not go high again until the next + * move instruction is configured in the input feeder. + * + * To accomplish this, this module implements the FSM as shown below: + * + * ~i_dla_ready | ~i_stream_en + * ┌────┐ + * │ │ + * │ │ ┌───────┐ ~i_tvalid + * ┌─┴────▼┌─────┐ │ ├────┐ ┌─────────────────────────────────────────────────────────────┐ + * │ │ └──────────►│ S1 │ │ │ │ + * │ S0 | i_dla_ready │ │◄───┘ │ S0: IDLE ("Wait for input feeder to become ready") │ + * │ │ & i_stream_en ├──┬────┘ │ o_stream_ready = 0 │ + * └───────┘ │ │ │ │ + * ▲ │ │ │ S1: STREAM_FIRST ("Accept first input") │ + * │ i_lt_done_frame │ │i_tvalid │ o_stream_ready = 1 │ + * │ ┌──────┘ │ │ │ + * │ │ │ │ S1: STREAMING ("Accept AXI-s inputs") │ + * │ │ ┌───▼───┐ │ o_stream_ready = 1 │ + * │~i_dla_ready │ │ ├────┐ │ │ + * │ │ │ S2 │ │ │ S2: WAIT_FOR_NEXT_FRAME ("Downstream is digesting inputs") │ + * │ ┌──────────┘ │ │◄───┘ │ o_stream_ready = 0 │ + * │ ▼ └───┬───┘ └─────────────────────────────────────────────────────────────┘ + * ┌─┴─────┐ │ + * │ │ │i_lt_done_frame + * │ S3 ├──────────────────┘ + * │ │ + * └─────┬─┘ + * ▲ │ + * │ │ + * └───┘ + * i_dla_ready + * + * + * Note: This FSM assumes that the i_dla_ready signal from the input feeder goes low between every input frame. + */ + +`resetall +`undefineall +`default_nettype none + +module dla_streamer_fsm ( + input wire clk_dla, + input wire clk_axi, + input wire i_resetn_axi, + input wire i_resetn_async, + input wire i_dla_ready, + input wire i_lt_ready, + input wire i_streaming_enable, + input wire i_lt_done_frame, + input wire i_tvalid, + output logic o_stream_ready, + output logic o_reading_first_word // Used to start the 'active jobs' CSR counter +); +enum { // 2-state ints + IDLE_BIT, + STREAM_FIRST_BIT, + STREAMING_BIT, + WAIT_FOR_NEXT_FRAME_BIT +} index; +enum logic [index.num()-1:0] { // 1-hot encodings + IDLE = 1 << IDLE_BIT, + STREAM_FIRST = 1 << STREAM_FIRST_BIT, + STREAMING = 1 << STREAMING_BIT, + WAIT_FOR_NEXT_FRAME = 1 << WAIT_FOR_NEXT_FRAME_BIT, + XXX = 'x +} state, next; +logic axi_dla_ready; +// move the ready signal from input feeder into AXI domain. +dla_clock_cross_full_sync cc_dla_ready ( + .clk_src(clk_dla), + .i_src_async_resetn(1'b1), + .i_src_data(i_dla_ready), + .o_src_data(), // in streamer, sort out resets and pass in the appropriate resets. + .clk_dst(clk_axi), + .i_dst_async_resetn(1'b1), + .o_dst_data(axi_dla_ready) +); +always_comb begin : fsm_combinational + next = XXX; + unique case (1'b1) + state[IDLE_BIT]: + if (i_lt_ready & i_streaming_enable) + next = STREAM_FIRST; + else + next = IDLE; + state[STREAM_FIRST_BIT]: + if (i_tvalid & i_streaming_enable) + next = STREAMING; + else + next = STREAM_FIRST; + state[STREAMING_BIT]: + if (i_lt_done_frame) + next = WAIT_FOR_NEXT_FRAME; + else + next = STREAMING; + state[WAIT_FOR_NEXT_FRAME_BIT]: + next = IDLE; + default: + next = XXX; + endcase +end + +always_ff @( posedge clk_axi ) begin : fsm_state_logic + state <= next; + o_reading_first_word <= 0; + if (state[STREAM_FIRST_BIT] & next != STREAM_FIRST) begin + o_reading_first_word <= 1; + end + + if (~i_resetn_axi) begin + state <= IDLE; + end +end + +assign o_stream_ready = state[STREAMING_BIT] | (state[STREAM_FIRST_BIT] & i_streaming_enable); + +endmodule |
