summaryrefslogtreecommitdiff
path: root/python/openvino/demo/ip/intel_ai_ip/verilog/dla_xbar_if.sv
blob: 4baf1b4d7ea475017aeebc72ba679787a6f5d8e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// Copyright 2021-2021 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.

// Xbar PI ouput specific beat(s)
interface xbar_config_beat_pioutput_if #(
  dla_xbar_pkg::xbar_config_parameter_t config_field_param
);
  typedef struct packed {
    logic [config_field_param.OUTPUT_CONFIG_WORD_ORSEL_WIDTH-1:0]           output_route_select;
    logic [config_field_param.OUTPUT_CONFIG_WORD_RESERVED0_WIDTH-1:0]       reserved;
    // NOTE:: One can't use the MUX-select signals assigned for valid/data for ready
    logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               inp_mux_select; // MUX select signal for the ready signal back to PE Array
    logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               opt_mux_select; //
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface

// Kernel's specific beat(s)
interface xbar_config_beat_kernel_if #(
  dla_xbar_pkg::xbar_config_parameter_t config_field_param
);
  typedef struct packed {
    struct packed {
      logic [config_field_param.KERNEL_CONFIG_WORD_BYF_WIDTH-1:0] bypass_flag       ;
      logic [config_field_param.KERNEL_CONFIG_WORD_NCF_WIDTH-1:0] connection_flag;
      logic [config_field_param.KERNEL_CONFIG_WORD_RESERVED0_WIDTH-1:0]       reserved;
      // NOTE:: One can't use the MUX-select signals assigned for valid/data for ready
      logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               inp_mux_select; // MUX select signal for ready signal back to kernels
      logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               opt_mux_select; // MUX select signal for valid/data signals to kernels
    } [config_field_param.NUMBER_OF_AUX_KERNELS_ONLY:1] kernels; // Array addressed from 1, because 0 is reserved for output_fields in this case!
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface

// Xbar input data count specific beat(s)
interface xbar_config_beat_idatacount_if #(
  dla_xbar_pkg::xbar_config_parameter_t config_field_param
);
  typedef struct packed {
    logic [config_field_param.IDCOUNT_CONFIG_WORD_RESERVED0_WIDTH-1:0]      reserved;
    logic [config_field_param.XBAR_INPUT_COUNTER_WIDTH-1:0]                 count;
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface

// Xbar output data count specific beat(s)
interface xbar_config_beat_odatacount_if #(
  dla_xbar_pkg::xbar_config_parameter_t config_field_param
);
  typedef struct packed {
    logic [config_field_param.ODCOUNT_CONFIG_WORD_RESERVED0_WIDTH-1:0]      reserved;
    logic [config_field_param.XBAR_OUTPUT_COUNTER_WIDTH-1:0]                count;
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface

// ----------------------- Config Packet -----------------------
interface xbar_config_pkt_if #(
  dla_xbar_pkg::xbar_config_parameter_t config_field_param
);
  typedef struct packed {
    struct packed  {
      logic [config_field_param.ODCOUNT_CONFIG_WORD_RESERVED0_WIDTH-1:0]      reserved;
      logic [config_field_param.XBAR_OUTPUT_COUNTER_WIDTH-1:0]                count;
    } odcount_fields;

    struct packed {
      logic [config_field_param.IDCOUNT_CONFIG_WORD_RESERVED0_WIDTH-1:0]      reserved;
      logic [config_field_param.XBAR_INPUT_COUNTER_WIDTH-1:0]                 count;
    } idcount_fields;
    // Array addressed from 1, because 0 is reserved for output_fields in this case!
    struct packed {
      logic [config_field_param.KERNEL_CONFIG_WORD_BYF_WIDTH-1:0] bypass_flag       ;
      logic [config_field_param.KERNEL_CONFIG_WORD_NCF_WIDTH-1:0] connection_flag;
      logic [config_field_param.KERNEL_CONFIG_WORD_RESERVED0_WIDTH-1:0]       reserved;
      // NOTE:: One can't use the MUX-select signals assigned for valid/data for ready
      logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               inp_mux_select; // MUX select signal for ready signal back to kernels
      logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               opt_mux_select; // MUX select signal for valid/data signals to kernels
    } [config_field_param.NUMBER_OF_AUX_KERNELS_ONLY:1] kernel_fields;
    struct packed {
      logic [config_field_param.OUTPUT_CONFIG_WORD_ORSEL_WIDTH-1:0]           output_route_select;
      logic [config_field_param.OUTPUT_CONFIG_WORD_RESERVED0_WIDTH-1:0]       reserved;
      // NOTE:: One can't use the MUX-select signals assigned for valid/data for ready
      logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               inp_mux_select; // MUX select signal for the ready signal back to PE Array
      logic [config_field_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               opt_mux_select; //
    } pi_opt_fields;
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface

// ----------------------- Config Handler FSM - State Variable -----------------------
interface config_fsm_state_var_if #(
  dla_xbar_pkg::xbar_config_parameter_t config_field_param
);
  typedef struct packed {
    logic config_ready;
    // Note:: Config is collected in a packed array // (each array element consisting of a beat worth of information) of size equal to total-beat-count
    logic [(config_field_param.CONFIG_DATA_WIDTH * config_field_param.CONFIG_BEAT_COUNT)-1:0]   config_pkt;
    logic config_valid;
    logic [config_field_param.CONFIG_BEAT_COUNTER_WIDTH-1:0]        config_beat_count;
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface

interface xbar_ctrl_fsm_state_var_if #(
  dla_xbar_pkg::xbar_config_parameter_t fsm_param
);
  typedef struct packed {
    struct packed {
      struct packed  {
        logic [fsm_param.ODCOUNT_CONFIG_WORD_RESERVED0_WIDTH-1:0]      reserved;
        logic [fsm_param.XBAR_OUTPUT_COUNTER_WIDTH-1:0]                count;
      } odcount_fields;

      struct packed {
        logic [fsm_param.IDCOUNT_CONFIG_WORD_RESERVED0_WIDTH-1:0]      reserved;
        logic [fsm_param.XBAR_INPUT_COUNTER_WIDTH-1:0]                 count;
      } idcount_fields;
      // Array addressed from 1, because 0 is reserved for output_fields in this case!
      struct packed {
        logic [fsm_param.KERNEL_CONFIG_WORD_BYF_WIDTH-1:0] bypass_flag       ;
        logic [fsm_param.KERNEL_CONFIG_WORD_NCF_WIDTH-1:0] connection_flag;
        logic [fsm_param.KERNEL_CONFIG_WORD_RESERVED0_WIDTH-1:0]       reserved;
        // NOTE:: One can't use the MUX-select signals assigned for valid/data for ready
        logic [fsm_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               inp_mux_select; // MUX select signal for ready signal back to kernels
        logic [fsm_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               opt_mux_select; // MUX select signal for valid/data signals to kernels
      } [fsm_param.NUMBER_OF_AUX_KERNELS_ONLY:1] kernel_fields;
      struct packed {
        logic [fsm_param.OUTPUT_CONFIG_WORD_ORSEL_WIDTH-1:0]           output_route_select;
        logic [fsm_param.OUTPUT_CONFIG_WORD_RESERVED0_WIDTH-1:0]       reserved;
        // NOTE:: One can't use the MUX-select signals assigned for valid/data for ready
        logic [fsm_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               inp_mux_select; // MUX select signal for the ready signal back to PE Array
        logic [fsm_param.AUX_KERNEL_SELECT_ID_WIDTH-1:0]               opt_mux_select; //
      } pi_opt_fields;
    } config_copy;
    logic [fsm_param.XBAR_INPUT_COUNTER_WIDTH-1:0]      inp_counter;
    logic [fsm_param.XBAR_OUTPUT_COUNTER_WIDTH-1:0]     opt_counter;
    logic   primary_input_e;    // Enable for PE-Array input
    logic   primary_output_e;   // Enable for the last aux-kernel in the pipeline
    logic   input_counter_done;
    logic   output_counter_done;
    logic   config_serviced;
  } Type;
  Type data;
  modport sender (output data);
  modport receiver (input data);
endinterface