菜鳥學習Modelsim 之 遇到的問題及解決方法

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,否則如果不確定初始狀態,而只給輸入的話,會沒有輸出。

16.

解決方法:查看錯誤段代碼:

可以發現,此處出現了兩個i1,一處是在實例引用的時候的實例名為i1,還有一處是埠名i1.因此可以知道實例名不可以取的和埠名一樣,將實例名改為其他名字。

17.監視語句應該放哪兒?

解決方法:如果想對整個程序進行監視,則監視語句應單獨寫在一個initial模塊中。

18.模擬時如果想快速的知道哪些信號在何時發生了變化,而不是用游標一個一個在波形上定位(比較慢),那就妙用監視語句monitor.

推薦閱讀:

妊娠紋解決方法有哪些?
母乳越來越少怎麼辦?解決方法全在這!
IIS_常見問題及解決方法
你知道身體為什麼會水腫嗎?健康哥告訴你原因和解決方法
膝關節損傷檢查以及膝內扣問題的解決方法

TAG:學習 | 方法 | 菜鳥 | 解決方法 | 問題 | Modelsim |