当前位置: 首页 >
发布日期: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