最近在做一個通用設計,需要根據不同的需求産生網表檔案供其他人使用。不同參數的組合大概有1200種,如果每中需求都做一個工程并存檔,重複工作太多,也很繁瑣。忽然想到這種情況很适合使用non-project模式。
面對一個新需求,隻需要修改幾個參數,輸入一行指令,就可以得到結果。同時隻保留網表檔案和編譯資訊也非常節省硬碟空間。
以下是TCL腳本的大緻結構。
其中run.tcl的内容如下。
source ./define.tcl
source ./procs.tcl
set_param general.maxThreads 8
set topName [lindex [split $TOP {.}] 0]
set topPath ${FSRC}/misc/$TOP
set xdmaBdName [lindex [split $XDMA_BD {.}] 0]
set xdmaBdPath "${FBD}/${xdmaBdName}/${XDMA_BD}"
set udwNameList {"H2C_UDW0" "C2H_UDW0" "H2C_UDW1" "C2H_UDW1"}
set uwewNameList {"H2C_UWEW0" "C2H_UWEW0" "H2C_UWEW1" "C2H_UWEW1"}
foreach udw $UDW_LIST {
set prjName "${topName}_[lindex $udw 0]_[lindex $udw 1]_[lindex $udw 2]_[lindex $udw 3]"
set nameList {}
set valueList {}
for {set i 0} {$i < 4} {incr i} {
# lappend modify a LIST directly, so do not need '#39;.
# lindex get a value from a LIST, so need '#39;.
lappend nameList [lindex $udwNameList $i]
lappend nameList [lindex $uwewNameList $i]
lappend valueList [lindex $udw $i]
set wewTemp [expr {[lindex $udw $i]/8}]
lappend valueList $wewTemp
}
changeParam "${FSRC}/header/param_def.sv" $nameList $valueList
source ./findAllFiles.tcl
readSrc $FCODE_RECORD
readSrc $FCONS_RECORD
if {[expr {$HAS_BD == "yes"}]} {
read_verilog -library xil_defaultlib ${FBD}/${xdmaBdName}/hdl/${xdmaBdName}_wrapper.v
read_bd $xdmaBdPath
generate_target all [get_files $xdmaBdPath]
}
## Do not use the full path name for '-top' option, just use the top module name
## without extension.
set status [catch {[synth_design -top $topName -part $PART -mode $SYNTH_MODE -directive $SYNTH_DIRECTIVE > ${FLOG}/${prjName}_temp.log]} msg]
if {$status} {
puts $msg
}
pureMsg ${FLOG}/${prjName}
file delete ${FLOG}/${prjName}_temp.log
write_checkpoint -force ${FDCP}/$prjName
report_timing_summary -file ${FRPT}/${prjName}.rpt
close_project
}
編譯過程中總是報如下錯誤,提示Block design中的IP被鎖定。
重新生成Block design也未能解決問題。後來在ug939中看到這麼一段話。
在non-project模式下,如果不建立im-memory工程,IP将會使用預設的器件産生輸出檔案。當該預設器件和synth_design使用的器件不同時,就會報以上的錯誤。在run.tcl中建立in-memory工程或者直接使用個set_part設定器件即可解決該問題。如添加以下指令。
create_project -in_memory -ip -part $PART xdma_inf_prj ./
如果不想建立in-memory工程也可以,使用set_part指令即可,該指令的說明如下。
Sets the part on the current project. If no project is open, then a diskless project is created.
如果之前未建立工程,set_part會建立一個diskless,也就是in-memory的工程。
知乎連接配接:
https://zhuanlan.zhihu.com/p/601792515