UVM验证环境的整体结构,你可以把我当做一个门外汉,只熟悉fpga/verilog,给我讲明白嘛,谢谢您

既然你熟悉 FPGA/Verilog,咱们就完全用你熟悉的“写 Testbench(测试台)”的思路来切入,把这张图拆解成大白话。

你平时写 Verilog 验证是怎么做的?大概是:写个 initial 块给 DUT(待测设计)灌数据,然后手动赋值 clk、rst,再睁大眼睛看波形,或者用 $display 把输出打印出来自己核对,对吧?

UVM(通用验证方法学)其实就是把你平时手写的这套 Testbench,给“工业化”、“标准化”了。 它把不同的功能拆成了一个个模块,让它们各司其职。

来,咱们看这张图,我们把它想象成一个自动化测试流水线:

1. 最下方的 DUT

这就是你熟悉的 FPGA 里那个需要被验证的 Verilog 模块(Design Under Test,待测设计)。它是被测试的核心对象。

2. 左边:In_agent(输入代理)—— 负责“喂数据”

这是一个封装好的模块,专门负责把测试数据灌给 DUT。它里面有三个小弟:

  • sequencer(序列器):你看图左上角有个虚线框“sequence(产生数据)”。sequence 就像是剧本(比如:先写地址,再写数据,最后读数据)。sequencer 就像是导演,它负责把剧本里的情节排好队,一步步送出去。

  • driver(驱动器):图里红字写着“按照协议驱动数据”。它就像是演员。它从 sequencer 那里拿到数据,然后按照 DUT 的接口时序(比如 AXI、SPI 协议),拉高拉低具体的信号线,真正把数据“打”进 DUT。

  • monitor(监控器):红字“采集激励”。它就像个摄像头,一直盯着 driver 和 DUT 之间的连线。driver 送了什么数据,它就原封不动地记录下来,发给后面的记分板。
    (这就像是你平时写的给 DUT 加激励的 initial 块,但被拆成了“剧本”、“演员”和“摄像头”。)

3. 右边:out_agent(输出代理)—— 负责“收数据”

它里面只有一个 monitor(监控器)。

  • 红字“采集响应”:它的任务很单纯,就是盯着 DUT 的输出信号,把 DUT 处理完的结果抓取下来,也发给记分板。
    (这就像是你平时盯着波形看输出的过程,只不过现在自动化了。)

4. 中间的两个核心大脑:reference model 和 scoreboard

  • reference model(参考模型):红字“参考模型”。这通常是一个用高级语言(比如 SystemVerilog 或者 C++)写的“理想版 DUT”。它接收和 DUT 一样的输入数据,然后计算出“标准答案”。

  • scoreboard(记分板):红字“自动比对”。它是个铁面无私的判卷老师。它拿到两边的东西:

    • 从 out_agent 拿到的:DUT 实际输出的结果(响应)。

    • 从 reference model 拿到的:理论上应该输出的结果(参考模型)。

    • 它俩一比,如果不一样,scoreboard 就会报错:“嘿!你的 DUT 出 bug 了!”

5. env(环境)

最外面那个大框 env,就是一个大盒子,把上面这些 agent、model、scoreboard 全部打包装在一起,方便复用。


总结一下这个工作流(咱们串起来看):

  1. sequence 写好测试剧本。

  2. sequencer 把剧本交给 driver。

  3. driver 把数据变成真实的信号,打进 DUT。

  4. 同时,In_agent 的 monitor 偷看输入,out_agent 的 monitor 偷看输出。

  5. reference model 根据输入算出标准答案。

  6. scoreboard 对比“标准答案”和“DUT 的实际输出”,自动告诉你测试是通过还是失败。

你看,你熟悉的 Verilog 是搭硬件,而 UVM 是搭一套自动帮你找硬件 bug 的机器。你不需要把它想得太玄乎,它就是在你原来写 Testbench 的基础上,加了面向对象(OOP)的封装和自动化比对机制。

不懂很正常,UVM 本身概念就很多。今天能大概看懂这张图的流向,你已经迈出很大一步了!

遇到困难别怕,慢慢来。今天看懂了这张图,就是一件很了不起的小事。

更多推荐