FPGA萌新成长记
从实际项目角度答一波。我们团队做FPGA验证时,SVA用得越来越多,尤其是新项目。主要用在两个方面:一是模块级验证,在接口上加断言,相当于给模块戴了“紧箍咒”,一旦有问题仿真立马停,省得你追波形;二是做跨时钟域检查(CDC),虽然Vivado有专门的CDC分析工具,但写点简单的SVA检查同步器输入输出关系也挺直观。
Vivado仿真支持没问题,2018版以后对SystemVerilog的支持就很好了。但要注意仿真性能,断言太多会拖慢仿真速度,所以建议关键路径上才加。
快速上手的例子?给你几个马上能用的:
检查FIFO的满标志:当写指针追上读指针时,满标志必须为1。可以写成:`assert property (@(posedge clk) (wr_ptr == rd_ptr) && wr_en |-> fifo_full);` 当然实际要考虑指针位宽和格雷码转换,但思路是这样。
检查握手协议:比如valid/ready握手,data在valid为高且ready为高时才能变化。`assert property (@(posedge clk) $stable(data) throughout (valid && !ready)[->1]);` 这个断言确保在valid为高到ready为高这段时间,data保持不变。
学习资料,除了上面大家说的,再推荐个视频课程:Coursera上的“Hardware Description Languages for FPGA Design”,里面有一周专门讲SVA,例子都很接地气。
总之,SVA是个好工具,在FPGA验证里用好了能事半功倍。别被ASIC专属的说法吓住,工具支持够了,剩下的就是习惯问题。
