summaryrefslogtreecommitdiff
path: root/python/openvino/demo/ip/intel_ai_ip/core_hw.tcl
blob: 9598ffd343bfc7b29898a7c045563d91ea0df9a2 (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
package require -exact qsys 19.2
package require altera_terp

set_module_property NAME intel_ai_ip
set_module_property VERSION 0.6
set_module_property ICON_PATH logo.jpg
set_module_property EDITABLE false
set_module_property AUTHOR "Intel Corporation"
set_module_property INSTANTIATE_IN_SYSTEM_MODULE true
set_module_property INTERNAL false

add_fileset synthesis_files QUARTUS_SYNTH my_generate

set_fileset_property synthesis_files TOP_LEVEL intel_ai_ip
proc render_top_level {} {
  # get template
  set template_path "./verilog/intel_ai_ip.sv.terp"
  set template_fd [open $template_path]
  set template   [read $template_fd]
  close $template_fd
  set existing_arch [glob -directory "./verilog/" -tails -type d *]
  set params(archs) $existing_arch
  set contents [altera_terp $template params]
  return $contents
}
add_fileset_file intel_ai_ip/intel_ai_ip.sv SYSTEM_VERILOG TEXT [render_top_level]

source ./static_files.tcl

proc my_generate { entity } {
    set architecture [get_parameter_value ARCH_OPTION]
    source ./verilog/$architecture/generated_files.tcl
}

#DLA ARCHITECTURE
set existing_arch [glob -directory "./verilog/" -tails -type d *]
add_display_item "" "AI IP Core Architecture" GROUP tab
set arch_option_param ARCH_OPTION
add_parameter           $arch_option_param  STRING [lindex $existing_arch 0]
set_parameter_property  $arch_option_param  ALLOWED_RANGES  $existing_arch
set_parameter_property  $arch_option_param  DISPLAY_NAME    "Architecture"
set_parameter_property  $arch_option_param  DESCRIPTION     "Architecture"
set_parameter_property  $arch_option_param  AFFECTS_GENERATION true
set_parameter_property  $arch_option_param  HDL_PARAMETER   true
add_display_item "AI IP Core Architecture" $arch_option_param  parameter


set_module_property DESCRIPTION "The Intel FPGA AI Suite is an AI Engine."
set_module_property DISPLAY_NAME "Intel FPGA AI Suite"

source ./dla_helper.tcl

add_clk                dla_clk
add_clk                ddr_clk
add_clk                irq_clk
# the reset must be associated to a clock
add_rstn               dla_resetn   dla_clk

# CSR Parameters
add_display_item "" "CSR Parameters" GROUP tab

set param C_CSR_AXI_ADDR_WIDTH
add_parameter           $param  INTEGER         0
set_parameter_property  $param  DISPLAY_NAME    "Address Width"
set_parameter_property  $param  DISPLAY_UNITS   "bits"
set_parameter_property  $param  HDL_PARAMETER   true
set_parameter_property  $param  DESCRIPTION     "AXI4-Lite Address Width."
set_parameter_property  $param  VISIBLE         true
set_parameter_property  $param  DERIVED         true
add_display_item "CSR Parameters" $param  parameter

set param C_CSR_AXI_DATA_WIDTH
add_parameter           $param  INTEGER         0
set_parameter_property  $param  DISPLAY_NAME    "Data Width"
set_parameter_property  $param  DISPLAY_UNITS   "bits"
set_parameter_property  $param  HDL_PARAMETER   true
set_parameter_property  $param  DESCRIPTION     "AXI4-Lite Data Width."
set_parameter_property  $param  VISIBLE         true
set_parameter_property  $param  DERIVED         true
add_display_item "CSR Parameters" $param  parameter


# DDR Parameters
add_display_item "" "DDR Parameters" GROUP tab

set param C_DDR_AXI_ADDR_WIDTH
add_parameter           $param  INTEGER         0
set_parameter_property  $param  DISPLAY_NAME    "Address Width"
set_parameter_property  $param  DISPLAY_UNITS   "bits"
set_parameter_property  $param  HDL_PARAMETER   true
set_parameter_property  $param  DESCRIPTION     "AXI4 Address Width."
set_parameter_property  $param  VISIBLE         true
set_parameter_property  $param  DERIVED         true
add_display_item "DDR Parameters" $param  parameter

set param C_DDR_AXI_DATA_WIDTH
add_parameter           $param  INTEGER         0
set_parameter_property  $param  DISPLAY_NAME    "Data Width"
set_parameter_property  $param  DISPLAY_UNITS   "bits"
set_parameter_property  $param  HDL_PARAMETER   true
set_parameter_property  $param  DESCRIPTION     "AXI4 Data Width."
set_parameter_property  $param  VISIBLE         true
set_parameter_property  $param  DERIVED         true
add_display_item "DDR Parameters" $param  parameter

set param C_DDR_AXI_BURST_WIDTH
# Warning: omni_add_axi4_interface uses a constant of 2, but the rtl's default value is 4.
add_parameter           $param  INTEGER         0
set_parameter_property  $param  DISPLAY_NAME    "Burst Width"
set_parameter_property  $param  DISPLAY_UNITS   "bits"
set_parameter_property  $param  HDL_PARAMETER   false
set_parameter_property  $param  DESCRIPTION     "AXI4 Burst Width. Length = 2**Width."
set_parameter_property  $param  VISIBLE         true
set_parameter_property  $param  DERIVED         true
add_display_item "DDR Parameters" $param  parameter

set param C_DDR_AXI_THREAD_ID_WIDTH
add_parameter           $param  INTEGER         0
set_parameter_property  $param  DISPLAY_NAME    "ID"
set_parameter_property  $param  DISPLAY_UNITS   "bits"
set_parameter_property  $param  HDL_PARAMETER   true
set_parameter_property  $param  DESCRIPTION     "AXI4 ID Width."
set_parameter_property  $param  VISIBLE         true
set_parameter_property  $param  DERIVED         true
add_display_item "DDR Parameters" $param  parameter

# DLA Parameters
# todo: either enable this or remove it before release
add_display_item "" "DLA Parameters" GROUP tab
set_display_item_property "DLA Parameters" VISIBLE false
# the parameters need to be defined first, and modified in elaboration
set param C_CONFIG_READER_DATA_BYTES
add_parameter           $param  INTEGER         8
set_parameter_property  $param  DISPLAY_NAME    "Config Input Width"
set_parameter_property  $param  DISPLAY_UNITS   "bytes"
set_parameter_property  $param  DESCRIPTION     "Config network input port width"
set_parameter_property  $param  VISIBLE         false
set_parameter_property  $param  DERIVED         true
add_display_item "DLA Parameters" $param  parameter

omni_add_capability 949 1 2048 0 0

add_elab_callback my_elab
add_validation_callback check_family
# check if an INI is set to display capability tab
add_validation_callback check_ocs_ini

proc my_elab {} {

  set architecture [get_parameter_value ARCH_OPTION]
  source ./verilog/$architecture/interface_param.tcl

  dla_add_axi4lite_slave_interface  csr_axi       ddr_clk     dla_resetn
  dla_add_axi4_master_interface     ddr_axi       ddr_clk     dla_resetn

  omni_add_interrupt_port           irq_level     irq_clk     csr_axi output

}

# return the family string used by quartus
proc get_arch_family { arch_name } {
  set splitted_name [split $arch_name "_"]
  set family [lindex $splitted_name end]
  if { $family eq "A10" } {
    return "Arria 10"
  } elseif { $family eq "C10"} {
    return "Cyclone 10 GX"
  } elseif { $family eq "S10"} {
    return "Stratix 10"
  } elseif { $family eq "AGX7"} {
    return "Agilex 7"
  } elseif { $family eq "AGX5"} {
    return "Agilex 5"
  } else {
    send_message ERROR "Invalid Family: $family"
    return "Unknown Family"
  }
}

proc check_family {} {
  set family [get_parameter_value device_family]
  set architecture [get_parameter_value ARCH_OPTION]

  set arch_family [get_arch_family $architecture]

  if { $family ne $arch_family } {
    send_message ERROR "Design uses $family but architecture is built for $arch_family"
  }
}