將學習和使用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,否則如果不確定初始狀態,而只給輸入的話,會沒有輸出。
解決方法:查看錯誤段代碼:
可以發現,此處出現了兩個i1,一處是在實例引用的時候的實例名為i1,還有一處是端口名i1.因此可以知道實例名不可以取的和端口名一樣,將實例名改為其他名字。
17.監視語句應該放哪兒?
解決方法:如果想對整個程序進行監視,則監視語句應單獨寫在一個initial模塊中。
18.仿真時如果想快速的知道哪些信號在何時發生了變化,而不是用光標一個一個在波形上定位(比較慢),那就妙用監視語句monitor.