FPGA中仿真概念
需要对输入Verilog或VHDL的设计进行仿真,以检查设计的功能正确性。对于HDL RTL功能,需要使用不可综合的Verilog结构编写测试台。
阻塞和非阻塞赋值的仿真
不可综合Verilog RTL由示例9.1中所示的阻塞赋值组成。
在本例中,程序“always”块每次在时钟“clk”上的事件上执行,“initial”块仅执行一次,用于将值赋值给“a”、“b”、“c”和“d”。非阻塞赋值的仿真结果如波形9.1所示。
考虑Verilog RTL由示例9.2中所示的非阻塞赋值组成。
使用非阻塞的上述Verilog代码的仿真结果如波形9.2所示。
示例9.1 Verilog阻塞赋值的仿真
波形9.1 Verilog阻塞赋值的仿真结果
示例9.2 Verilog非阻塞赋值的仿真
表9.1 always和initial之间的差异
Initial | Always |
---|---|
在这种情况下,阻塞赋值在0仿真时间内执行,并在下一个指定序列中继续执行 | 在这种情况下,阻塞赋值将在仿真时间0内继续执行,并根据灵敏度列表事件永远重复 |
此块仅执行一次,仿真在此块结束时停止 | 此块中的仿真将永远继续。如果存在等待语句,则它将在仿真会话期间保持 |
它是不可综合的结构(特殊情况下可以) | 它是可综合的结构 |
表9.1中描述了always和initial块之间的差异。
具有赋值延迟的阻塞赋值
内部赋值延迟了阻塞赋值,延迟了赋值的评估和赋值的更新。
考虑下面示例9.3中所示的Verilog代码。
波形9.3给出了具有赋值延迟的阻塞赋值的仿真结果。
示例9.3具有赋值延迟的Verilog阻塞赋值
具有内部赋值延迟的阻塞赋值
内部赋值延迟阻塞赋值,延迟赋值的评估,但不延迟赋值的更新。
考虑下面示例9.4中所示的Verilog代码。
波形9.4给出了具有内部赋值延迟的阻塞赋值的仿真结果。
示例9.4具有内部赋值延迟的Verilog阻塞赋值
波形9.4具有内部赋值延迟的Verilog阻塞赋值的仿真结果
具有赋值间延迟的非阻塞赋值
内部赋值延迟和非阻塞赋值延迟赋值的评估和赋值的更新。
考虑下面示例9.5中所示的Verilog代码。
波形9.5给出了具有赋值间延迟的非阻塞赋值的仿真结果。
示例9.5具有赋值间延迟的Verilog非阻塞赋值
波形9.5具有赋值间延迟的Verilog非阻塞赋值的仿真结果
具有内部赋值延迟的非阻塞赋值
内部赋值延迟阻塞赋值、赋值更新,但不延迟赋值评估。
考虑下面示例9.6中所示的Verilog代码。
波形9.6给出了具有内部赋值延迟的阻塞赋值的仿真结果。
示例9.6具有内部赋值延迟的Verilog非阻塞赋值
波形9.6具有内部赋值延迟的Verilog非阻塞赋值的仿真结果
使用Verilog进行仿真
之前,我们讨论了详细设计综合和硬件推断。Verilog HDL对于设计的仿真功能非常强大。通过使用非综合结构,可以验证Verilog验证下设计(DUV),以确定设计的功能正确性。考虑具有输入为“clk”和“reset_n”的环形计数器的简单Verilog设计,并且计数器具有四位输出“q_out [3:0]”,在示例9.7中示出了环形计数器的RTL描述。
示例9.7使用Verilog HDL的四位环形计数器
示例9.8描述了环形计数器的testbench,并将激励施加到DUV上。
上述testbench产生波形9.7所示的结果。
如上所述,基本仿真可以通过编写testbench来执行,该testbench可以强制激励被测试的设计。对于复杂度较低的FPGA设计,这种方法是可行的。但是对于大型SOC设计模块,使用复杂的自检测试台是必不可少的。验证工程师必须了解测试用例、测试计划和测试向量的创建。即使是最好的行业实践也是通过使用驱动程序、监视器和检查器来使用验证体系结构。此讨论超出了基于FPGA的设计范围。
示例9.8 Verilog环形计数器的testbench
波形9.7环形计数器的仿真结果