當前位置: 首頁 >
發布日期:2022-04-27 點擊率:41
總結了一下個人項目中遇到的類似問題微處理器關于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