聲明:本文為黑金動力社區(http://www.heijin.org)原創教程,如需轉載請注明出處,謝謝!
黑金動力社區2013年原創教程連載計划:
http://www.cnblogs.com/alinx/p/3362790.html
《FPGA那些事兒—Modelsim仿真技巧》REV2.0 PDF下載地址:
http://www.heijin.org/forum.php?mod=viewthread&tid=22419&extra=page%3D1
第二章 Modelsim就是電視機
2.1 連接 Modelsim
2.2 自動編譯,半自動編譯,手動編譯
2.3 自動編譯的預先設置
2.4 常用界面
2.5 自動編譯與半自動編譯
2.6 操作Wave界面
總結
第二章 Modelsim就是電視機
2.1 連接 Modelsim
傳統CRT電視給人印象笨重不過操作卻非常簡單,現代液晶電視給人印象輕便不過操作卻非常麻煩。如果傳統CRT電視與現代液晶電視不小心結合起來,結果就成為現在的Modelsim。許多朋友常認為學習 Modelsim等價與學習仿真,不過這也是美麗的誤會而已。Modelsim不過是仿真所需的重要工具而已,然而Modelsim常用的功能如下:
(一)編譯軟模塊成為仿真對象。
(二)播放波形圖。
根據筆者的認識,不管模塊是否綜合成功,只要一天未下載到開發板都視為本質理想的軟模塊。仿真之前,軟模塊必須經過 Modelsim編譯成為仿真對象才行。此外,播放波形圖Modelsim 最為重要的任務,也是學習 Modelsim最為重要的課題。基本上只要掌握上述兩項功能,就已經足夠了。不過。首先我們需要搞懂啟動 Modelsim 的方法。
Altera公司的集成環境——Quartus II,傳聞說版本10.0以前自帶官方的仿真工具,但是自認不如的它已經心灰意冷回老家去了。Quartus II升級為版本10.0以后,Modelsim自然而然就取代它的位置。這個故事告訴我們,Modelsim是一位外來者,預想使用Modelsim之前,Modelsim必須做好連接Quartus II的工作。
Modelsim啟動文件名是 modelsim.exe,一般藏身在以下路徑:
C:\altera\12.1\modelsim_ase\win32aloem\modelsim.exe //第二方免費版本
筆者所使用的Modelsim是Altera自定義的版本,亦即 Modelsim Altera Started Edition,簡稱ase,源目錄一般都放置在 altera的目錄之下。除了 Started Edition 以外,Altera還有自定義的付費版本,亦即 Modelsim Altera Edition,簡稱 ae,然而默認路勁如下:
C:\altera\12.1\modelsim_ae\win32aloem\modelsim.exe //第二方付費版本
好奇的同學可能想問道“免費版本付費版本究竟差異何在?”。根據筆者的理解,兩者之間的差別就在於付費版本的“仿真庫”遠勝免費版本,而且付費版本也沒有行數限制。不過筆者卻認為,只要巧用理想時序與仿真技巧,免費版本已經足夠應用了,因為逝去的老嬤嬤一直告訴筆者“東西夠用就好,多了就是浪費”,所以筆者不會煩惱什么付費版本,再加上付費版本一年要九百多刀 ... 真是嚇死人。那么,什么又是仿真庫?在此先留個懸念。
抱歉,筆者不知不覺又離題了,讓我們切回話題吧。首先找到Modelsim啟動文件的藏在目錄,筆者的話是:
C:\altera\12.1\modelsim_ase\win32aloem
圖2.1.1
然后打開 Quartus II,接着調出 Tool 菜單,往下打開 Option,過程如圖2.1.1所示。
圖2.1.2
隨后,點擊右邊菜單樹下的 Eda Tool Options,再將原先的路徑拷貝到 Modelsim-Aletra 的空白處,完后點擊 Ok生效。就這樣,Modelsim連接QuartusII的工作就完成了,真是可喜可賀!
2.2 自動編譯,半自動編譯,手動編譯
Modelsim開始執行仿真之前需要執行一堆讓人覺得猥瑣的准備工作,然而這些准備工作到底又包含那些步驟呢?
(一)創建仿真設計
(二)加載 .v 文件
(三)加載 .vt 文件
(四)生成仿真對象
(五)生成仿真環境
(六)啟動仿真
(七)加載仿真信號
(八)播放仿真
一般,准備工作包含上述8個步驟,具體解釋往下繼續 ...
圖2.2.1 創建仿真設計
其一,創建仿真設計如圖2.2.1所示,有時候也稱為創建仿真項目,自動編譯與半自動編譯會簡化該步驟。
圖2.2.2 加載 .v 和 .vt 文件。
其二,其三如圖2.2.2所示,既加載 .v 文件和 .vt 文件,自動編譯與半自動編譯會簡化該步驟。
圖2.2.3 生成仿真對象和生成激勵文本。
其四,其五皆如圖2.2.3所示,既生成仿真對象還有仿真環境,俗稱編譯,自動編譯會簡化該步驟。
圖2.2.4 啟動仿真。
其六,如圖2.2.4所示,既是啟動仿真,用筆者的話來說就是激活仿真環境,自動編譯會簡化該步驟。
圖2.2.5 加載仿真信號。
其七,如圖2.2.5所示,既添加仿真信號,自動編譯會簡化該步驟。
圖2.2.6 播放仿真。
其八,如圖2.2.6所示,即播放仿真時間,自動編譯會簡化該步驟。
每起仿真執行之前,我們就必須重復上述8個令人厭煩的步驟,不過黑暗總是存在光明。
根據筆者的認識,上述這些准備工作有分為3個類,亦即自動編譯,半自動編譯,還有手動編譯。筆者是一位節能意識非常強的男人,所以特別喜歡自動編譯,還有半自動編譯,些許討厭手動編譯。三種編譯方法之間的差異,如表2.2.1所示。
表2.2.1 各種編譯辦法。
| 准備工作 |
自動編譯 |
半自動編譯 |
手動編譯 |
| 創建仿真設計 |
自動 |
自動 |
手動 |
| 加載 .v 文件 |
自動 |
自動 |
手動 |
| 加載 .vt 文件 |
自動 |
自動 |
手動 |
| 生成仿真對象 |
自動 |
手動 |
手動 |
| 生成仿真環境 |
自動 |
手動 |
手動 |
| 啟動仿真 |
自動 |
手動 |
手動 |
| 加載仿真信號 |
自動 |
手動 |
手動 |
| 播放仿真 |
自動 |
手動 |
手動 |
筆者之所以那么愛死自動編譯,原因如表2.2.1所示,所有准備工作 Modelsim都會自動完成,啊 ... 多么節能的手段。換之,半自動編譯除了前3個步驟以外,亦即創建仿真設計,加載 .v 與 .vt 文件以外,余下的5個步驟都必須手動執行。半自動編譯雖然不想自動編譯那么省事,不過筆者也愛它。反之,筆者卻有點討厭手動編譯,因為上述所有准備工作都必須人為執行,話說死不死呀。
圖2.2.7 自動創建仿真項目。
一寸光陰一寸金,寸金難買寸光陰,偉大的祖輩教誨后代要珍惜時間,創建仿真設計還有加載 .v 與 .vt 文件這些個步驟往往是整個准備工作當中最浪費時間的,因為我們必須人為創建仿真項目,然而自動編譯還有半自動編譯會將仿真項目添加在設計項目的目錄下,如圖2.2.7所示,這是一個非常節能的手段。
雖然在便利的范疇上,自動編譯無疑是最好的選擇,不過自動編譯也有局限的地方,亦即自由度不大,這句話是什么意思呢?假設第一次的仿真結果無法符合預期的預想,結果讀者必須重新啟動 Modelsim,不然那些更動以后的文件都無法生效。如果讀者的計算機條件很好,哪倒沒什么問題,重啟Modelsim也是小片刻的等待而已。但是,那些計算機條件不好的同學,等待可謂是一場漫長的惡夢。
相反的,自動編譯還有手動編譯的自由度可大了,兩者雖然用不着重啟 Modelsim便可生效更動過的文件。但是手動編譯相較自動編譯,手動編譯較為費力。經過種種的排除以后,最后我們會發現半自動編譯會是我們最好的選擇。站在節能的角度上,筆者當然推薦自動編譯還有半自動編譯。不過作為初學,筆者還是建議讀者先習慣手動編譯為好,因為接續的例子,筆者都是使用手動編譯來執行仿真。
2.3 自動編譯的預先設置
如果Modelsim經由集成環境(Quartus II)啟動,這個過程就稱為自動編譯,但是我們在執行自動編譯執行之前,我們必須預先設置編譯信息,好讓笨蛋的集成環境知曉一切。首先將Experiment01的項目打開,那是筆者在以前設計過的傳統乘法器,不過那是一只實驗性的小白鼠而已。
圖2.3.1 菜單Assignment,還有 Settings選項。
接着,調出 Assignment 菜單,然后進入Settings界面。如圖2.3.1所示。
圖2.3.2 界面 Settings。
打開 Settings 界面后,我們會看見各種意義不明的選項,暫時無視它們,然后讀者只要展開 EDA Tool Settings,再點擊 Simulation,Simulation界面隨之就會浮現在右邊的窗口。沿着下方我們會看見NativeLink Setting,順手點擊 Compile test bench 左邊的圈圈,結果如圖2.3.2所示。最后點擊 Test benches 按鍵即可。
(確保 Tool name 設置為 Modelsim-Altera)
圖2.3.3 窗口 Test Benches。
事后,Test Benches 窗口會浮現在眼前,如圖2.3.3所示。此刻窗口空空如也,因為我們還沒未輸入相關的編譯信息。沿着右邊,點擊New按鍵。
圖2.3.4 窗口 New Test Bench Settings。
如圖2.3.4所示,New Test Bench Settings 窗口會浮現在眼前,該窗口有3個部分,其一是激勵文件名(上段),最大仿真時間(中段),還有激勵文件的具體路勁(下段) 。
實驗一的模塊名為multiplier_module.v,然而激勵文本則名為 multiplier_module.vt。在此,Test bench name 是指激勵文本名,亦即 multiplier_module(省略后綴 .vt)。
圖2.3.5 激勵文件 multipllier_module.vt 的仿真環境取名。
Top level module in test bench 中文譯名為頂層激勵模塊,任筆者怎么翻譯都覺得怪怪的,所以筆者索性稱呼它為仿真環境。如圖2.3.5所示,名為 multiplier_module.vt 的激勵文本,內容所屬的仿真環境取名為 multiplier_module_simulation。
圖2.3.6 激勵文件名設置完成。
完后,激勵文件信息的基本設置如圖2.3.6所示,也就是 Test bench name 輸入為 multiplier_module, Top level module in test bench 輸入為 multiplier_module_simulation。
圖2.3.7 設置仿真時間。
圖2.3.8 最大仿真時間為10us。
New Test Bench Settings 窗口中段是仿真時間的設置,如圖2.3.7所示。不管默認選項是什么東西,讀者只要使能 End simualtion at 左邊的圈圈,然后在右邊的文本框中輸入10us即可,既是最大仿真時間為10us。完后,如圖2.3.8所示。
圖2.3.9 設置激勵文件路徑。
圖2.3.10 資源管理窗口——選擇文件。
如圖2.3.9所示,New Test Bench Settings 窗口的下段是設置路徑。沿着 File name 右邊,點擊 <...>,然后資源管理窗口就會浮現在眼前,在此尋找 multiplier_module.vt 文件,隨后點擊 Open按鍵更新選擇,過程如圖2.3.10所示。
圖2.3.11 激勵文件路徑顯示。
圖2.3.12 激勵文件路徑添加。
過后,File name 會顯示之前選擇的路徑,如圖2.3.11所示。接着,沿着右邊點擊 Add按鍵添加路徑,如圖2.3.12所示。
圖2.3.13,整體效果。
圖2.3.14 激勵信息設置完成。
設置完后,整體效果如圖2.3.13所示,接着點擊 OK 按鍵生效設置, 然后返回Test Bench窗口。此刻,我們已經完成激勵信息的輸入,作為證明,方才的設置內容都會顯示在 Test Bench窗口之中,如圖2.3.14所示。最后點擊 OK按鍵更新設置。
圖2.3.15 編譯信息輸入完畢。
接着我們會返回 Settings 界面,沿着 Compile test bench的右邊 multiplier_module的激勵信息會顯示在文本框中,以此證明編譯信息輸入完畢,結果如圖2.3.15所示。最后點擊 OK 更新設置。
圖2.3.16 Modelsim啟動,自動編譯執行。
確認一切設置辦妥以后,打開 Tools菜單,沿着 Run Simulation Tool選項的右方,點擊 RTL Simulation,過后Modelsim會自行啟動,而且自動編譯也會開始執行。過程如果2.3.16所示。
圖2.3.17 仿真項目自動創建。
對於自動編譯與半自動編譯而言,設計庫(工作庫)的默認名為 work,結果 work文件夾會自動添加在設計項目的目錄下。期間,自動編譯需要一定的執行時間,然而塊與慢完全根據個人的計算機配置。
圖2.3.18 Modelsim啟動成功,自動編譯執行成功。
如果一切錯誤皆沒有發生的話,Modelsim的界面會成功顯示在電腦屏幕上,結果如圖2.3.18所示。
2.4 常用界面
Modelsim 是一款功能強大的電視機,除了播放屬於Verilog 的節目(波形圖)以外,Modelsim 還可以播放其它節目,為此Modelsim 旗下如果擁有多個界面,我們一點也不用覺得奇怪。那些不擅長軟件的朋友,可說是一場惡夢,然而很慶幸的是,我們用不着學習全部。根據筆者的理解,仿真僅需要以下幾個界面而已:
(一)Project界面
(二)File界面
(三)Library界面
(四)Transcript界面
(五)Simulation界面
(六)Wave界面
接着,讓筆者逐個為大伙介紹。
圖2.4.1 Project界面
如圖2.4.1所示,Project界面故名思議就是仿真項目界面,然而Project界面的使用程度並不頻繁,因為自動編譯還有半自動編譯會省略創建仿真設計的步驟,余下也只有手動編譯才會使用 Project 界面。總之,讀者先看個大概,暫時把 Project界面的功能想象成為收納東西的文件夾一樣。往后,筆者自然會在手動編譯的小節介紹它。
圖2.4.2 File界面
如圖2.4.2所示,File界面有時候也稱為文件界面,任何與仿真有關的文件都會顯示在這個界面上。以實驗一為例,multiplier_module.v 文件還有 multiplier_module.vt 文件都展示在資源樹之下。File界面除了展示仿真相關的所有文件以外,什么作用也沒有。順便一提,不管自動編譯還是手動編譯,File界面都會使用到。
圖2.4.3 Library界面
如圖2.4.3所示,Library界面有時候也稱為仿真庫界面,然而Library界面的作用卻不怎么單純。仿真庫界面一般有兩個作用,其一就是儲存自定義IP所需的仿真信息,例如自定義關鍵字信息,自定義功能,延遲等信息。所謂的仿真庫質量就是仿真信息的支持程度。此外,Library界面一般都是有兩大分類,亦即設計庫(工作庫)與資源庫。不管怎么樣,詳細內容往后詳談。
圖2.4.4 自動編譯創建名為 work的仿真設計。
設計庫別名也有工作庫。設計庫好比仿真所需的暫存空間,所有相關的仿真信息都會儲存在這里。但是自動編譯會擅自將它取名為work,以實驗一為例,實驗一的仿真對象是multiplier_module,仿真環境則是 multiplier_module_simulation,結果兩者信息就這樣儲存在 work里邊(如圖2.4.4所示)。
仿真庫界面看似麻煩不過卻非常好用,我們可以直接在這里更新(編譯)仿真對象又或者更新(編譯)仿真環境,還是啟動仿真也可以。
圖2.4.5 Transcript 界面。
如圖2.4.5所示,Transcript界面也是終端(Console)界面,故名思議 Transcript界面的作用就是顯示打印信息還有接受 TCL命令(工具命令語言)。Modelsim雖然可以支持相關的TCL命令實現相關的操作,然而筆者卻不建議學習 TCL命令。筆者認為,只要了解界面,善用界面,即使不學習 TCL命令也可以實現一樣的操作。實際上這寫都是筆者犯懶的借口而已,因為TCL命令學起來很麻煩。
結果而言,筆者比較喜歡將 Transcript界面稱為信息界面,一些有用的錯誤反饋信息或者打印信息都會顯示在其中。不過,筆者偶爾也會被海量的信息打敗,所以要好好控制信息的打印數量,不然結果就會自討苦吃。
圖2.4.6 Simulation界面 。
圖2.4.7 添加仿真信號。
如圖2.4.6所示,sim界面是 simulation界面的縮寫,然而筆者卻稱為仿真信號界面。一些可以仿真的信號都會放置在這里。此外,我們也可以手動添其它仿真信號,以實驗一為例:假設,筆者想要觀察仿真對象U1,U1是仿真對象multiplier_module的實例名,因此,筆者需要先展開仿真環境 multiplier_module_simulation,接着右鍵點擊U1,然后選擇 Add Wave,此刻仿真對象U1的內部一切將成為仿真信號,過程如圖2.4.7所示。
sim界面雖然有用但是自動編譯卻會忽略它。換之,半自動編譯還有手動編譯比較受到愛戴。
圖2.4.8 Wave界面。
如圖2.4.8所示,Wave界面也稱為波形圖界面,也是最常用,最重要的界面,而且“學習Modelsim就是學習Wave界面”——這種說法一點也不過分。Wave界面的作用就是顯示仿真信號,Wave界面雖然看似復雜但是操作卻非常傻瓜,學起來也非常輕松。我們知道仿真對象不會使用人類的語言述自述,換之仿真對象會經由波形圖顯示活動記錄,學習 Wave界面真正的困難之處就是如何解讀這些波形圖。
圖2.4.9 顯示相關界面。
最后,讓筆者做個簡單的總結,上述6個界面是仿真最常用的界面,我們可以透過View菜單打開或者關閉它們,過程如圖2.4.9所示。然而,根據編譯方法的不同,界面的使用程度也會跟着不同,因此筆者繪出表2.4.1:
表2.4.1 仿真常用界面。
| 仿真常用界面 |
自動編譯 |
半自動編譯 |
手動編譯 |
| Project界面 |
無用 |
無用 |
有用 |
| File界面 |
有用 |
有用 |
有用 |
| Library界面 |
有用 |
有用 |
有用 |
| Transcript界面 |
有用 |
有用 |
有用 |
| Sim 界面 |
無用 |
有用 |
有用 |
| Wave 界面 |
有用 |
有用 |
有用 |
雖然Modelsim還存在許多界面,但是對筆者而言,只要上述掌握上述6個界面就足夠應付仿真了。學習仿真的過程是非常耗神耗氣的,因此節能學習才是學習仿真的上上之道。
2.5 自動編譯與半自動編譯
在這個小節里,我們會透過實驗一去理解各種編譯方法的不同之處。筆者曾在小節2.3講解過自動編譯的預先設置,事實上自動編譯是上天給予懶人的禮物,我們可以透過預設將麻煩的准備工作交由集成環境勞動。
自動編譯一般如流程如下:
預先設置 → 啟動功能仿真 → 自動創建仿真項目 → 自動加載 .v 與 .vt文件 → 自動編譯 .v 與 .vt 文件 → 自動啟動仿真 → 自動添加仿真信號 → 自動播放仿真
除了預先設置可視之外,直至Wave界面顯示波形圖,其余步驟都是集成環境在暗地里執行。自動編譯最大的好處就是節能,不過自動編譯也有壞處,每當我們更新 .v 與 .vt文件以后,如果我們想要更新波形圖,我們必須重新啟動Modelsim才行。重啟Modelsim至少需要幾個呼吸的時間,筆者則認為那是短暫放松,然而那些性格比較焦急的朋友,可能是痛苦的等待。由此,半自動編譯就誕生了。
半自動編譯一般如流程如下:
預先設置 → 啟動功能仿真 → 自動創建仿真項目 → 自動加載 .v 與 .vt文件 → 自動編譯 .v 與 .vt 文件 → 自動啟動仿真 → 自動添加仿真信號 → 自動播放仿真
更動 .v 與 .vt 文件以后,預想更新波形圖,流程如下:
手動編譯 .v 與 .vt 文件 → 手動啟動仿真 → 手動添加輸出 → 手動播放仿真
半自動編譯是經由自動編譯執行一番以后,再手動執行幾個步驟。具體過程如下:
圖2.5.1 執行功能仿真(啟動自動編譯)。
首先是經過Quartus 的Tools菜單,沿着 Run Simulation Tool 選項的右邊,點擊 RTL Simulation,然后自動編譯就會執行,如圖2.5.1所示。這樣作的目的是經由自動編譯,讓集成環境做好仿真前的工作,好使我們節省氣力。
圖2.5.2 波形圖出現在Wave界面。
經過一段小時間以后,Wave界面會呈現波形圖,亦即自動編譯執行成功,如圖2.5.2所示。當然前提條件必須確保 .v 文件還有 .vt 文件沒有語法錯誤。此刻,一切准備工作已經經由自動編譯執行完成。
圖2.5.3 更動 .vt 文件內容。
假設筆者手癢,更新 .vt 文件其中一段內容,如圖2.5.3所示。但是筆者又不想重啟Modelsim,於是半自動編譯發生了。同樣,必須先確保更改內容的語法是正確無誤。
圖2.5.4 打開 Compile 窗口。
圖2.5.5 選擇更新文件,手動編譯。
鼠標指向 Compile菜單,然后點擊 Compile選項,如圖2.5.4所示。接着,資源管理窗口會浮現在眼前,選擇要更新的文件,在此是 multiplier_module.vt,確定以后沿着右下方依序點擊 Compile隨之點擊 Done即可。此刻,最新的 multiplier_module.vt 內容就會生效。(步驟手動編譯 .v文件與 .vt 文件完成)
圖2.5.6 打開 Start Simulation 窗口。
圖2.5.7 Start Simulation 窗口,啟動仿真。
事后,沿着 Simulate菜單,點擊 Start Simulation 選項,如圖2.5.6所示。如圖2.5.7所示,Start Simulation 窗口接着會浮現在眼前,展開Design子窗口下的設計庫work,
選擇仿真環境 multiplier_module_simulation, 然后鼠標致右下方點擊OK,仿真就開始啟動。(步驟手動啟動仿真完成)
圖2.5.8 Library界面,手動編譯文件還有手動啟動仿真。
事實上,上述兩個步驟(手動編譯文件還有手動啟動仿真)都可以經由 Library界面完成,如圖2.5.8所示,展開仿真庫work以后,會有仿真對象 multiplier_module還有仿真環境 multiplier_module_simulation。右鍵點擊仿真環境,其中小窗口就有 Recompile(再編譯)和Simulate(啟動仿真)等選項,只要依序點擊 Recompile 還有 Simulate,同樣的操作也會發生。
| 圖2.5.9 Wave界面什么也沒有。 |
圖2.5.10 Sim界面,手動添加仿真信號。 |
一段等待以后,仿真就啟動完畢。不過,此刻wave界面什么也沒有,結果如圖2.5.9所示。因此,我們必須手動添加仿真信號,首先打開 Sim界面,仿真環境 multiplier_module_simulation會是最高的父選擇。如果,讀者僅需要顯示仿真對象的出入端而已,那么右鍵點擊仿真環境,然后選擇Add Wave,過程如圖2.5.10所示。
圖2.5.11 手動添加仿真信號。
如圖2.5.11所示,仿真信號手動添加成功后,那么仿真信號就會顯示在 Wave界面的左框中。但是,此刻 Wave 界面(右框)還沒有顯示任何波形圖,為什么呢?原因很單純,因為播放鍵還沒有按下。(步驟手動添加仿真信號完成)
圖2.5.12 手動播放仿真。
圖2.5.13手動播放仿真完畢。
讀者是否還記得,我們曾經在預設當中將仿真最大時間設置為10us,然后自動編譯會自動播放仿真直至10us。同樣,我們也可以手動播放仿真時間,如圖2.5.12所示,輸入預想播放時間在播放文本框當中。在此,筆者輸入10us,然后沿着右方點擊“↓”按鍵,稍等一會后,波形圖就會播放完成,結果如圖2.5.13所示。我們可以一次播放最大仿真時間之余,我們也可以多次播放片刻仿真時間。(步驟手動播放仿真完成)
到目前為止,半自動編譯的所有步驟我們已經執行完成,真是可喜可賀。在此,稍微讓我們來思考一下:
自動編譯雖然方便,不過它也有不足之處,即自由度很小。其一必須重啟Modelsim不然更新文件無法生效;其二不能隨意添加仿真信號,因為自動編譯僅針對仿真對象的出入端而已。為此,半自動編譯就是為了彌補自動編譯這兩點不足之處才會降臨到這個世界上。討論完結自動編譯還有半自動編譯以后,接下來讓我們來討論手動編譯。
===================================================================
手動編譯一般流程:
手動創建仿真項目 → 手動加載 .v 與 .vt文件 → 手動編譯 .v 與 .vt 文件 → 手動啟動仿真 → 手動添加仿真信號 → 手動播放仿真
正如上述流程所示,手動編譯相較自動編譯只是少了步驟“預先設置”之余,還有自動改為手動而已。況且在效果上,半自動編譯有點類似手動編譯,因此不得不讓人思考,我們為何還要手動編譯呢?
假設筆者是一粒窮光蛋,沒有錢購買Quartus II,因此筆者無法實現自動編譯還有半自動編譯。此刻Modelsim就會成為另一個集成環境,為此讓我們暫時拋開 Quartus II,嘗試使用 Modelsim 執行手動編譯好讓自己有個深刻的理解。
圖2.5.14 手動創建仿真項目
首先打開Modelsim,然后切換到 Project界面,隨之選擇File菜單,沿着New選項右邊再點擊 Project,過程如圖2.5.14所示。過不了一會,Create Project窗口就會浮現在眼前:
(一)Project Name的作用不大隨意輸入就好,筆者取名為 mannual;
(二)Project Location 是仿真設計的路徑;
(三)Default Library Name是設計庫的取名,默認為work筆者取名為
mannual_work;
(四)點擊OK生效。(步驟手動創建項目完成)
| 圖2.5.15 Add item to the Project窗口 |
圖2.5.16 Add file to the Project窗口 |
| 圖2.5.17 添加以后文件。 |
圖2.5.18 文件添加完成。 |
手動創建項目完成以后,Add item to the Project窗口會浮現在眼見。如圖2.5.15所示,其中有4個選項,而且意義也很直接,在此筆者就不解釋了。點擊 Add Existing File,Add file to Project窗口就會浮現在眼前,結果如圖2.5.16所示,沿着右方點擊 Browse按鍵,將 Multiplier_module.v 還有 multiplier_module.vt 這兩個已有文件添加進來,過程如圖2.5.17所示。時候,Project界面就會出現方才添加進來的兩個文件,結果如圖2.5.18所示。(步驟手動添加文件完成)
圖2.5.19 手動編譯。
如圖2.5.19所示,右鍵點擊任意文件,然后沿着 Compile選項選擇 Compile All,編譯所有文件(步驟手動編譯文件完成)。
圖2.5.20 手動啟動仿真。
事后,切換到 Library界面,向下拉動滾條直至找到 mannual_work 這個自定義的設計庫,暫開之后右鍵點擊仿真環境 multiplier_module_simualtion,接着選擇 Simulate,然后仿真就會啟動。(步驟手動啟動仿真完成)
圖2.5.21 手動添加仿真信號。
圖2.5.22 仿真信號手動添加完畢。
稍等一會后,仿真就會啟動完畢,借此 Sim界面也會跟着浮出水面。假設筆者想觀察仿真對象multiplier_module的全體輸出,筆者可以展開仿真環境,右鍵點擊U1,接着選擇 AddWave,過程如圖2.5.21所示。切換至 wave 界面,仔細觀察一下 wave 界面的左框,已經出現密密麻麻的仿真信號,結果如圖2.5.22所示。在此我們可以斷定,手動添加仿真信號已經完成。(步驟手動添加仿真信號完成)
圖2.5.23 手動播放仿真。
圖2.5.24 手動播放仿真完畢。
10us的仿真時間對於實驗一來說過於充足了,在此筆者輸入1us的仿真時間,結果如圖2.5.23所示,然后沿着右方點擊“↓”按鈕,開始播放仿真。經過幾個呼吸的時間以后,wave界面的右框就會出現波形圖,結果如圖2.5.24所以。此刻我們可以斷定,手動播放仿真已經完畢。(步驟手動播放仿真完成)
手動編譯一般是辛苦的勞動,啊!不是 ... 是缺少集成環境(如Quartus II)的情況下,才會選擇的下下策。手動編譯與半自動編譯雖然相似,但是筆者卻一直喜歡不上它,是否筆者太懶,還是手動編譯太麻煩了?不管怎么樣,初學者一般建議使用自動編譯,然后再選擇性使用半自動編譯。至於手動編譯,除非是學習作用,不然就無視它。
2.6 操作Wave界面
Wave界面是Modelsim所有界面之中最有用的界面,wave界面好比電視屏幕,用來顯示節目,亦即波形圖。操作wave界面近似操作老式CRT電視,又似操作現代液晶電視,這句話聽起來雖然覺得有點矛盾。舉例而言,如果讀者只是“看爽”波形圖而已,亦即看看形狀然后傻笑自認看懂,結果就是老式CRT電視,操作程度非常傻瓜。反之,如果讀者要仔細觀察每一個時鍾具體的時序情況,那么就是現代液晶電視,操作程度非常細膩。
操作wave界面主要分為兩種,針對老式CRT電視稱為傻瓜操作;針對現代液晶電視稱為細膩操作。傻瓜操作沒什么好談的,換之細膩操作是仿真技巧不可缺少的手段之一。
不過,讀者別擔心,細膩操作界面也沒有印象中那么困難,前提條件除了耐心以外,還是耐心,因為細膩操作wave 界面非常耗費精力還有時間,稍微一個不留心也會自亂陣腳。
圖2.6.1 自動編譯實驗一。
好了,開場白就講到這里。首先經由自動編譯啟動實驗一的仿真,然后再切換到wave界面作為本節的開端,過程如圖2.6.1所示。
圖2.6.2 Wave界面簡介。
為了減輕讀者的學習壓力,圖2.6.2是經過筆者打碼以后的wave界面。Wave界面一般有3大顯示框:
(一)波形圖顯式框
(二)仿真信號顯示框
(三)光標信息顯示框
其一,波形圖顯示框顧名思義就是用來顯示波形圖的地方,亦即Modelsim的圖形輸出;其二,仿真信號顯示框主要是用來顯示仿真信號,還有仿真信號當前時鍾的結果;其三,光標信息顯示框是用來指示光標信息,如光標名還有光標位置。顯示框不同,工具也不同,常用的工具如圖2.6.2所示,表2.6.1則是工具的簡單歸類。
表2.6.1 各種工具歸類。
| 其他 |
波形圖顯式框 |
光標信息顯示框 |
仿真信號顯示框 |
| 播放工具 |
常規工具 屏幕工具 標簽工具 |
光標工具 |
搜索工具 |
圖2.6.3 播放工具。
如圖2.6.3所示,那是讀者再熟悉不過的播放工具,不過筆者還是循例來講一下。有作為的功能如圖2.6.3所示,亦即重新播放,播放時間還有播放。
l 重新播放如字面上的意思就從0時間開始起播放仿真,而不是重啟整個仿真;
l 播放時間也是播放進度;
l 播放亦即開始播放;
| 圖2.6.4 常規工具。 |
圖2.6.5縮放模式。 |
圖2.6.4是常規工具也稱為模式工具。常用的模式除了自由模式以外還有就是縮放模式。自由模式也是默認模式,當自由模式啟動以后我們可以任意點擊波形圖顯示框任意地方,縮放模式主要用來放大某個時間段。如圖2.6.5所示,筆者啟動縮放模式以后,筆者放大0~309ps的時間段,事后0~309ps時間段就會充溢整個波形圖顯示框。然而縮放模式,筆者也是偶爾的情況下才會使用而已。
圖2.6.6屏幕工具。
| ①屏幕標准的結果 |
②屏幕放大的結果 |
| ③屏幕放小的結果 |
④屏幕按光標放大的結果 |
| ⑤屏幕全局放大的結果,最大播放時間1.2ns左右 |
⑥屏幕全局放大的結果,最大播放時間2ns左右 |
圖2.6.7 各種顯示結果。
圖2.6.6所示是屏幕工具,常用功能有屏幕放大,屏幕放小,按光標放大,還有全局放大,各種顯示結果如圖2.6.7所示。①是標准顯示;②是標准顯示根據放大以后的結果;③是標准顯示放小以后的結果;④是標准顯示按光標放大以后的結果,然而②與④的不同之處就在於④是基於光標為中心的位置——3.9ns放大顯示;
⑤與⑥都是標准顯示按全局放大以后的結果,然而⑤的最大播放時間只有1.2ns左右,反之⑥的最大播放時間只有2ns左右,根據最大仿真時間的不同,全局放大也會產生不同的顯示結果。反觀筆者,究竟那種功能才是最常用的呢?筆者很懶,筆者比較喜歡按着 <Ctrl> + 滑鼠滾動鍵,縮放屏幕,因為這樣作比較省力。
圖2.6.8 標簽工具。
標簽是保存當前波形圖顯示框狀態最好的工具,如圖2.6.8所示,常用的標簽功能有:
l 添加標簽,亦即為當前波形圖顯示狀態插入標簽;
l 刪除所有標簽,顧名思義就是清楚所有標簽記錄;
l 讀取標簽,則是讀取標簽記錄;
l 管理標簽,如字面上的意思,也有標簽綜合功能之稱。
| ①預想保存當前顯示狀態。 |
②圖2.6.10 顯示狀態經攪亂以后。 |
| ③讀取標簽記錄 |
④顯示狀態讀取完畢 |
圖2.6.9 標簽工具使用過程。
圖2.6.9是標簽工具使用過程,假設①是筆者預想保存的顯示狀態,然后筆者可以點擊“添加標簽“功能將當前顯示狀態記錄起來。②是筆者不小心攪亂顯示狀態的后果,不甘心的筆者,如③所示點擊”讀取標簽“功能,調回①的顯示狀態。④是讀取標簽的結果,①與④相較之下並沒有差別。
對於波形圖顯式框而言,標簽工具是非常方便的工具,有時候時序記錄過於龐大或者過度復雜,由於波形圖顯式框的長度有限,這時候標簽工具就派上用場了。善用標簽工具會節省將波形圖顯式框拖來拖去的勞動,我們可以將某個時間段的顯示狀態記錄起來,又或者保存屏幕縮放結果。所以說,標簽工具和筆者的相性是非常好。
圖2.6.10 光標工具。
光標是一個非常好用的工具,光標的作用好比補助線,參考線或者對齊線,然而光標也可以充當計算時間個數的好幫手。光標工具的常用功能如圖2.6.10所示:
l 添加光標,就是添加新光標;
l 刪除光標,就是刪除當前選擇光標;
l 上一個信號沿,就是將當前光標移至當前信號的上一個信號沿;
l 下一個信號沿,就是將當前光標移至當前信號的下一個信號沿;
l 上一個下降沿,就是將當前光標移至當前信號的上一個下降沿;
l 下一個下降沿,就是將當前光標移至當前信號的下一個下降沿;
l 上一個上升沿,就是將當前光標移至當前信號的上一個上升沿;
l 下一個上升沿,就是將當前光標移至當前信號的下一個上升沿。
信號沿是時序基礎的基礎,所謂觸發沿,有時候也稱為觸發沿,亦即信號發生狀態變化的那一刻。下降沿,意指由高變低的信號沿;換之,上升沿意指由低變高的信號沿。不管物理時序還是理想時序,信號沿的概念也是相同的。為了讓讀者有感知認識一下光標工具的作用,筆者稍微示范幾個光標工具常用的例子。
圖2.6.11 添加光標,選擇信號,光標信息。
如圖2.6.11所示,筆者新添加一個光標,光標信息顯示框表示該光標名為 Cursor4(簡稱C4——塑料炸彈~笑),指向位置為0.01ns。單條光標的作用下,C4作為信號的對齊補助線。
說點題外話。人的大腦是非常喜歡偷懶的東西,其中有這樣的實驗說過:當一個人步入一間四方空間以后,大腦為了省事,就會記錄四方空間8個對角,作為平衡校准。同樣的道理發生在光標的身上,時序圖是一種並行可視化的記錄,在此對齊作用的補助線可以減輕眼睛還有大腦的負擔。
圖2.6.12 隨着信號的上升沿移動光標
舉例CLK信號與C4光標同時被選中。我們知道CLK信號一般將上升沿作為觸發沿,如果筆者預想來回移動在於CLK信號之間的上升沿,筆者可以執行上一個上升沿還有下一個上升沿功能,結果如圖2.6.12所示,C4已經移動至 0.15ns的位置。
圖2.6.13 計算信號的周期時間。
假設筆者預想結出 Start_Sig信號的周期,於是筆者再新添加一個光標,名為Cursor5(簡稱C5)。C4移至0.01ns的位置,然而C5移至0.29ns的位置,然后光標工具之間會自動求出時間差。如圖2.6.13所示,Start_sig信號位於C4~C5之間一共占有0.28ns時間。如果筆者為進一步求出Start_Sig信號位於C4~C5之間一共占用多少個時鍾,筆者可以這樣計算:
Start_Sig信號周期 / 時鍾周期 = 0.28ns / 0.02ns
= 14
結果而言,Start_Sig信號位於C4~C5之間,一共占用14個時鍾。
圖2.6.14 鎖定光標。
光標是一種非常頑皮的工具,時常跑來跑去,因此我們可以配合光標信息顯示框的鎖定功能來固定光標。如圖2.6.14所示,筆者沿着左下方點擊鎖定按鍵以后,C4就這樣被固定住了,換之C5卻沒有。除了鎖定功能以外,光標信息框還有兩個像極 ”把手“ 還有 ”禁止進入“的按鍵,前者是配置光標,后者是刪除光標,總之是非常單純的功能,用不着筆者特意解釋吧?
鎖定功能算是筆者比較常用的光標功能之一,像筆者這種喜歡作記錄的男人,有時候為了標記詳細的時序過程,動不動就會用上十幾來個光標。如果每個光標都跑來跑去的話,筆者會直接發瘋的,因此鎖定功能在某種意義上已經多次拯救筆者的小命。
圖2.6.2 Wave界面簡介。
圖2.6.2顯示,除了波形圖顯示框或者光標信息顯示框以外,還有一個名為仿真信號顯示框的東西。筆者曾在2.5小節演示過,仿真信號可經由自動編譯自行添加又或者人為后期添加都行。仿真信號顯示框相較其它,自身隱藏的功能不僅豐富而且也非常實用。仿真信號顯示框的左邊是仿真信號的命名,右邊則是信號處於當前時鍾的結果。前者可以更動,后者則不行。
| ①單位寬信號 |
②多位寬信號 |
圖2.6.15 單位寬與多位寬仿真信號。
仿真信號一般分為兩種,亦即單位寬信號還有多位寬信號,如圖2.6.15所示。單位寬信號例子有 CLK信號,RSTn信號,Start_Sig信號還有 Done_Sig信號,一般格式皆為 Logic邏輯。多位寬信號例子有 Multiplicand信號,Multiplier信號,Product信號還有i信號,一般格式皆為 Literal。
圖2.6.16 展開多位寬信號。
我們可以經過右鍵點擊任意信號,然后沿着Format的右方更換格式也有可能,不過一般卻不會這么作。Logic顧名思義不是零既是一,然而Literal在此則是添加的意思。所謂的多位寬仿真信號是由N個單位寬仿真信號疊加而成,如圖2.6.16所示,筆者故意展開仿真信號i,然而里邊都是單位寬仿真信號。
圖2.6.16 多位寬仿真信號的模擬格式。
多位寬仿真信號還有另一個有趣的顯示格式,亦即模擬格式(Analog)。如圖2.6.16所示,筆者選擇 Product 信號作為小白鼠,然后更改模擬格式。緊接着,Product信號的波形圖再也不是疊加格式而是模擬格式。模擬格式有 Automatic(自動)與Custom(自定義)。
① 模擬格式——階梯式。
② 模擬格式——加入式。
③ 模擬格式——后退式。
圖2.6.17 各種模擬格式。
自動模擬格式會執行設置,顯示高度(Height),還有最大值(Max)和最小值(Min)的范圍,階梯式作為默認模擬格式,反之自定義模式必須手動設置上述幾個選項。此外,除了默認的階梯式①以外,模擬格式還有加入式②,或者后退式③(預想知道什么式請自行谷歌),各種效果如圖2.6.17所示。模擬格式的程度仿真AC/DC或者波形算法以外才使用而已,普通情況下很少用上。
圖2.6.18 更改進制。
多位寬仿真信號除了可以更改格式(Format)以外,還能更改基數(Radix)。如圖2.6.18所示,筆者將 Multiplicand信號,Multiplier信號,Product信號,還有 i信號更改為十進制。此刻,仿真信號顯示框,還有波形顯示框的文字信息都為十進制表示。曾經有同學問過筆者,如何批量更改仿真信號的顯示基數?方法非常簡單,只要按住<Ctrl>鍵或者<Shift>鍵多項選擇仿真信號,然后右鍵點擊其中一個選中信號再更改基數,結果其它被選中的仿真信號也會跟着變動。
Modelsim可以支持的基數如表2.6.1所示:
表2.6.1 Modelsim可以支持的顯示基數。
| Symbolic作用不明 |
Binary二進制 |
Octal 八進制 |
Unsigned 無符號位 |
||
| Hexadecimal 十六進制 |
ASCII 字符 |
Time 時鍾單位 |
Fixed Point 定點 |
||
| UseGlobalRadix 作用不明 |
Numeric Enums作用不明 |
Symbolic Enums 作用不明 |
|||
如果表2.6.1所示,盡是常見的基數,不過如Time 或者 Fixed Point它們是比較特殊的基數,此外還有一些作用不明的基數,怒筆者知識有限不懂說明,有興趣的朋友可以自行研究看看。
有時候我們會遇見仿真信號過多,結果逼不得已不分組仿真信號。根據筆者的習慣,仿真信號一共有3種分組方法,亦即 New Window Pane分組,Add Divider 分組,還有 Group 分組。
圖2.6.19 New Window Pane 分組。
如圖2.6.19所示,隨便右鍵任意仿真信號,然后沿着 Add 選擇 New Window Pane,然后Modelsim會自動向下添加新Window Pane,接着利用滑鼠手動拖拽仿真信號進入即可。
圖2.6.20 刪除 Window Pane。
New Window Pane 分組有一個非常頭疼的問題,Window Pane雖然容易添加,不過刪除 Window Pane卻比較麻煩。如圖2.6.20所示,我們可以經由 Edit菜單選擇 Delete Window Pane 來刪除當前選擇的 Window Pane,但是連同組內信號都會一同刪除。New Window Pane 分組看似作用不大,不過如果解讀時序比較隨意,好比使用衛生紙擦完既丟的話,New Window Pane分組不差是一個好方法。
圖2.6.21 Add Divider分組。
Add Divider 分組是筆者常用的分組方法之一。如圖2.6.1所示,右鍵點擊任意仿真信號,沿着Add 然后選擇New Divider。Add Divider分組可以注釋組名,圖中筆者將仿真信號分為四組,亦即 Environment Signal,Input Signal,Output Signal,還有Misc。如果解讀時序仔細而且又不是最終的話,Add Divider是不錯的分組方法。此外,Add Divider 生成的分割線可以當成仿真信號按 <Delete> 鍵刪除。
圖2.6.22 Group分組。
最后還有一個分組方法就是 Group 分組,我們可以選擇預想分成一組的仿真信號,然后右鍵點擊任一仿真信號,再者選擇Group,過程如圖2.6.22所示。圖中,筆者將所有仿真信號分為四組。
圖2.6.23 暫開或者回收Group分組仿真信號。
Group 分組相較 Add Divider 分組,前者可以注釋組名以外,也可以任意暫開或者回收相關的分組,效果如圖2.6.23所示。
圖2.6.24 撤銷Group分組。
除此之外,撤銷Group分組也非常簡單,如圖2.6.24所示,選擇預想撤銷的分組,然后右鍵點擊 Ungroup即可。Group 分組不管上看下看還是左看右看都是最好的分組方法,除了注釋組名以外,組名也可以一同顯示在波形圖顯示框當中,而且展開回收分組功能也助於仿真信號管理。如果波形圖不是供人欣賞,筆者一般都不會使用它。
| ①右鍵點選擇Properties。 |
②選擇顏色。 |
圖2.6.25 信號選擇顏色。
仿真信號顯示框還有較為花俏的功能,亦即更改信號波形的顏色。如圖2.6.25所示,①筆者右鍵點擊 CLK信號,然后選擇 Properties。不一會兒,②Wave Properties窗口就會浮現在眼前,沿着Wave Color 點擊 <Colors>按鍵,結果又會跳出顏色小窗口,筆者選擇黃色。事后,CLK信號的波形圖顏色就會讓上黃色,過程誒圖2.6.25所示。
圖2.6.26 酷爆的波形圖。
只要讀者存有幾分心思為各組信號染上不同的顏色,最終會產生預想之外的效果。如圖2.6.26所示,是筆者心血來潮的藝術成果,讀者是不是覺得很酷呢?只要讀者有心,專業波形圖其實一點也不難做出來。
圖2.6.27 搜索工具。
如圖2.6.27所示是搜索工具,然而常用的功能有:
l 搜索信息,亦即尋找信息;
l 向后搜索,讓當前光標在當前信號上向左尋找搜索信息;
l 向前搜索,讓當前光標在當前信號上向右尋找搜索信息。
圖2.6.28 使用搜索工具。
搜索工具雖說是綜合工具,但是也只有仿真信號顯示框使用而已。如圖2.6.28所示,筆者同時選擇 Product 信號還有光標C2,接着筆者又在搜索信息輸入框中寫入”-55“,然后按回車鍵。回車鍵默認是向前尋找搜索信息,結果光標C2停留在Product信號 -55的地方。搜索工具的作用一般都是在海量信息種尋找某個結果。
圖2.6.29 保存Wave界面。
當我們完成Wave界面的最終設置以后,我們可以將當前wave界面保存下來。沿着File菜單點擊 Save Format,不一會 Save Format窗口就會浮在眼前。左下方記得勾選 Waveform formarts,然后輸入任意名字,.do文件就會保存在仿真項目的目錄下。在此,筆者將圖2.6.26的wave界面取名為 ArtWaveWorm,並且保存下來。這樣作有兩個目的,其一就是為未來做好復習的准備;其二就是與人分享。
雖然還有許多工具未曾涉及其中,不管初學也好還是熟爛也好,只要掌握上述方法,基本上已經足夠應付仿真了。享受節目當然要選擇清晰的畫面啦,然而操作Wave界面好比調節電視機的顯示狀態,只要wave界面足夠顯示時序細節,那么操作就到此為止。
余下,我們應該保留更多精力用來解讀時序,難道會有傻子使用電視不是觀賞節目,而是研究電視機的構造或者產生原理嗎?
總結:
Modelsim 是否等價仿真?答案當然是否定的,原因很單純,因為Modelsim只是一架性能比較優秀的電視機而已。然而,如何擺弄這架電視機使它播放最有用的節目才是學習 Modelsim的真正目的。不過,觀賞節目之前我們必須學會如何打開電視機,根據筆者的習慣,Modelsim有三種啟動方法,亦即:自動編譯,半自動編譯還有手動編譯。
作為初學或者已經熟透Modelsim的朋友,不管怎么樣,筆者還是強烈推薦使用自動編譯,然后再選擇性使用半自動編譯,至於手動編譯除非有特殊因數,不然就無視。仿真本來就是非常費勁耗力的差事,而且啟動modelsim 的過程也非常猥瑣,我們不應該耗費過多的盡力在作用性不大的地方。因此,自動編譯無疑是我們最好的節能手段,不過自動編譯也有局限性的弱點,結果選擇性使用半自動編譯就是彌補這方面的不足。
當Modelsim啟動成功以后,各種作用界面也會跟着浮現在我們的面前。常見的界面有, Project界面,File界面,Library界面,Transcript界面,Simulation界面,還有wave界面。自動編譯會省略 Project界面的執行過程,然而編譯成功以后的信息會保存在默認設計庫——Work里邊。Library界面有,除了臨時作用的設計庫以外,也有相關的資源庫。此外Library界面也可以充當“更新文件(編譯文件)”,還有“啟動仿真”的快捷入口。
Simulation界面需要啟動仿真成功以后才會浮現的仿真界面,Simulation界面一般省略名為sim界面。Sim界面的里邊隱藏大量仿真信號,不過自動編譯僅將仿真對象的輸入端作為仿真信號而已,換之半自動編譯還有手動編譯可以隨意添加仿真信號。仿真信號添加成功以后,便會移至wave界面的仿真信號顯示框當中。
如說Wave界面是Modelsim最重要的界面,話語一點也不過分。Wave界面的作用就是可視化Verilog HDL語言,也是俗稱的波形圖播放。Wave界面主要分為三個顯示框,亦即波形圖顯示框,仿真信號顯示框,光標信息顯示框。波形圖顯示框最為重要,而且操作工具也是最多;仿真信號顯示框,作用僅此與波形圖顯示框,它雖然沒有豐富的操作工具,不過本身自帶許多操作功能;光標信息顯示框,顧名思義就是用來顯示光標的信息還有管理光標,作用程度雖然不及前面兩者,但是也很重要。
如何操作wave界面,就是如何擺弄以上3個顯示框而已,然后再善用操作工具還有顯示框自帶的操作功能,以致將時序細節有多清晰就多清晰般顯示出來。根據筆者的習慣,對齊信號是非常重要的,因為可以節約眼睛的注意力還有大腦的焦距力,對此我們可以使用光標充當補助線。
除此之外,分組信號也非常重要,分組信號不僅造就管理仿真信號變成更加省力,而且解讀時序也能更加集中。然而,分組信號最根本的原因是讓波形圖變得更加整潔和美觀,因為順眼的東西可以柔化焦急的心情,打造仿真的好心境,好心情自然會產生好結果,這是千古不變的事實。



















































































![clip_image124[1] clip_image124[1]](/image/aHR0cHM6Ly9pbWFnZXMwLmNuYmxvZ3MuY29tL2Jsb2cvNDk0Mjc2LzIwMTMxMC8yOTEyMTgwMi1hOTNlMWJmZjBkMTc0MzBiOGVhYTE5M2ZjNTczMjUwMC5qcGc=.png)




















