SC Item

From NaplesPU Documentation
Jump to: navigation, search

The item interface provides communication between the system and the host. This module (named npu_item_interface) implements a control logic which interprets messages from the host and applies those requests on the NPU core through a specific interface. Messages are organized in items (32 bits in the default version) when item_valid_i is high the item_data_i bus is evaluated by the control FSM. Often, a command requires more than one item, the FSM starts waiting for a command, hence the first item is the command from the host. Some commands require additional information, such as thread ID, in such cases, the FSM waits for a number of items equal of the number of additional information required to fulfil the host command.

Some commands send back a response to the host, such as reading internal registers, when required the response is forwarded to the host through:

output                 [ITEM_w - 1 : 0]           item_data_o,       
output                                            item_valid_o,

The item interface provides a standard on/off back-pressure control logic:

output                                            item_avail_o,       
input                                             item_avail_i   

The supported messages are defined in the module:

typedef enum logic [HOST_COMMAND_WIDTH - 1 : 0] {
  HN_BOOT_COMMAND         = 0, 
  HN_BOOT_ACK             = 1, 
  HN_ENABLE_CORE_COMMAND  = 2, 
  HN_ENABLE_CORE_ACK      = 3, 
  HN_READ_STATUS_COMMAND  = 8, 
  HN_WRITE_STATUS_COMMAND = 9
} hn_messages_t;

The supported commands are:

Setting PCs

HN_BOOT_COMMAND item sets the PC of a given thread, the next item defines the ID of the thread, while the last item sets the PC value. The control logic gathers that information and sets the PC using a specific interface to the core:

output logic                                      hi_job_valid,
output address_t                                  hi_job_pc,
output thread_id_t                                hi_job_thread_id,

When all the required items are ready, the FSM sets the hi_job_valid bit for a clock cycle and forwards PC and thread ID respectively on hi_job_pc and hi_job_thread_id.

Running threads

HN_ENABLE_CORE_COMMAND item sets the active thread mask in the NPU core. The value from the host is organized as a bitmask, if the i-th is high the i-th is active and it starts running. The bitmask is stored in a dedicated register:

always_ff @ ( posedge clk, posedge reset )
   if ( reset ) begin
      thread_en      <= {`THREAD_NUMB{1'b0}};
   end else begin
      if ( update_thread_en )
         thread_en      <= item_data_i[`THREAD_NUMB - 1 : 0];
end

and combinatorially propagated to the core:

output                 [`THREAD_NUMB - 1 : 0]     hi_thread_en,
assign hi_thread_en        = thread_en;

Control Registers

HN_READ_STATUS_COMMAND item fetches a special purpose register from the core, such as performance counters and PCs. Some registers are shared others are private among threads, e.g. PCs. The control logic waits for two data from the host, which are both in the next item from the host. The low half of the data defines the register ID, while the remaining part stores the thread id. The request is composed and sent to the core:

output logic                                      hi_read_cr_valid,
output register_t                                 hi_read_cr_request,

Then, the FSM waits for a clock cycle, fetches the output from the core:

input  register_t                                 cr_response,

and sends the response to the host through the item interface.

HN_WRITE_STATUS_COMMAND item writes a special purpose register of the core. The control logic waits for the register ID, thread ID, and the data. Then, the request is composed and issued to a special purpose interface:

output logic                                      hi_write_cr_valid,
output register_t                                 hi_write_cr_data,
output register_t                                 hi_read_cr_request,

Thread ID and register ID are propagated through hi_read_cr_request signal, as in the HN_READ_STATUS_COMMAND case.