modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错
困住整整一周了,工作進行不下去,中午偶遇導師,指導意見是有兩種可能:
1.? FPGA編譯器優化代碼,可以考慮把綜合過程中所有的warning排查一下
2.? verilog里有不可綜合的語句。
又及,原有的功能模塊完全正確,自己改寫的不行,導師說那是自己寫的時序不對,仿正確的模塊看modesim里自己寫的和正確的模塊時序差在哪里,修改自己的。
添加各種(*keep="true"*),未果
排查所有warning,沒看到會和這個問題相關
相信大神導師寫的代碼不會有問題
一下午加晚上各種折騰,甚至畫卡諾圖與非門硬寫了一個bit_mask,嗯,AHB總線的HSIZE+ADDR選擇屏蔽哪個字節的代碼有了:
等綜合的時候胡亂看modelsim,突然發現了個小毛刺:
開始懷疑寫的時候沒有對齊,引出hready信號加在寫使能寄存器控制端,最后一遍綜合,沒有報希望,開始收拾桌子,打算明天再搞了,然后,生活永遠比電視劇精彩,峰回路轉,柳暗花明。
其實最開始分析代碼的時候考慮過這個問題,還試了,只是加在了byte_mask寄存器的控制端,無效。當時也隱約考慮過這個寫使能信號好可疑的樣子,然后...不知道為什么沒有追究下去,中間modelsim仿真看波形各種折騰兩天。
想起回家時候爺爺經常叨叨我的話,現在覺得好有道理。
問題找到了,第二天用了大半個下午分析原因:
正常的總線讀寫時序應該是這樣:
因為加了HREADY控制就好了,本來是懷疑第二拍寫數據的時候數據沒有準備好,那HREADY定然是低電平,像這樣:
怎么分析都覺得好有道理的樣子,嗯,定然是這樣,由于沒有用HREADY來控制寫使能信號,導致寄存器在不該更新的時候更新了??墒亲屑毻魄?#xff0c;又傻了,因為mask信號是用HREADY控制的,如果數據沒有準備好,mask不會變,進而寫入的還是會正確。
仔細再想,覺得問題不是出在總線數據沒準備好,是HREADY有效總會比其他控制信號有效到的晚,是這樣:
根據verilog,寫使能信號
ce_re = HSEL&HWRITE&HTRANS[1]&HADDR[相應的地址]如果在時鐘上升沿,這些信號已經都有效了,就會導致不用HREADY控制的寫使能寄存器比期待的提前一拍置位(寫使能應該在寫數據周期有效,而不應該在寫地址周期有效),而此刻mask信號還在等HREADY,不會有效,從而導致寫寄存器錯誤。
附帶兩個小現象也解釋的通:
1.? 完全相同的邏輯,m0p沒有這個問題 - m0p訪問指令、數據、外設都用這同一組總線,總線表示自己很忙,控制信號可能不會跑的那么快(只是這么猜測,不確定)。
2. KEIL調試的時候一個現象,對于如下代碼:
*(int *)(0x40000000) = 0x12345678; *(char *)(0x40000000) = 0x55;如果單步調試,第二拍寫入會導致0x40000000地址處其他字節都變為零0x00000055,但如果在中間塞一個訪問總線的語句,比如這樣:
1 *(int *)(0x40000000) = 0x12345678; 2 c0 = *(int *)(0x40000000) 3 *(char *)(0x40000000) = 0x55;就沒問題,執行完第三行,0x40000000地址處數據為0x12345655,正確寫入不影響其他。又想起cm4手冊里對LDR STR指令的注釋:總線流水可達到一周期仿問。
因為總線流水的時候,din剛剛好保持了上一個時鐘里給寫進來的數據,雖然寄存器變了,但下一拍的寄存器數據是這一拍數據和寄存器的組合電路,由于mask和din的狀態,保證剛好下一拍寫入寄存器的數據沒有變。就是這樣:
數據的正確不是因為總線流水的時候寫使能信號怎么了,是因為上一拍的寫入數據剛好在。
?
轉載于:https://www.cnblogs.com/zhengmeisong/p/7710329.html
總結
以上是生活随笔為你收集整理的modelsim仿真正确FPGA运行不正确的可能原因 - cm4写寄存器错的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017-2018-1 20155234
- 下一篇: 刷题总结——拆网线(noip模拟 贪心