af_run.tcl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. set ALTA_SUPRA true
  2. set sh_continue_on_error false
  3. set sh_echo_on_source true
  4. set sh_quiet_on_source true
  5. set cc_critical_as_fatal true
  6. set rt_incremental_route true
  7. set ta_report_auto 1
  8. set ta_report_auto_constraints $ta_report_auto
  9. if { ! [info exists RESULT_DIR] } {
  10. set RESULT_DIR "."
  11. } elseif { ! [info exists alta_work] } {
  12. set alta_work [file join ${RESULT_DIR} alta_db]
  13. }
  14. if { ! [info exists DEVICE] } {
  15. set DEVICE "AGRV2KL100"
  16. }
  17. if { [info exists DESIGN] && ! [info exists TOP_MODULE] } {
  18. set TOP_MODULE "$DESIGN"
  19. }
  20. if { ! [info exists DESIGN] } {
  21. set DESIGN "fpga_boot"
  22. }
  23. if { ! [info exists TOP_MODULE] } {
  24. set TOP_MODULE "fpga_boot"
  25. }
  26. if { ! [info exists IP_FILES] } {
  27. set IP_FILES {}
  28. }
  29. if { ! [info exists SDC_FILE] } {
  30. set SDC_FILE ""
  31. }
  32. if { ! [info exists VE_FILE] } {
  33. set VE_FILE ""
  34. }
  35. if { ! [info exists AGF_FILE] } {
  36. set AGF_FILE ""
  37. }
  38. if { ! [info exists VEX_FILE] } {
  39. set VEX_FILE "fpga_boot.vex"
  40. }
  41. if { $VEX_FILE == "" && $VE_FILE != "" } {
  42. set VEX_FILE $VE_FILE
  43. }
  44. if { ! [info exists TIMING_DERATE] } {
  45. set TIMING_DERATE {1.000000 1.000000}
  46. }
  47. if { [info exists NO_ROUTE] && $NO_ROUTE } {
  48. set no_route "-no_route"
  49. } else {
  50. set no_route ""
  51. }
  52. if { [info exist NON_USER_IO] && $NON_USER_IO } {
  53. set user_io ""
  54. } else {
  55. set user_io "-user_io"
  56. }
  57. if { ! [info exists RETRY] } { set RETRY 0 }
  58. if { ! [info exists SEED ] } { set SEED 666 }
  59. set seed_rand ""
  60. if { $SEED == 0 } { set seed_rand "-seed_rand" }
  61. if { [info exists QUARTUS_SDC] } {
  62. set sdc_remove_quartus_column_name $QUARTUS_SDC
  63. }
  64. if { ! [info exists ORG_PLACE] } { set ORG_PLACE false }
  65. if { ! [info exists MODE] } { set MODE "QUARTUS" }
  66. if { ! [info exists FLOW] } { set FLOW "ALL" }
  67. if { $FLOW == "PROBE" } {
  68. if { ! [info exists PROBE_FORCE] } { set PROBE_FORCE false }
  69. if { ! [info exists PREFIX] } { set PREFIX "probe_" }
  70. }
  71. if { ! [info exists PREFIX] } {
  72. set RESULT $DESIGN
  73. } else {
  74. set RESULT $PREFIX$DESIGN
  75. }
  76. if { $FLOW == "GEN" || $FLOW == "PACK" || $FLOW == "LOAD" } { set no_route "-no_route" }
  77. set RUN "run"
  78. if { $FLOW == "CHECK" } {
  79. set RUN "check"
  80. } elseif { $FLOW == "PROBE" } {
  81. set RUN "probe"
  82. } elseif { $FLOW == "GEN" } {
  83. set RUN "gen"
  84. }
  85. if { ! [info exists alta_logs] } {
  86. set alta_logs [file join ${RESULT_DIR} alta_logs]
  87. }
  88. file mkdir $alta_logs
  89. alta::begin_log_cmd [file join $alta_logs ${RUN}.log] [file join $alta_logs ${RUN}.err]
  90. alta::tcl_whisper "Cmd : [alta::prog_path] [alta::prog_version]([alta::prog_subversion])\n"
  91. alta::tcl_whisper "Args : [string map {\{ \" \} \"} $tcl_cmd_args]\n"
  92. set_seed_rand $SEED
  93. set ar_timing_derate ${TIMING_DERATE}
  94. date_time
  95. if { [file exists [file join . ${DESIGN}.pre.asf]] } {
  96. alta::tcl_highlight "Using pre-ASF file ${DESIGN}.pre.asf.\n"
  97. source [file join . ${DESIGN}.pre.asf]
  98. }
  99. set LOAD_DB false
  100. set LOAD_PLACE false
  101. set LOAD_ROUTE false
  102. set LOAD_PACK false
  103. if { $FLOW == "LOAD" || $FLOW == "CHECK" || $FLOW == "PROBE" } {
  104. set LOAD_DB true
  105. set LOAD_PLACE true
  106. set LOAD_ROUTE true
  107. } elseif { $FLOW == "R" || $FLOW == "ROUTE" } {
  108. set LOAD_DB true
  109. set LOAD_PLACE true
  110. } elseif { $FLOW == "PR" || $FLOW == "PLACE_AND_ROUTE" } {
  111. set LOAD_DB false
  112. set LOAD_PACK true
  113. }
  114. set ORIGINAL_QSF "./fpga_boot.qsf"
  115. set ORIGINAL_PIN ""
  116. #################################################################################
  117. # The default SDC file is ${DESIGN}.sdc
  118. set sdc_file $SDC_FILE
  119. if { $sdc_file == "" } {
  120. set sdc_file [file join . ${DESIGN}.adc]
  121. if { ! [file exists $sdc_file] } { set sdc_file [file join . ${DESIGN}.sdc]; }
  122. }
  123. # No default VE file is not specified
  124. set ve_file $VEX_FILE
  125. while (1) {
  126. if { $FLOW == "SKIP" } { break }
  127. if { [info exists CORNER] } { set_mode -corner $CORNER; }
  128. eval "load_architect ${no_route} -type ${DEVICE} 1 1 1000 1000"
  129. foreach ip_file $IP_FILES { read_ip $ip_file; }
  130. if { $FLOW == "GEN" } {
  131. if { ! [info exists CONFIG_BITS] } {
  132. set CONFIG_BITS [file join ${RESULT_DIR} ${DESIGN}.bin]
  133. }
  134. if { [llength $CONFIG_BITS] > 1 } {
  135. if { ! [info exists BOOT_BINARY] } {
  136. set BOOT_BINARY [file join ${RESULT_DIR} ${DESIGN}_boot.bin]
  137. }
  138. if { ! [info exists CONFIG_ADDRESSES] } {
  139. set CONFIG_ADDRESSES ""
  140. }
  141. generate_binary -master $BOOT_BINARY -inputs $CONFIG_BITS -address $CONFIG_ADDRESSES
  142. } else {
  143. set CONFIG_ROOT [file rootname [lindex $CONFIG_BITS 0]]
  144. set SLAVE_RBF "${CONFIG_ROOT}_slave.rbf"
  145. set MASTER_BINARY "${CONFIG_ROOT}_master.bin"
  146. if { [file exists [lindex $CONFIG_BITS 0]] } {
  147. generate_binary -slave $SLAVE_RBF -inputs [lindex $CONFIG_BITS 0] -reverse
  148. generate_binary -master $MASTER_BINARY -inputs [lindex $CONFIG_BITS 0]
  149. }
  150. if { ! [info exists BOOT_BINARY] } {
  151. set BOOT_BINARY $MASTER_BINARY
  152. }
  153. }
  154. set PRG_FILE [file rootname $BOOT_BINARY].prg
  155. set AS_FILE [file rootname $BOOT_BINARY]_as.prg
  156. generate_programming_file $BOOT_BINARY -erase $ERASE \
  157. -program $PROGRAM -verify $VERIFY -offset $OFFSET \
  158. -prg $PRG_FILE -as $AS_FILE
  159. break
  160. }
  161. if { $LOAD_DB } {
  162. load_db -top ${TOP_MODULE}
  163. if { [file exists $sdc_file] } { read_sdc $sdc_file; }
  164. } elseif { $MODE == "QUARTUS" } {
  165. set verilog ${DESIGN}.vo
  166. set is_migrated false
  167. if { ! [file exists $verilog] } {
  168. set verilog [file join . simulation modelsim ${DESIGN}.vo]
  169. set is_migrated true
  170. }
  171. if { ! [file exists $verilog] } {
  172. error "Can not find design verilog file $verilog"
  173. }
  174. alta::tcl_highlight "Using design verilog file $verilog.\n"
  175. if { $ve_file != "" && ! [file exists $ve_file] } {
  176. alta::tcl_warn "Can not find design VE file $ve_file"
  177. set ve_file ""
  178. } else {
  179. alta::tcl_highlight "Using design VE file $ve_file.\n"
  180. }
  181. set ret [read_design -top ${TOP_MODULE} -ve $ve_file -qsf $ORIGINAL_QSF $verilog -hierachy 1]
  182. if { !$ret } { exit -1; }
  183. if { $sdc_file != "" && ! [file exists $sdc_file] } {
  184. alta::tcl_warn "Can not find design SDC file $sdc_file"
  185. set sdc_file ""
  186. } else {
  187. alta::tcl_highlight "Using design SDC file $sdc_file.\n"
  188. read_sdc $sdc_file
  189. }
  190. } elseif { $MODE == "SYNPLICITY" || $MODE == "NATIVE" } {
  191. set_hierarchy_separator .
  192. set db_gclk_assignment_level 2
  193. set verilog ${DESIGN}.vqm
  194. set is_migrated false
  195. if { ! [file exists $verilog] } {
  196. error "Can not find design verilog file $verilog"
  197. }
  198. if { $VEX_FILE != "" } {
  199. if { $VEX_FILE == "-" } {
  200. set VEX_FILE ""
  201. } elseif { ! [file exists $VEX_FILE] } {
  202. error "Can not find design VE file $VEX_FILE"
  203. }
  204. }
  205. if { $AGF_FILE != "" } {
  206. if { $AGF_FILE == "-" } {
  207. set AGF_FILE ""
  208. } elseif { ! [file exists $AGF_FILE] } {
  209. error "Can not find design AGF file $AGF_FILE"
  210. }
  211. }
  212. set alta0_asf [file join $::alta_work alta0.asf]
  213. set alta0_apf [file join $::alta_work alta0.apf]
  214. file delete -force $alta0_asf
  215. file delete -force $alta0_apf
  216. if { $AGF_FILE != "" || $VEX_FILE != "" } {
  217. alta::convert_pio_settings_cmd $VEX_FILE $AGF_FILE $alta0_asf $alta0_apf
  218. }
  219. alta::tcl_highlight "Using design verilog file $verilog.\n"
  220. if { $sdc_file != "" && ! [file exists $sdc_file] } {
  221. alta::tcl_warn "Can not find design SDC file $sdc_file"
  222. set sdc_file ""
  223. } else {
  224. alta::tcl_highlight "Using design SDC file $sdc_file.\n"
  225. }
  226. set load_pack ""
  227. if { $LOAD_PACK } { set load_pack "-load_pack"; }
  228. set ret [eval "read_design_and_pack $load_pack -sdc {$sdc_file} -top ${TOP_MODULE} -type vqm -gclk_level 2 $verilog"]
  229. set FITTER "full"
  230. if { !$ret } { exit -1; }
  231. } else {
  232. error "Unsupported mode $MODE"
  233. }
  234. if { $FLOW == "PACK" } { break }
  235. if { [info exists FITTING] } {
  236. if { $FITTING == "Auto" } { set FITTING auto; }
  237. set_mode -fitting $FITTING
  238. }
  239. if { [info exists FITTER] } {
  240. if { $FITTER == "Auto" } {
  241. if { $MODE == "QUARTUS" } { set FITTER hybrid; } else { set FITTER full; }
  242. }
  243. if { $MODE == "SYNPLICITY" || $MODE == "NATIVE" } { set FITTER full; }
  244. set_mode -fitter $FITTER
  245. }
  246. if { [info exists EFFORT] } { set_mode -effort $EFFORT; }
  247. if { [info exists SKEW ] } { set_mode -skew $SKEW ; }
  248. if { [info exists SKOPE ] } { set_mode -skope $SKOPE ; }
  249. if { [info exists HOLDX ] } { set_mode -holdx $HOLDX; }
  250. if { [info exists TUNING] } { set_mode -tuning $TUNING; }
  251. if { [info exists TARGET] } { set_mode -target $TARGET; }
  252. if { [info exists PRESET] } { set_mode -preset $PRESET; }
  253. if { [info exists ADJUST] } { set pl_criticality_wadjust $ADJUST; }
  254. set alta_aqf [file join $::alta_work alta.aqf]
  255. if { $LOAD_DB } {
  256. # Empty
  257. } else {
  258. file delete -force $alta_aqf
  259. if { true } {
  260. if { $ORIGINAL_PIN != "" } {
  261. if { [file exists $VE_FILE] } {
  262. set ORIGINAL_PIN ""
  263. } elseif { $ORIGINAL_PIN == "-" } {
  264. set ORIGINAL_PIN ""
  265. } elseif { ! [file exists $ORIGINAL_PIN] } {
  266. if { $is_migrated } {
  267. error "Can not find design PIN file $ORIGINAL_PIN, please compile design first"
  268. }
  269. set ORIGINAL_PIN ""
  270. }
  271. }
  272. if { $ORIGINAL_QSF != "" } {
  273. if { $ORIGINAL_QSF == "-" } {
  274. set ORIGINAL_QSF ""
  275. } elseif { ! [file exists $ORIGINAL_QSF] } {
  276. if { $is_migrated } {
  277. error "Can not find design exported QSF file $ORIGINAL_QSF, please export assigments first"
  278. }
  279. }
  280. }
  281. if { $ORIGINAL_QSF != "" || $ORIGINAL_PIN != "" } {
  282. alta::convert_quartus_settings_cmd $ORIGINAL_QSF $ORIGINAL_PIN $alta_aqf
  283. }
  284. }
  285. }
  286. if { [file exists "$alta_aqf"] } {
  287. alta::tcl_highlight "Using AQF file $alta_aqf.\n"
  288. source "$alta_aqf"
  289. }
  290. if { [file exists [file join . ${DESIGN}.asf]] } {
  291. alta::tcl_highlight "Using ASF file ${DESIGN}.asf.\n"
  292. source [file join . ${DESIGN}.asf]
  293. }
  294. if { $FLOW == "PROBE" } {
  295. set ret [eval "place_pseudo ${user_io} -place_io -place_pll -place_gclk"]
  296. if { !$ret } { exit -1 }
  297. set force ""
  298. if { [info exists PROBE_FORCE] && $PROBE_FORCE } { set force "-force" }
  299. eval "probe_design -froms {${PROBE_FROMS}} -tos {${PROBE_TOS}} ${force}"
  300. } elseif { $FLOW == "CHECK" } {
  301. set ret [eval "place_pseudo ${user_io} -place_io -place_pll -place_gclk"]
  302. if { !$ret } { exit -1 }
  303. if { [file exists [file join . ${DESIGN}.chk]] } {
  304. alta::tcl_highlight "Using CHK file ${DESIGN}.chk.\n"
  305. source [file join . ${DESIGN}.chk]
  306. place_design -dry
  307. check_design -rule led_guide
  308. } else {
  309. error "Can not find design CHECK file ${DESIGN}.chk"
  310. }
  311. } else {
  312. set ret [eval "place_pseudo ${user_io} -place_io -place_pll -place_gclk -warn_io"]
  313. if { !$ret } { exit -1 }
  314. set org_place ""
  315. set load_place ""
  316. set load_route ""
  317. set quiet ""
  318. if { $ORG_PLACE } { set org_place "-org_place" ; }
  319. if { $LOAD_PLACE } { set load_place "-load_place"; }
  320. if { $LOAD_ROUTE } { set load_route "-load_route"; }
  321. eval "place_and_route_design $org_place $load_place $load_route \
  322. -retry $RETRY $seed_rand $quiet"
  323. }
  324. date_time
  325. if { $FLOW != "CHECK" } {
  326. if { $FLOW != "PROBE" } {
  327. report_timing -verbose 2 -setup -file $::alta_work/setup.rpt.gz
  328. report_timing -verbose 1 -setup -file $::alta_work/setup_summary.rpt
  329. report_timing -verbose 2 -hold -file $::alta_work/hold.rpt.gz
  330. report_timing -verbose 1 -hold -file $::alta_work/hold_summary.rpt
  331. set ta_report_auto_constraints 0
  332. report_timing -fmax -file $::alta_work/fmax.rpt
  333. report_timing -xfer -file $::alta_work/xfer.rpt
  334. set ta_report_auto_constraints $ta_report_auto
  335. set ta_dump_uncovered 1
  336. report_timing -verbose 1 -coverage >! $::alta_work/coverage.rpt.gz
  337. set ta_dump_uncovered -1
  338. if { ! [info exists rt_report_timing_fast] } {
  339. set rt_report_timing_fast false
  340. }
  341. if { $rt_report_timing_fast } {
  342. set_timing_corner fast
  343. route_delay -quiet
  344. report_timing -verbose 2 -setup -file $::alta_work/setup_fast.rpt.gz
  345. report_timing -verbose 1 -setup -file $::alta_work/setup_fast_summary.rpt
  346. report_timing -verbose 2 -hold -file $::alta_work/hold_fast.rpt.gz
  347. report_timing -verbose 1 -hold -file $::alta_work/hold_fast_summary.rpt
  348. set ta_report_auto_constraints 0
  349. report_timing -fmax -file $::alta_work/fmax_fast.rpt
  350. report_timing -xfer -file $::alta_work/xfer_fast.rpt
  351. set ta_report_auto_constraints $ta_report_auto
  352. }
  353. write_routed_design "${RESULT_DIR}/${RESULT}_routed.v"
  354. }
  355. bitgen normal -prg "${RESULT_DIR}/${RESULT}.prg" -bin "${RESULT_DIR}/${RESULT}.bin"
  356. if { true } {
  357. alta::bin_to_asc "${RESULT_DIR}/${RESULT}.bin" "${RESULT_DIR}/${RESULT}.inc"
  358. set python_exe [expr {$tcl_platform(platform) eq "unix" ? "python3" : "python.exe"}]
  359. if { ! [ info exist BATCH_ARG ] } {
  360. set BATCH_ARG ""
  361. }
  362. set LOGIC_COMPRESS [alta::get_global_assignment_cmd ON_CHIP_BITSTREAM_DECOMPRESSION false]
  363. if { [string toupper $LOGIC_COMPRESS] != "OFF" } {
  364. set BATCH_ARG "$BATCH_ARG --logic-compress"
  365. }
  366. set BATCH_MCU 0xbff5105000730062aa234371030002b7
  367. if { [info exists BATCH_HSE] } {
  368. set BATCH_MCU 0xbff5105000730062a62343110062aa234371030002b7
  369. }
  370. set GEN_BATCH "{[alta::prog_home]/python_dist/$python_exe} {[alta::prog_home]/pio/gen_batch}\
  371. -d [[alta::get_device_info_cmd $DEVICE] device_id]\
  372. -i $BATCH_MCU\
  373. -o ${RESULT_DIR}/${RESULT}_batch.bin\
  374. --logic-config ${RESULT_DIR}/${RESULT}.bin\
  375. --logic-address 0x80007000\
  376. $BATCH_ARG"
  377. alta::tcl_highlight "Generating batch file: $GEN_BATCH\n"
  378. eval "exec $GEN_BATCH"
  379. } else {
  380. bitgen sram -prg "${RESULT_DIR}/${RESULT}_sram.prg"
  381. bitgen download -bin "${RESULT_DIR}/${RESULT}.bin" -svf "${RESULT_DIR}/${RESULT}_download.svf"
  382. generate_binary -slave "${RESULT_DIR}/${RESULT}_slave.rbf" \
  383. -inputs "${RESULT_DIR}/${RESULT}.bin" -reverse
  384. generate_binary -master "${RESULT_DIR}/${RESULT}_master.bin" \
  385. -inputs "${RESULT_DIR}/${RESULT}.bin"
  386. generate_programming_file "${RESULT_DIR}/${RESULT}_master.bin" -prg "${RESULT_DIR}/${RESULT}_master.prg" \
  387. -as "${RESULT_DIR}/${RESULT}_master_as.prg" -hybrid "${RESULT_DIR}/${RESULT}_hybrid.prg"
  388. }
  389. }
  390. break
  391. }
  392. if { [file exists "./${DESIGN}.post.asf"] } {
  393. alta::tcl_highlight "Using post-ASF file ${DESIGN}.post.asf.\n"
  394. source "./${DESIGN}.post.asf"
  395. }
  396. date_time
  397. exit