1. 程式人生 > 其它 >FPGA輔助設計指令碼——Tcl

FPGA輔助設計指令碼——Tcl

Tcl(讀Tickle)全稱(Tool Command Language),是一種簡單易學又十分強大的指令碼語言,在數字積體電路設計中應用十分廣泛。

  • 利用Tcl指令碼,就可以完成工程的建立、綜合、佈局佈線、引腳約束時序約束等過程。
  • Tcl指令碼還可以輕鬆的儲存和匯出現有工程檔案的約束和配置,然後移植到其他工程中。
  • Tcl指令碼在Modelsim模擬中也有著十分廣泛的應用。

一、Vivado Tcl使用

1.建立工程

  利用Tcl建立工程,配置相關晶片訊號、設定工程路徑、建立工程名稱相關工程的基本引數,一鍵完成新工程使用。

    #設定器件型號
    set device_model xc7z035fbg676-2
#設定工程建立路徑 set dev_dir {G:\DeskTop\ZynqCode\11_Tcl_test} #切換到工程路徑 cd $dev_dir #顯示工程路徑 puts "The home_dir is $dev_dir now!" #工程名稱 set project_name tlc_test #建立工程 create_project $project_name $dev_dir -part $device_model #設定模擬語言為 verilog set_property simulator_language Verilog [current_project]

2.新增檔案

  利用Tcl指令碼將工程所需要的檔案新增進入工程。減少手動新增過程。

    # 新增模擬tb檔案
    add_files -fileset sim_1 ./Sources/hdl/cpu_tb.v
    # 新增VHDL檔案
    add_files [ glob ./Sources/hdl/bftLib/*.vhdl ]
    add_files ./Sources/hdl/bft.vhdl
    # 新增verilog檔案
    add_files [ glob ./Sources/hdl/*.v ]
    add_files [ glob ./Sources/hdl/mgt/*.v ]
    add_files [ 
glob ./Sources/hdl/or1200/*.v ] add_files [ glob ./Sources/hdl/usbf/*.v ] add_files [ glob ./Sources/hdl/wb_conmax/*.v ] # 新增約束檔案 add_files -fileset constrs_1 ./Sources/top_full.xdc set_property library bftLib [ get_files [ glob ./Sources/hdl/bftLib/*.vhdl ]]

3.新增初始化指令碼

  Tcl指令碼在Vivado軟體還可以自定義初始化指令碼,新增圖示,這樣軟體可以通過點選圖示自動執行指令碼,非常方便。zynq內嵌了ARM核和FPGA,在工程設計中新增ARM核應該是最常用的操作,因此這裡就用新增ARM核作為初始化指令碼功能來進行示例。

3.1.設計指令碼

首先建立一個Tcl指令碼,指令碼大致內容為:
1.生成 block design;
2.新增 “processing_system7” IP 核;
3.配置使用的DDR 型號為"MT41J256M16 RE-125"

 1     # 生成block design,命名為“design_1”
 2     create_bd_design "design_1"
 3     # 編譯檔案 sources_1
 4     update_compile_order -fileset sources_1
 5     # 生成zynq ps的IP核
 6     startgroup
 7     create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0
 8     endgroup
 9     # 配置IP核所用的DDR為“MT41J256M16 RE-125”
10     set_property -dict [list CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} CONFIG.PCW_UART1_PERIPHERAL_ENABLE {1}] [get_bd_cells processing_system7_0]

3.2.建立命令

  通過vivado 的Tools -> Custom Commands -> Customize Commands,進行配置。

進入配置命令頁面:
1.左側"+" ,新增命令的名稱;
2.右側錄入描述,在Source Tcl file 中新增剛才寫好的指令碼路徑;
3.命令可以自己上傳圖片作為命令的工具欄圖示。勾選 “Add to the toolbar”,選擇我們的圖示,點選"Apply"便完成了一鍵配置新增、配置PS核的指令碼操作。

  由於是在軟體中自定義的命令操作,因此重新建立工程也無須重新配置。使用vivado軟體時,將通用、重複軟體操作配置為命令,在工具欄一鍵自動完成操作,將大大節省時間,提高工作效率。
下面是剛才建立的Command的相關演示。

4.help使用

  把help 單獨立一小節是因為在使用Tcl指令碼的過程中,偶爾會忘記指令碼使用或者命令名稱等。這就需要常常使用Vivado 自帶的Tcl help 功能。類似matlab一樣,help相關命令會顯示相關命令的使用方法、變數引數等,實在是很方便也很重要。

二、Quartus Tcl使用

1.工程複製

  找一個已經編譯好的小工程,在Quartus II中開啟,點選Project -> Generate Tcl File for Project。

  這時在工程目錄下,會生成一個字尾為.tcl的檔案。然後,大家把這個Tcl檔案,與這個工程的原始檔(.v)複製到一個新的資料夾下,注意檔名不要有中文字元。在檔案下新建一個空白的txt文件,輸入“quartus_sh -t xxx.tcl”,注意後面的tcl名需要與自己的tcl檔案相同,最終的結果是這樣的。

  最後,將txt文件的字尾改為.bat。當雙擊這個.bat檔案時會將原有的工程檔案複製到當前目錄下。這對於複製一個很大的工程時,只需要把指令碼檔案與原始檔拷貝即可。

2.Tcl指令碼介紹

  在Quartus II中,Tcl指令碼有3個層次,分別是命令列可執行語句(Command-Line Executables)、Tcl內的包(Packages)與包內的命令(Package commands).

  在Win+R命令列中輸入quartus_sh --qhelp,可以開啟Quartus II自帶的關於Tcl指令碼的幫助文件。

  命令列可執行語句(Command-LineExecutables)的形式全部為quartus_xx,是直接寫入批處理指令碼中的。

  這裡用的 quartus_sh,其實是所謂的Quartus shell,是為所有的步驟提供了一個入口。

  為了實現可執行命令所執行的功能,Quartus II裡為每一個可執行命令提供了不同的。而包內的命令,是我們真正要往Tcl腳本里寫入的。

指令與包之間的關係如下。

  實心圓代表可執行語句預設載入了這個包。比如說,所有的可執行語句即quartus_xxx都載入了project這個包。這意味著,不管用任何可執行命令執行Tcl指令碼,指令碼中都可以呼叫project包下的指令,如set_global_assignment。

  空心圓代表可執行語句無法載入這個包,比如假如用quartus_sh這條語句執行sdc這個包下的語句,就是不行的。

  半空半滿圓代表可執行語句沒有預設載入這個包,要是想用的話需要自己進行手動載入。在Tcl指令碼內寫入 load_package <package name>;之後,就可以使用對應包內的指令了。比如,使用quartus_sh這個指令去執行指令碼,又需要執行flow這個包下的指令,如execute_flow,那麼我們就需要在Tcl檔案中寫入load_packageflow這句話。

  總結:批處理檔案(.bat)中寫可執行指令,如quartus_xxx;指令碼(Tcl)檔案中寫可執行指令下Tcl包內的指令;如果沒有包沒有預設匯入的話還要在Tcl檔案中匯入。

3.示例

  前面示例工程生成的Tcl指令碼包含兩部分,第一部分為工程檢測,第二部分為工程配置約束。

 1 package require ::quartus::project
 2 
 3 set need_to_close_project 0
 4 set make_assignments 1
 5 
 6 # Check that the right project is open
 7 if {[is_project_open]} {
 8   if {[string compare $quartus(project) "led_test"]} {
 9     puts "Project led_test is not open"
10     set make_assignments 0
11   }
12 } else {
13   # Only open if not already open
14   if {[project_exists led_test]} {
15     project_open -revision led_test led_test
16   } else {
17     project_new -revision led_test led_test
18   }
19   set need_to_close_project 1
20 }

  這一部分主要是檢查目前待建立的工程是否存在,如果不存在的話,就project_new -revision led_test led_test,即建立led_test這個工程。其中-revision後面跟的是一同被建立的qsf檔案的名字。

當然如果自己寫指令碼的話其實沒有必要這麼多判斷,建立工程直接寫project_new -revision <qsf檔名> <工程名>這樣即可。

三、ModelsimTcl使用

  以 modelsim <安裝路徑>/examples/tutorials/verilog/basicSimulation 這個路徑下的檔案 countrer.v 和 tcounter.v 為例進行說明。

  • 新建一個資料夾,將這兩個檔案放入,這裡取名為modelsim_test。

  • 啟動Modelsim,將路徑切換到剛才我們新建的資料夾下。

  Modelsim會把檔案的編譯結果放到一個虛擬的Work庫中。我們要把這個虛擬的work庫,與電腦硬碟上一個真正的資料夾聯絡起來,這個步驟就是所謂的對映。通常這個資料夾我們也會叫work,當然也可以叫其他名字。

  • 新建一個庫,取名為work。

按下圖操作,建立真實的work資料夾,和把資料夾與虛擬work庫相連的過程。

這時Transcript的輸出是:

vlib work
vmap work work

vlib work是說,在Modelsim中建立了那個真實的work資料夾。

vmap work work是說,將Modelsim中的虛擬work庫關聯到我們vlib的那個真實的work資料夾。

所以也可以寫成:

vlib dework
vmap work dework

  執行這一步後,資料夾下多了一個名為work的資料夾。同時,Modelsim中也多了一個叫做work的庫。

點選Compile > Compile,將兩個檔案都編譯到work庫下。

【注】如果檔案中包含IP核的話,也要將IP核的庫檔案複製到這個資料夾下,然後一同編譯。

  之後點選 compile -> done。此時,work庫下面出現了這兩個檔案。

注意Transcript的輸出,這裡的vlog就是"編譯"的Tcl程式碼。

vlog -reportprogress 300 -work work C:/Users/13613/Desktop/modelsim_test/counter.v
vlog -reportprogress 300 -work work C:/Users/13613/Desktop/modelsim_test/tcounter.v

  接下來可以進行模擬了,點選Simulate > Start Simulation將work庫中的tcounter選中。將Optimization的小勾去掉(防止非預期優化,也是大多數情況下不出波形的原因)。

以下是Transcript的輸出,vsim是Tcl中"模擬"的意思。

vsim -gui -novopt work.test_counter

將訊號新增到波形圖中。對應輸出的Tcl指令碼:

add wave sim:/test_counter/*

最後點選執行,對應Tcl指令碼。

run

之後就出現波形了。

指令碼自動化模擬:

1. 首先建立一個test資料夾,裡面放著模擬檔案 XX_tb.v,然後在這test資料夾裡放一個sim資料夾,在此資料夾內新建一個sim.tcl檔案,這樣後面的工程和亂七八糟的檔案都在內部的sim資料夾裡。

2. 在sim .tcl檔案裡寫好以下程式碼,這些程式碼建議儲存或製作成程式碼片段,以後只需要稍微改一改就能用。

 1 # ==========================================================================
 2 # ==   清空軟體殘留資訊
 3 # ==========================================================================
 4 
 5 # 退出之前模擬
 6 quit -sim
 7 
 8 # 清空資訊
 9 .main clear
10 
11 # ==========================================================================
12 # ==   建立工程並模擬
13 # ==========================================================================
14 
15 # 建立新的工程庫
16 vlib work
17 
18 # 對映邏輯庫到物理目錄
19 vmap work work
20 
21 # 編譯模擬檔案
22 vlog ./../*.v
23 
24 # 編譯設計檔案
25 vlog ./../../rtl/*.v
26 
27 # 無優化simulation                                        *** 請修改檔名 ***
28 vsim -novopt work.fsm_tb
29 
30 # 開啟波形視窗
31 view wave  
32 view structure
33 
34 #開啟訊號視窗
35 view signals
36 
37 
38 # ==========================================================================
39 # ==   狀態機名稱檢視器,如若不用請刪除!!!
40 # ==========================================================================
41 
42 # 結構體設定
43 virtual type {
44     {4'b0001 S0}
45     {4'b0010 S1}
46     {4'b0100 S2}
47     {4'b1000 S3}
48 } fsm_type;
49 
50 # 結構體和訊號名關聯,命名為state_name
51 virtual function {(fsm_type)/fsm_tb/u_fsm/state} state_name
52 
53 # ==========================================================================
54 # ==   載入波形
55 # ==========================================================================
56 
57 # 新增波形,高度30,以unsigned格式顯示                        *** 請修改路徑名 ***
58 add wave -height 30 -radix unsigned /fsm_tb/u_fsm/*
59 
60 #執行
61 run 10 ms
62 
63 # 跑完
64 run -all

3.之後在資料夾下再新建一個文字檔案,輸入

::請按任意鍵繼續...
pause

::開啟Modelsim並執行do sim.tcl
vsim -do sim.tcl

再將字尾由.txt改為.bat,使用的時候雙擊這個bat檔案即可。


————————————————
原文連結1:Vivado Tcl使用 —— 自定義命令設計

原文連結2:手把手教你用Tcl指令碼進行Modelsim模擬

原文連結3:Modelsim——工程建立和常用設定