关于UVM的知识网络上已经铺天盖地了,下边的内容只是自己的一些认识和随记。UVM其实就是基于SV语言写的用于验证的代码库和对应的验证规范。下图是UVM验证环境的整体结构(图来源见参考文献1)。图中注释介绍了每个组成部分的作用。《UVM实战》书中给我留下最深刻的印象就是用子弹、弹夹和手枪分别类比transaction sequence和sequencer,这也是UVM环境灵活的重要原因之一。这是激励的产生机制,至于响应的采集和响应任务会交给monitor和scoreboard。后者中的期望数据或者参考数据的来源比较灵活,函数、文件或是reference model的响应均可。

以上内容,你可以把我当做一个门外汉,只熟悉fpga/verilog,给我讲明白嘛,谢谢您

同学,坐。今天状态不错嘛,愿意拿着自己的随笔和这张图继续深挖,老师很欣慰。

你随笔里总结得挺精辟。的确,网上的资料铺天盖地,但别人嚼过的馍不香,自己悟出来的才是真的。你说你是只懂 FPGA/Verilog 的门外汉,那咱们今天就用你最熟悉的“写 Testbench”的思路,结合你这张图和《UVM实战》里的“枪弹比喻”,把这套结构彻底嚼碎咽下去。

你提到“子弹、弹夹、手枪”的比喻,这个比喻简直是绝杀。咱们就从这里开始:

🔫 第一幕:激励的产生(造子弹与开枪)

在 FPGA 开发里,你以前是怎么发激励的?大概率是写个 initial 块,给 clk、rst 赋值,然后手动设置 data_in = 8'hA5; #10; data_in = 8'h5A;。这在 UVM 里被“工业化”了:

  • transaction(子弹):你不想每次只发一根信号线吧?UVM 里把一组相关的信号(比如地址、数据、读写使能)打包成一个“类”(Class),这就是一颗子弹。它比 Verilog 里的 reg 抽象多了。

  • sequence(弹夹):你写一个 sequence,里面装了一串 transaction。这就叫弹夹。你可以造一个“连发弹夹”(10颗子弹),或者“点射弹夹”(3颗子弹)。

  • sequencer(手枪):图里 In_agent 里面的 sequencer,就是手枪。它负责拿着弹夹,把子弹一颗一颗地推给 driver。它决定了“什么时候开枪”、“打几发”。

  • driver(扳机与枪管):图里红字写着“按照协议驱动数据”。driver 就是扣扳机的手。它从 sequencer 拿到子弹(transaction),然后按真实硬件的时序(比如 I2C、SPI 协议),拉高拉低具体的信号线,把子弹真正“打”进 DUT 里。

你看,Verilog 里你是自己一个人既造子弹又扣扳机,UVM 把它们拆开,各司其职,这样你想换子弹(改数据),只需要换 sequence 就行,手枪(driver)不用换,这就是它灵活的原因。

📷 第二幕:响应的采集(靶场监控)

子弹打出去了,DUT 开始工作。你以前是怎么看结果的?是不是对着波形图,把眼睛瞪得像铜铃,看 DUT 的输出信号对不对?

UVM 里,这活儿交给了 monitor(监控器),它们就像是高速摄像机。图里有两个 monitor:

  • In_agent 里的 monitor(红字“采集激励”):它盯着 driver 和 DUT 之间的连线。它记录下:在几点几分(仿真时间),打了一颗什么子弹(数据)。

  • out_agent 里的 monitor(红字“采集响应”):它盯着 DUT 的输出引脚。它记录下:在几点几分,DUT 吐出了什么结果。

这两个监控器会把看到的一切,变成新的“子弹”打包传出去,交给后面的判卷老师。

🎯 第三幕:结果的比对(打靶计分)

靶子打中了没有?谁来判断?这就到了你随笔里提到的核心:reference model(参考模型)和 scoreboard(记分板)。

  • reference model(参考模型):图里说“参考模型”。这可以是你用 SystemVerilog 写的一个理想版 DUT(完美无瑕的硬件模型),也可以是一个 C 语言写的算法。输入和 DUT 一样,但它瞬间就能算出标准答案。这就相当于弹道预测仪。

  • scoreboard(自动比对):图里说“自动比对”。它是铁面无私的裁判。它拿到 out_agent 传来的实际结果,也拿到 reference model 算出的期望结果。两边一比对,如果不一样,裁判就会吹哨:“嘿!DUT 出 bug 了!”

关于你随笔里提到的“期望数据来源灵活”:
你写得很准。scoreboard 里的期望数据,不一定非得是 reference model 算出来的。它可以是从文件里读出来的(比如你之前跑 C 语言生成的黄金数据)、可以是系统函数算出来的、甚至可以是另一个 DUT 跑出来的结果。UVM 只负责提供“比对”的机制,数据从哪来,你说了算。

💡 老师视角的总结

你看,这张图其实就是把你在 Verilog 里写的那些杂乱的 initial、always、$display,按照“谁负责开枪(Driver)、谁负责录像(Monitor)、谁负责算分(Scoreboard)”进行了模块化的封装。

你熟悉 FPGA,你知道模块化设计的好处。UVM 就是验证领域的模块化设计。

  • 空间维度(图1):组件怎么连(Env 套 Agent 套 Driver/Monitor)。

  • 时间维度(图2,咱们上一课讲的):组件什么时候建(build)、什么时候跑(run)、什么时候停(objection)。

同学,看到这些英文缩写和庞大的概念,刚接触晕头转向是再正常不过的。你今天能总结出“子弹、弹夹、手枪”,并且理解数据来源的灵活性,说明你已经悟到了 UVM 精髓的冰山一角。

今天先消化到这。就像跑 run_phase 一样,觉得累了,就 drop objection 休息一下。你只管慢慢来,老师随时在这儿,你想什么时候聊,咱们就什么时候接着聊。加油!

参考链接:UVM基础总结——基于《UVM实战》示例 - 没落骑士 - 博客园

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐