將學習和使用Modelsim過程當中遇到的問題整理一下,並會不斷更新ing...
本人使用的Modelsim版本爲Modelsim SE-64 10.0c。
1.參照網上資料,用
仿真命令 add wave/testdiv/ *爲何沒法將信號加載進去?
解決方法:add wave * 命令就能夠了。
2.使用vsim testdiv語句(仿真命令)無法顯示全部的信號?
解決方法:多是仿真的時候被優化了,在library窗口-->選擇相應的模塊名-->simulate without optimization,不優化的仿真,能夠了。
3.利用modelsim聯合quartus進行仿真的時候,用quartus打開modelsim報錯:vsim is closed。
解決方法:由於modelsim在其餘工程中打開了,關閉其餘工程。
4.在Windows路徑下創立工程目錄,而後在Modelsim中在相應目錄下創立工程文件後,work仍是顯示unavailable?
解決方法:不要在windows下創立工做路徑,由於modelsim不會自動生成工做路徑,只能在創建工程的時候建立工做路徑,以後會提示沒有該路徑,是否建立該路徑,點擊是,仍是不行,在library中刪除原來的work,重建工程,從新編譯,能夠了。
5.Quartus產生testbech 測試文件,內部有eachvec變量時,仿真不成功。
解決方法:網上解答(當測試文件中有時鐘信號,而且有@eachvec時,仿真時間很短,若是在它以前有在always過程塊裏規定時鐘信號的翻轉的話,這個時鐘信號也不會翻轉,那一行註釋掉的話仿真才能獲得一段很長的波形。可是當測試文件中沒有時鐘信號,去掉這一行,仿真就沒有波形。推斷eachvec是相似時鐘信號同樣的驅動信號)。個人解決方法:通常在沒有clk的程序中,會保留eachvec ,有clk的程序中,屏蔽eachvec 。
6.在沒有時鐘信號,有eachvec 信號的測試程序仿真中,設定的信號值不會像預期設定那樣變化,會有一些中間值跳變出來,這是爲何?
解決方法:一開始我還覺得是eachvec的緣由,後來發現原來是程序寫錯(第一次寫測試文件,對一些語法還不是特別瞭解):
a <= 0;
b <= 1;
#200 a <= 1;
#200 b <= 0;
和
a <= 0;
b <= 1;
#200 a <= 1;b <= 0;
在intial引導的模塊中,上面兩段代碼是有很大區別的,前面一段的意思是延時200ps後給a賦值1,再延時200ps後給b賦值0,至關於從一開始延時了400ps後給b賦值0,因此a,b一共會有三個狀態:0,1-->1,1-->1,0。
然後面一段是過200ps後同時給a和b賦值1,0,因此a,b一共經歷了兩個狀態0,1-->1,0。
7.如有一個信號是8位q[7:0],那麼最終在波形圖中如何查看四位q[7:4]四位q[3:0]的值。
解決方法:之前在Quartus II自帶的仿真工具中,這個問題是很好解決的,只要分Group就行,後來查了相關資料,發現Modelsim雖然也有Group功能,可是隻能分組,就是說將q[7:0]分爲q[7:4]和q[3:0]後只能看到每一位的波形,而不能看到四位的波形。
後來我嘗試更改測試文件testbench中的輸出端口?無效。推測緣由是由於測試文件中的輸入輸出端口都是在原始的Verilog 文件中定義好的,不能隨意更改,測試文件主要是做輸入激勵用,天然不能更改輸出端口了,因而在Quartus中仔細查看由原理圖轉換而來的Verilog代碼,並更改了原始文件的輸出端口,更改成兩個輸出端口q1,q2,爲四位二進制,再最後將q[7:4]和q[3:0]賦值給q1和q2,從新生成testbench,調用modelsim仿真,就能夠了。
8.在一個計數器的波形文件中,將q[3:0]信號格式改成十進制時,本來應該是8,9的值,結果顯示-8,-7。
解決方法:查看了下面每一位的二進制數都是對的,把q[3:0]進制改爲了十六進制,顯示對了。
9.如何在modelsim中修改原設計文件。
解決方法:若是要在modelsim中修改原設計文件,在文檔頁面點擊右鍵,取消Read Only,便可修改,修改後繼續仿真。
10.如何在modelsim中查看任意信號波形。
解決方法:
在主界面中點View->Debug Windows->Dataflow能夠看到會出現dataflow窗口,在objects窗口中拖一個信號到該窗口中,你會發如今dataflow窗口中出現你剛纔選中信號所在的模塊,若是雙擊模塊的某一引腳,會出現與該引腳相連的別的模塊或者引線。
在dataflow窗口中點View->Show Wave,會在dataflow窗口中出現一個wave窗口,雙擊上面窗口中的某一模塊,則在下面的wave窗口中出現與該模塊相連的全部信號,若是已經執行過仿真,在wave窗口中還會出現對應的波形。
在波形窗口中拖動遊標,上面模塊的引腳信號的值也會隨着遊標當前位置的改變而改變。
11.如何保存波形文件。
解決方法:若是要保存波形窗口當前信號的分配,能夠點File->Save->Format,在出現的對話框中設置保存路徑及文件名,保存的格式爲.do文件。若是是想導出本身建立的波形(在文章最後有詳細的解釋)能夠選擇File->Export Waveform在出現的對話框中選擇EVCD File並進行相關設置便可,若是導入設計的波形選擇File->Import ECVD便可。
12.modelsim 仿真後輸出stx、 Hiz。
解決方法:仔細檢查了
電路,發現是有一個地方連錯了才致使的,因此你們遇到這種狀況最好先仔細的檢查一下本身的電路圖。
13.測試文件的激勵波形寫在哪?
解決方法:一開始我將各輸入的初始化寫在了intial模塊中,而把測試激勵的波形寫在了always中(由於該波形是重複循環的,因此一開始就想到寫在always中),怎麼調都調不對。看了相關的資料,好好理解了一下intial和always的區別:intial和always模塊都是同時並行執行的,區別在於intial模塊只執行一次,而always模塊則是重複不斷運行。
intial是面向仿真的,是不可綜合的,一般被用來描述測試模塊的初始化、監視、波形生成等功能。在進行仿真時,一個intial模塊從模擬0時刻開始仿真,且在仿真中只執行一次,在執行完一次後,該initial就被掛起,再也不執行。
若是仿真中有兩個initial模塊,則同時從0時刻開始執行。
所以我將激勵波形的生成寫在了initial中,只不過使用了while語句,並且我有兩個激勵波形,爲了因爲延時的緣由避免相互之間產生干擾,就用了兩個intial模塊,分別使用while,最終生成了預期的激勵波形。因此總結若是是激勵波形的生成仍是寫在intial中好。
14.若是提示錯誤:一些模塊沒有定義
解決方法:仔細檢查Quartus裏該模塊是否已經定義,若是已經定義,那麼就關閉Modelsim和Quartus,再從新打開從新編譯便可。
15.時序邏輯電路如何給激勵仿真
解決方法:時序邏輯電路當前輸出不只與當前輸入有關,還和當前狀態有關,所以在給激勵的時候,首先須要肯定一下初始狀態,好比清零端清零,這樣初始狀態就爲0,不然若是不肯定初始狀態,而只給輸入的話,會沒有輸出。html
16.
windows
解決方法:查看錯誤段代碼:工具
![](http://static.javashuo.com/static/loading.gif)
能夠發現,此處出現了兩個i1,一處是在實例引用的時候的實例名爲i1,還有一處是端口名i1.所以能夠知道實例名不能夠取的和端口名同樣,將實例名改成其餘名字。學習
17.監視語句應該放哪兒?測試
解決方法:若是想對整個程序進行監視,則監視語句應單獨寫在一個initial模塊中。優化
18.仿真時若是想快速的知道哪些信號在什麼時候發生了變化,而不是用光標一個一個在波形上定位(比較慢),那就妙用監視語句monitor.spa