在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1757|回复: 4

[求助] UVM实战2.2.1实验求助!

[复制链接]
发表于 2021-10-5 20:23:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
DUT代码如图: image.png
tb代码如图:
image.png
my_driver代码:
`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;

   function new(string name = "my_driver", uvm_component parent = null);
      super.new(name, parent);
   endfunction
   extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phase phase);
   top_tb.rxd <= 8'b0;
   top_tb.rx_dv <= 1'b0;
   while(!top_tb.rst_n)
      @(posedge top_tb.clk);
   for(int i = 0; i < 256; i++)begin
      @(posedge top_tb.clk);
      top_tb.rxd <= $urandom_range(0, 255);
      top_tb.rx_dv <= 1'b1;
      `uvm_info("my_driver", "data is drived", UVM_LOW)
   end
   @(posedge top_tb.clk);
   top_tb.rx_dv <= 1'b0;
endtask
`endif


我想请教的问题是 task my_driver中 while语句有什么用呢? 我把他注释掉后产生的波形没任何变化,我原本的理解是rst信号为0时才会进入while后的语句。
发表于 2021-10-6 10:39:37 | 显示全部楼层
while(!top_tb.rst_n)
      @(posedge top_tb.clk);

注意while(!top_tb.rst_n)后面没有分号,所以这两行代码的含义是只要rst_n没有置1(也就是复位没有解除的情况),就一直等待,为避免死循环,所以等待的过程中要加入延时,也就是@(posedge top_tb.clk)。一直等到rst_n置1了,才继续执行下面的代码。
发表于 2021-10-6 10:53:37 | 显示全部楼层
本帖最后由 li5panlong 于 2021-10-6 10:57 编辑

就是等复位撤销。


在这个练习里可能没多大用。

但是这是个很重要的思路:
复位要处理。
uvm中有专门用来处理复位的reset_phase。
平常验证一个dut的时候,也需要对硬复位、软复位、上电复位、器件运行中复位等等验证点考虑。

发表于 2021-10-10 11:35:31 | 显示全部楼层
没变化的话,调整一下你调用main_phase的那个initial块和给rst_n赋值的initial块的顺序。
正好前段时间遇到过。
发表于 2021-10-11 07:54:56 | 显示全部楼层
没什么变化,只是在数字中,一般一切信号都要跟时钟有关,才能保证时序不出错。如果没有时钟,有可能导致不是该top_tb.clk为上升沿时执行下面的语句,可能导致一些信号的时序不满足,从而出错。你这里刚好是无关紧要而已。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-9-23 03:21 , Processed in 0.017072 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表