summaryrefslogtreecommitdiff
path: root/python/openvino/demo/ip/intel_ai_ip/dla_helper.tcl
blob: bf5f57663db262791c47c18329c52c7ac4fdc970 (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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
# not sure why we need this
add_parameter device_family STRING
set_parameter_property device_family VISIBLE false
set_parameter_property device_family SYSTEM_INFO {DEVICE_FAMILY}
set_parameter_property device_family AFFECTS_GENERATION true

# those are useful hooks so keep them here
set_module_property ELABORATION_CALLBACK elaboration_callback
set elaboration_callback_hooks [list]

set_module_property VALIDATION_CALLBACK validation_callback
set validation_callback_hooks [list]

###################################################################################
# Master Elaboration Callback Hook.
# 
#
###################################################################################
proc elaboration_callback {} {
  upvar elaboration_callback_hooks hooks

  foreach hook $hooks {
    $hook
  }
}

###################################################################################
# Master Validation Callback Hook.
# 
#
###################################################################################
proc validation_callback {} {
  upvar validation_callback_hooks hooks

  foreach hook $hooks {
    $hook
  }
}

###################################################################################
# Register core level validate call back
# 
#
###################################################################################
proc add_validation_callback { func } {
  upvar validation_callback_hooks hooks
  lappend hooks $func
}

###################################################################################
# Register core level elab call back
# 
#
###################################################################################
proc add_elab_callback { func } {
  upvar elaboration_callback_hooks hooks
  lappend hooks $func
}


# capability related 
###################################################################################
#
# Create the Fake Generics (These dont exist in RTL) But can be probed by Qsys
#
###################################################################################
proc omni_add_fake_generic {gui_grp desc generic default lower higher } {

  add_display_item       $gui_grp $generic parameter
  add_parameter          $generic INTEGER $lower
  set_parameter_property $generic DEFAULT_VALUE $default
  set_parameter_property $generic DISPLAY_NAME $desc
  set_parameter_property $generic ALLOWED_RANGES $lower:$higher
  set_parameter_property $generic ENABLED true
  set_parameter_property $generic UNITS None
  set_parameter_property $generic VISIBLE true
  set_parameter_property $generic HDL_PARAMETER false

}

# Need to understand how customer will use this
###################################################################################
#
# Add the Offset Capability Info to a core.
#
###################################################################################
proc omni_add_capability { value version size {en 0 } { st 0} } {

  add_display_item "" "Capability Info" GROUP tab
  # hide the capability tab by default.
  set_display_item_property  "Capability Info" VISIBLE false

  add_display_item "Capability Info" "CapInfo" GROUP
  omni_add_fake_generic  "CapInfo" "Type"                      C_OMNI_CAP_TYPE $value 0 1024
  omni_add_fake_generic  "CapInfo" "Version "                  C_OMNI_CAP_VERSION $version 1 255
  omni_add_fake_generic  "CapInfo" "Size (32bit Words)"        C_OMNI_CAP_SIZE $size 0 1073741824
  omni_add_fake_generic  "CapInfo" "Associated ID"             C_OMNI_CAP_ID_ASSOCIATED 0 0 255
  omni_add_fake_generic  "CapInfo" "Component ID"              C_OMNI_CAP_ID_COMPONENT 0 0 255
  omni_add_fake_generic  "CapInfo" "IRQ Vector (255:disabled)" C_OMNI_CAP_IRQ 255 0 255
  omni_add_fake_generic  "CapInfo" "Tag"                       C_OMNI_CAP_TAG 0 0 255
  if {$en} {
    omni_add_fake_generic  "CapInfo" "IRQ Enable Exists"         C_OMNI_CAP_IRQ_ENABLE_EN 1 0 1
  } else {
    omni_add_fake_generic  "CapInfo" "IRQ Enable Exists"         C_OMNI_CAP_IRQ_ENABLE_EN 0 0 1
  }
  omni_add_fake_generic  "CapInfo" "IRQ Enable Register"       C_OMNI_CAP_IRQ_ENABLE $en 0 32767
  if {$en} {
    set_parameter_property C_OMNI_CAP_IRQ_ENABLE_EN    ENABLED false
    set_parameter_property C_OMNI_CAP_IRQ_ENABLE       ENABLED false
  }


  if {$st} {
    omni_add_fake_generic  "CapInfo" "IRQ Status Exists"         C_OMNI_CAP_IRQ_STATUS_EN 1 0 1
  } else {
    omni_add_fake_generic  "CapInfo" "IRQ Status Exists"         C_OMNI_CAP_IRQ_STATUS_EN 0 0 1
  }
  omni_add_fake_generic  "CapInfo" "IRQ Status Register"       C_OMNI_CAP_IRQ_STATUS $st 0 32767
  if {$st} {
    set_parameter_property C_OMNI_CAP_IRQ_STATUS_EN    ENABLED false
    set_parameter_property C_OMNI_CAP_IRQ_STATUS       ENABLED false
  }
  set_parameter_property C_OMNI_CAP_IRQ_ENABLE_EN DISPLAY_HINT boolean--
  set_parameter_property C_OMNI_CAP_IRQ_STATUS_EN DISPLAY_HINT boolean--

  set_parameter_property C_OMNI_CAP_TYPE    ENABLED false
  set_parameter_property C_OMNI_CAP_VERSION ENABLED false
  set_parameter_property C_OMNI_CAP_SIZE    ENABLED false

}

# The QUARTUS_INI SYSTEM_INFO parameter used to display/hide the capability tab on GUI
add_parameter          CAP_ENABLED_INI  BOOLEAN          false
set_parameter_property CAP_ENABLED_INI  DESCRIPTION      "Whether the dla_ocs_enabled ini is enabled"
set_parameter_property CAP_ENABLED_INI  SYSTEM_INFO      QUARTUS_INI
set_parameter_property CAP_ENABLED_INI  SYSTEM_INFO_ARG  "dla_ocs_enabled"
set_parameter_property CAP_ENABLED_INI  VISIBLE false

proc check_ocs_ini {} {
  set ocs_enabled_ini [get_parameter_value CAP_ENABLED_INI]
  set_display_item_property  "Capability Info" VISIBLE $ocs_enabled_ini
}

# Interface

###################################################################################
#
#
#
###################################################################################
proc add_clk { name } {
  add_interface ${name} clock end
  set_interface_property ${name} clockRate 0
  set_interface_property ${name} ENABLED true
  add_interface_port ${name} ${name} clk Input 1
}

###################################################################################
#
#
#
###################################################################################
proc add_rstn { name clk } {

  add_interface ${name} reset end
  set_interface_property ${name} associatedClock $clk
  set_interface_property ${name} synchronousEdges DEASSERT
  set_interface_property ${name} ENABLED true
  add_interface_port ${name} ${name} reset_n Input 1
}

###################################################################################
#
#
#
###################################################################################
proc dla_add_axi4lite_slave_interface { prefix clk rst }  {

  set master_out "Input"
  set master_in  "Output"
  set direction "end"

  # align with Omnitek naming standard
  set parameter_prefix "C_[string toupper $prefix]"

  # refer to parameters set in core_hw.tcl
  set data_width ${parameter_prefix}_DATA_WIDTH
  set addr_width ${parameter_prefix}_ADDR_WIDTH
  
  ######################################################################################
  add_interface $prefix axi4lite $direction
  set_interface_property $prefix associatedClock $clk
  set_interface_property $prefix associatedReset $rst

  # copied this from qsys standard axi4lite slave interface template
  set_interface_property $prefix readAcceptanceCapability 1
  set_interface_property $prefix writeAcceptanceCapability 1
  set_interface_property $prefix combinedAcceptanceCapability 1
  set_interface_property $prefix bridgesToMaster ""
  set_interface_property $prefix ENABLED true
  set_interface_property $prefix EXPORT_OF ""
  set_interface_property $prefix PORT_NAME_MAP ""
  set_interface_property $prefix CMSIS_SVD_VARIABLES ""
  set_interface_property $prefix SVD_ADDRESS_GROUP ""
  set_interface_property $prefix IPXACT_REGISTER_MAP_VARIABLES ""

  add_interface_port $prefix ${prefix}_awaddr awaddr $master_out $addr_width
  add_interface_port $prefix ${prefix}_awvalid awvalid $master_out 1
  add_interface_port $prefix ${prefix}_awready awready $master_in 1
  add_interface_port $prefix ${prefix}_wdata wdata $master_out $data_width
  add_interface_port $prefix ${prefix}_wready wready $master_in 1
  add_interface_port $prefix ${prefix}_wvalid wvalid $master_out 1
  add_interface_port $prefix ${prefix}_wstrb wstrb $master_out ($data_width/8)
  add_interface_port $prefix ${prefix}_bresp bresp $master_in 2
  add_interface_port $prefix ${prefix}_bvalid bvalid $master_in 1
  add_interface_port $prefix ${prefix}_bready bready $master_out 1
  add_interface_port $prefix ${prefix}_rdata rdata $master_in $data_width
  add_interface_port $prefix ${prefix}_rresp rresp $master_in 2
  add_interface_port $prefix ${prefix}_rvalid rvalid $master_in 1
  add_interface_port $prefix ${prefix}_rready rready $master_out 1
  add_interface_port $prefix ${prefix}_araddr araddr $master_out $addr_width
  add_interface_port $prefix ${prefix}_arvalid arvalid $master_out 1
  add_interface_port $prefix ${prefix}_arready arready $master_in 1
  add_interface_port $prefix ${prefix}_awprot awprot $master_out 3
  add_interface_port $prefix ${prefix}_arprot arprot $master_out 3

}

###################################################################################
#
#
#
###################################################################################
proc dla_add_axi4_master_interface { prefix clk rst }  {

  set master_out "Output"
  set master_in  "Input"
  set direction "start"
  
  # align with Omnitek naming standard
  # also aligns with how parameters are declared in core_hw.tcl
  set parameter_prefix "C_[string toupper $prefix]"

  # refer to parameters set in core_hw.tcl
  set addr_width      ${parameter_prefix}_ADDR_WIDTH
  set read_id_width   ${parameter_prefix}_THREAD_ID_WIDTH
  set data_width      ${parameter_prefix}_DATA_WIDTH
  ######################################################################################
  add_interface $prefix axi4 $direction
  set_interface_property $prefix associatedClock $clk
  set_interface_property $prefix associatedReset $rst
  
  # copied this from qsys standard axi4 master interface template
  set_interface_property $prefix readIssuingCapability 16
  set_interface_property $prefix writeIssuingCapability 16
  set_interface_property $prefix combinedIssuingCapability 16
  set_interface_property $prefix issuesINCRBursts true
  set_interface_property $prefix issuesWRAPBursts false
  set_interface_property $prefix issuesFIXEDBursts false
  set_interface_property $prefix ENABLED true
  set_interface_property $prefix EXPORT_OF ""
  set_interface_property $prefix PORT_NAME_MAP ""
  set_interface_property $prefix CMSIS_SVD_VARIABLES ""
  set_interface_property $prefix SVD_ADDRESS_GROUP ""
  set_interface_property $prefix IPXACT_REGISTER_MAP_VARIABLES ""

  add_interface_port $prefix ${prefix}_awvalid awvalid $master_out 1
  add_interface_port $prefix ${prefix}_awprot awprot $master_out 3
  add_interface_port $prefix ${prefix}_awlen awlen $master_out 8
  add_interface_port $prefix ${prefix}_awready awready $master_in 1
  add_interface_port $prefix ${prefix}_awsize awsize $master_out 3
  add_interface_port $prefix ${prefix}_awburst awburst $master_out 2
  add_interface_port $prefix ${prefix}_arvalid arvalid $master_out 1
  add_interface_port $prefix ${prefix}_arprot arprot $master_out 3
  add_interface_port $prefix ${prefix}_arlen arlen $master_out 8
  add_interface_port $prefix ${prefix}_arready arready $master_in 1
  add_interface_port $prefix ${prefix}_arsize arsize $master_out 3
  add_interface_port $prefix ${prefix}_arburst arburst $master_out 2  
  add_interface_port $prefix ${prefix}_rvalid rvalid $master_in 1
  add_interface_port $prefix ${prefix}_rready rready $master_out 1
  add_interface_port $prefix ${prefix}_wvalid wvalid $master_out 1
  add_interface_port $prefix ${prefix}_wlast wlast $master_out 1
  add_interface_port $prefix ${prefix}_wready wready $master_in 1
  add_interface_port $prefix ${prefix}_bvalid bvalid $master_in 1
  add_interface_port $prefix ${prefix}_bready bready $master_out 1
  add_interface_port $prefix ${prefix}_awaddr awaddr $master_out $addr_width
  add_interface_port $prefix ${prefix}_awid awid $master_out $read_id_width
  add_interface_port $prefix ${prefix}_araddr araddr $master_out $addr_width
  add_interface_port $prefix ${prefix}_arid arid $master_out $read_id_width
  add_interface_port $prefix ${prefix}_rdata rdata $master_in $data_width
  add_interface_port $prefix ${prefix}_rid rid $master_in $read_id_width
  add_interface_port $prefix ${prefix}_wdata wdata $master_out $data_width
  add_interface_port $prefix ${prefix}_wstrb wstrb $master_out ($data_width/8)
  add_interface_port $prefix ${prefix}_bid bid $master_in $read_id_width
}

###################################################################################
#
#
#
###################################################################################
# Todo: this function doesn't attach a reset to the interrupt
proc omni_add_interrupt_port { name clk ctrl dir { size 1 } }  {

  if {$dir == "input"} {
    set direction "start"
  } else {
    set direction "end"
  }

  add_interface $name interrupt $direction
  set_interface_property $name associatedClock $clk
  set_interface_property $name irqScheme INDIVIDUAL_REQUESTS
  add_interface_port $name $name irq $dir $size

  if {$dir == "input"} {
  } else {
    set_interface_property $name associatedAddressablePoint $ctrl
  }

}