產品分類

      當前位置: 首頁 >

      類型分類:
      科普知識
      數據分類:

      FPGA設計仿真丨FPGA設計應用

      發布日期:2022-04-27 點擊率:41

      • 關鍵詞: FPGA
      • 摘要:關于FPGA設計仿真和硬件實測不一致問題的討論

      總結了一下個人項目中遇到的類似問題微處理器關于FPGA設計仿真和硬件實測不一致問題的討論, 大家如其遇到可以從以下方面動手檢查bug.

      1.存器未給初值;
      一個良好的習氣執意每個存器變量都要在reset里面預界說初值. 看下面一個例子:

      reg [1:0] unini;
      always@(posedge clk or negedge rst)
      begin
          if(~rst)
              ;//未給定初值
          else
          begin
               unini<=2'd1;
               if(unini<2'd1)
               a<=b;  
          end
      end

      這個例子是筆者在做項目標時辰真實經驗的一個bug的一個簡化描繪,現實代碼比這個要復雜得多,當初亦找了半晌最末才發明是存器未給初值這個低級毛病.
      對上段代碼,仿真的時辰,在rst之后的第一個clk上升沿,unini是未定態(即modelsim中的紅線), 這個未定態是不稱心鈞座面unini<2'd1這個環境的,因而這個上升沿后a不會被賦值b; 而在第二個時鐘上升沿之后才會滿意環境而舉行a<=b賦值;
      只是在硬件實測的時辰,存器里面的值必然是要么是1要么是0(一般默認的初值都是0),因而在第一個時鐘上升沿就會舉行a<=b的賦值,這么就造成了一個仿真結實和實測不相符合的bug.
      2.閉塞和非閉塞賦值混用.
      閉塞和非閉塞賦值在always里面混用是RTL設計的大忌,即便你很理解閉塞和非閉塞的規律,還是可能性因忽略造成難以發明的bug.看下面一段代碼:

      always@(posedge clk or negedge rst)
      begin
          if(~rst)
          ...
          else
          begin
              if(a)
                  c<=1'b1;//很早就將c賦值為1了
              else if(b)
                  c=1'b0; //注釋1
          end
      end

      reg state;
      always@(posedge clk or negedge rst)
      begin
          if(~rst)
              state<=1'b0;
          else
          begin
          case(state)
          1'b0:
          begin
               b<=1'b0;
               if(c)
                   state<=1'b1;
               ...
           end
           1'b1:
           begin
           ....
               if(...)
               begin
                   state<=1'b0;
                   b<=1'b1;
                   a<=1'b0;
               end
          end
          endcase
      end


      以上這段代碼亦筆者在真實項目中的一個血的教訓,在注釋1處毛病的應用了閉塞賦值,使得一個bug仿真的時辰沒有仿出來,實測的時辰一個記號一個記號地 查才最末定為到這個點.有趣味的可以仿真一下,如其b在state=1狀態時,clk的一個上升沿置1,state會即刻回到0狀態.此刻在state=0狀態時如其a不為1,b為1,這么應當在下一個時鐘上升沿之前c保全為1,因而state應當即刻轉回1狀態. 只是鑒于之前c=0用了閉塞賦值,在仿真的時辰就state就不會轉回1.而在實測的時辰,固然用了c=0閉塞賦值,只是依然比照<=概括(概括軟件在這種情況下會把=當做<=處置),這么就導致了一個本該在仿真階段揭露的bug未被即時發明.
      3.時序收斂問題;
      跟隨FPGA效能越來越壯大,時序問題將變得越來越要緊. 值當注重的是,以往時序問題常常因setup time不稱心足,而跟隨fpga能跑的越來越快,hold time violation也會越來越多地涌現.而hold violation首要解決方法有兩種, 率先讓記號跑在全局網絡上,這么固然慢,只是記號的skew也小. 其次可以經過插入LCELL等FPGA內延時原件來解決. 固然時序是個大問題,不度過必然要率先在確定效能準確后再動手動時序這快,你會發明絕大有些仿真經過只是實測不度過的緣故還是代碼的效能有問題,而鑒于一些緣故沒有仿真到.
      4.Multi-cornor Simulation
      多種情況下仿真. 即興在高端FPGA能做的事實曾經很接近大規模的ASIC電路,而ASIC級別的復雜度的FPGA設計請求的是實測前要舉行完善的效能驗證.譬如碼流動的長 度樣式的多種變更,數據的兩樣輸入速比值等多種情況都要舉行仿真.筆者盡力引薦大家仿真時辰放量用system verilog這種高級仿真言語,其有環境隨機激勵和assertion等效能可以極大增強代碼籠罩比值,十二分有助于發明那種普通定點看波形仿真發明不到的問題.記取一句話,復雜設計的仿真絕對不能拘囿在一點一點看波形,絕大多數數的bug是要編程靠程序主動發明的!!


      下一篇: PLC、DCS、FCS三大控

      上一篇: 索爾維全系列Solef?PV

      推薦產品

      更多
      主站蜘蛛池模板: 国产乱码精品一区三上| 日本精品高清一区二区| 狠狠色婷婷久久一区二区三区 | 日韩一区二区精品观看| 精品人妻少妇一区二区三区| 久久久国产精品无码一区二区三区| 一区二区三区四区无限乱码 | 国产一区二区三区免费观在线 | 男插女高潮一区二区| 中文字幕久久亚洲一区| 国产aⅴ一区二区三区 | 日韩毛片基地一区二区三区| 久久精品中文字幕一区| 丰满人妻一区二区三区视频| 精品日韩一区二区三区视频| 亚洲AV无码一区二区三区性色 | 中文字幕日韩欧美一区二区三区 | 中文日韩字幕一区在线观看| 中文字幕在线视频一区| 一区二区三区人妻无码| 国产一区二区三区在线影院| 国产亚洲自拍一区| 亚洲AV无一区二区三区久久| 性色A码一区二区三区天美传媒| 亚洲av无码不卡一区二区三区| 亚洲线精品一区二区三区 | 无码人妻AⅤ一区二区三区水密桃| 久久久国产精品无码一区二区三区| 色综合视频一区中文字幕| 无码人妻一区二区三区免费手机| 精品亚洲AV无码一区二区三区| 国产精品一区视频| 国产精品伦子一区二区三区 | 激情内射亚洲一区二区三区| 亚洲一区二区三区在线观看蜜桃 | 精品天海翼一区二区| 国产福利电影一区二区三区久久久久成人精品综合 | 日韩精品一区二区三区中文| 亚洲熟妇av一区| 波多野结衣一区二区三区高清在线| 亚洲国产专区一区|