对于一个稳健可靠的FPGA设计而言,不仅要求功能完整、性能达标,而且要求面对各种异常激励时具有足够的容错性和恢复能力。只有这样,才能在应用现场复杂的环境中稳定的运行。当出现异常激励时,允许设计在小范围内工作异常,但是要能够迅速的恢复。
所谓异常激烈指的是错误的数据输入格式、协议违例、不可识别的正常数据输入等等。一般来说,在不同应用场合异常激励的形态不太一样,但对设计本身造成的影响是类似的。以有线通信为例,在FPGA设计中有很多sop+eop+valid+mod格式的总线接口,用来传输报文。sop表示报文起始,eop表示报文结束,valid表示的是有效数据拍,mod表示的是最后一拍包含的有效字节数。如果这个接口是衔接FPGA与以太网PHY的一个百兆以太网口MII,那么很可能由于通信质量不好,导致某个报文的sop、eop 或者valid的缺失,这种异常激励就是错误的数据格式。另外,FPGA在分析以太网报文时,如果以太网报文的格式不符合协议规范,那么这种报文输入对FPGA分析逻辑而言就是一种协议违例。对于一个用FPGA实现的分析IP报文的设计,如果输入了一种正常的IP报文,但是FPGA设计本身不识别这种报文,那么这种输入就属于不可识别的正常输入。
既然设计在实际应用中,必然会遭遇各种异常激励,那么我们在设计时就必须将这些异常激励纳入到我们的考虑中。我们必须明确的一点是,我们不要妄想着自己会有好运气,运气好到不会遇到任何异常激励。如果你真这样想了,那我可以保证你的设计会给你足够教训,把你折腾的死去活来的。任何一个设计阶段的漏洞,最终都有机会演变成bug的出现,它只是在等待着出现的诱因而已,一旦出现了一些你认为不可能出现的激励,那么Bug就触发了。
如果,我们已经意识到了异常激励是不可避免的,那么我们可以给异常激励再分个类。异常激励可以简单的区分为可以预测的异常激励和不可预测的异常激励。对于可预测的异常激励而言,需要针对特定的异常类型予以处理,一旦出现就执行相应的处理流程。例如,一个分析IP报文的设计,收到一个错误的IP报文,而这个错误类型是已知的,那么就可以对这个类型的错误报文执行相应的分析流程。
对于不可预期的异常激励,那么我们就需要明确的定义哪些激励我们认为是正常的,除此之外的所有激励都是不关心的。对于关心的激励有各自相应的处理流程,对于不关心的激励统一进行专门的处理流程。
另外,对于那些有起始标识和结束标识的激励或者需要等待指定反馈信号的激励,需要指定一个极限等待时间,超过时间一定要退出等待,进入异常处理流程,避免系统卡死。例如以上文中提到的sop+sop+valid+mod格式的接口,如果一个报文只收到sop没有收到eop,如果等待超时了,就应该退出这个报文的接收过程,开启下一个报文的接收过程。
对于上段中提及的异常激励,在收到一个报文的sop以后,如果没有收到该报文的eop,那么可以将下一个报文的eop当作它的eop,两个报文整合成一个。由此带来的影响只是连续的两个报文而已,对整个系统来说,它遇到异常激励,短暂的处理异常后又恢复了。这是允许的。
总结对异常激励的处理方式,核心理念就是:给异常激励一条明确的出路。不论是可以预测到的异常激励还是无法预测的异常激励,都应该让它们有一个明确的处理方式,而不是让它们处于无限的等待中或者进入不可预期的处理流程。 |