當(dāng)前位置: 首頁 >
發(fā)布日期:2022-04-27 點擊率:42
總結(jié)了一下個人項目中遇到的類似問題微處理器關(guān)于FPGA設(shè)計仿真和硬件實測不一致問題的討論, 大家如其遇到可以從以下方面動手檢查bug.
1.存器未給初值;
一個良好的習(xí)氣執(zhí)意每個存器變量都要在reset里面預(yù)界說初值. 看下面一個例子:
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
這個例子是筆者在做項目標(biāo)時辰真實經(jīng)驗的一個bug的一個簡化描繪,現(xiàn)實代碼比這個要復(fù)雜得多,當(dāng)初亦找了半晌最末才發(fā)明是存器未給初值這個低級毛病.
對上段代碼,仿真的時辰,在rst之后的第一個clk上升沿,unini是未定態(tài)(即modelsim中的紅線),
這個未定態(tài)是不稱心鈞座面unini<2'd1這個環(huán)境的,因而這個上升沿后a不會被賦值b;
而在第二個時鐘上升沿之后才會滿意環(huán)境而舉行a<=b賦值;
只是在硬件實測的時辰,存器里面的值必然是要么是1要么是0(一般默認(rèn)的初值都是0),因而在第一個時鐘上升沿就會舉行a<=b的賦值,這么就造成了一個仿真結(jié)實和實測不相符合的bug.
2.閉塞和非閉塞賦值混用.
閉塞和非閉塞賦值在always里面混用是RTL設(shè)計的大忌,即便你很理解閉塞和非閉塞的規(guī)律,還是可能性因忽略造成難以發(fā)明的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
以上這段代碼亦筆者在真實項目中的一個血的教訓(xùn),在注釋1處毛病的應(yīng)用了閉塞賦值,使得一個bug仿真的時辰?jīng)]有仿出來,實測的時辰一個記號一個記號地
查才最末定為到這個點.有趣味的可以仿真一下,如其b在state=1狀態(tài)時,clk的一個上升沿置1,state會即刻回到0狀態(tài).此刻在state=0狀態(tài)時如其a不為1,b為1,這么應(yīng)當(dāng)在下一個時鐘上升沿之前c保全為1,因而state應(yīng)當(dāng)即刻轉(zhuǎn)回1狀態(tài).
只是鑒于之前c=0用了閉塞賦值,在仿真的時辰就state就不會轉(zhuǎn)回1.而在實測的時辰,固然用了c=0閉塞賦值,只是依然比照<=概括(概括軟件在這種情況下會把=當(dāng)做<=處置),這么就導(dǎo)致了一個本該在仿真階段揭露的bug未被即時發(fā)明.
3.時序收斂問題;
跟隨FPGA效能越來越壯大,時序問題將變得越來越要緊. 值當(dāng)注重的是,以往時序問題常常因setup time不稱心足,而跟隨fpga能跑的越來越快,hold time violation也會越來越多地涌現(xiàn).而hold violation首要解決方法有兩種, 率先讓記號跑在全局網(wǎng)絡(luò)上,這么固然慢,只是記號的skew也小.
其次可以經(jīng)過插入LCELL等FPGA內(nèi)延時原件來解決.
固然時序是個大問題,不度過必然要率先在確定效能準(zhǔn)確后再動手動時序這快,你會發(fā)明絕大有些仿真經(jīng)過只是實測不度過的緣故還是代碼的效能有問題,而鑒于一些緣故沒有仿真到.
4.Multi-cornor Simulation
多種情況下仿真.
即興在高端FPGA能做的事實曾經(jīng)很接近大規(guī)模的ASIC電路,而ASIC級別的復(fù)雜度的FPGA設(shè)計請求的是實測前要舉行完善的效能驗證.譬如碼流動的長
度樣式的多種變更,數(shù)據(jù)的兩樣輸入速比值等多種情況都要舉行仿真.筆者盡力引薦大家仿真時辰放量用system verilog這種高級仿真言語,其有環(huán)境隨機(jī)激勵和assertion等效能可以極大增強(qiáng)代碼籠罩比值,十二分有助于發(fā)明那種普通定點看波形仿真發(fā)明不到的問題.記取一句話,復(fù)雜設(shè)計的仿真絕對不能拘囿在一點一點看波形,絕大多數(shù)數(shù)的bug是要編程靠程序主動發(fā)明的!!
下一篇: PLC、DCS、FCS三大控
上一篇: 索爾維全系列Solef?PV