天天看點

關于non-project模式的點滴記錄1——别忘了建立工程

作者:老牛搬嫩磚

最近在做一個通用設計,需要根據不同的需求産生網表檔案供其他人使用。不同參數的組合大概有1200種,如果每中需求都做一個工程并存檔,重複工作太多,也很繁瑣。忽然想到這種情況很适合使用non-project模式。

面對一個新需求,隻需要修改幾個參數,輸入一行指令,就可以得到結果。同時隻保留網表檔案和編譯資訊也非常節省硬碟空間。

以下是TCL腳本的大緻結構。

關于non-project模式的點滴記錄1——别忘了建立工程

其中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被鎖定。

關于non-project模式的點滴記錄1——别忘了建立工程

重新生成Block design也未能解決問題。後來在ug939中看到這麼一段話。

關于non-project模式的點滴記錄1——别忘了建立工程

在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

繼續閱讀