set script_dir [file dirname [file normalize [info script]]] set fpga_dir [file normalize [file join $script_dir ../..]] proc getenv_default {name default} { if {[info exists ::env($name)] && $::env($name) ne ""} { return $::env($name) } return $default } set mcs_file [file normalize [getenv_default FLASH_MCS [file join $fpga_dir out flash genesys2_rocket.mcs]]] set cfgmem_part [getenv_default CFGMEM_PART s25fl256sxxxxxx0-spi-x1_x2_x4] set device_pattern [getenv_default HW_DEVICE_PATTERN xc7k325t*] set flash_verify [getenv_default FLASH_VERIFY 0] set flash_erase [getenv_default FLASH_ERASE 1] set flash_region_names [split [getenv_default FLASH_REGION_NAMES "combined"] ";"] set flash_region_files_env [getenv_default FLASH_REGION_FILES ""] if {$flash_region_files_env eq ""} { set flash_region_files [list $mcs_file] } else { set flash_region_files [split $flash_region_files_env ";"] } if {[llength $flash_region_names] != [llength $flash_region_files]} { error "FLASH_REGION_NAMES and FLASH_REGION_FILES length mismatch" } foreach region_file $flash_region_files { if {![file exists $region_file]} { error "MCS file not found: $region_file" } } open_hw_manager connect_hw_server open_hw_target set dev [lindex [get_hw_devices $device_pattern] 0] if {$dev eq ""} { error "No hardware device found matching $device_pattern" } current_hw_device $dev refresh_hw_device $dev set cfg_parts [get_cfgmem_parts $cfgmem_part] if {[llength $cfg_parts] == 0} { error "Configuration memory part not found: $cfgmem_part" } create_hw_cfgmem -hw_device $dev [lindex $cfg_parts 0] set cfgmem [current_hw_cfgmem] set_property PROGRAM.ADDRESS_RANGE {use_file} $cfgmem set_property PROGRAM.BLANK_CHECK 0 $cfgmem set_property PROGRAM.ERASE $flash_erase $cfgmem set_property PROGRAM.CFG_PROGRAM 1 $cfgmem set_property PROGRAM.VERIFY $flash_verify $cfgmem set_property PROGRAM.UNUSED_PIN_TERMINATION {pull-none} $cfgmem create_hw_bitstream -hw_device $dev [get_property PROGRAM.HW_CFGMEM_BITFILE $dev] program_hw_devices $dev refresh_hw_device $dev for {set i 0} {$i < [llength $flash_region_files]} {incr i} { set region_name [lindex $flash_region_names $i] set region_file [lindex $flash_region_files $i] puts "Programming flash region '$region_name' from $region_file" set_property PROGRAM.FILES [list $region_file] $cfgmem program_hw_cfgmem $cfgmem } puts "Programmed flash $cfgmem_part" close_hw_manager