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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
楼主: doogo

[原创] 《UVM实战》24小时问答

[复制链接]
发表于 5 天前 | 显示全部楼层
大佬您好,我对《UVM实战》的代码2.2.1的代码产生疑惑,主要是关于rst_n信号的:
在src/ch2/section2.2/2.2.1/my_driver.sv中的位于main_phase函数的第14和15行代码 while(!top_tb.rst_n)  @(posedge top_tb.clk); 表达的意图是等待复位释放(即rst_n变为1)。


但是我在使用QuestaSim2021.2进行调试时,发现main_phase函数先于top_tb的rst_n = 1'b0;执行,此时rst_n为x,while(!top_tb.rst_n)检查通过,代码运行到第16行 for (int i = 0; i < 256; i++)...。这样的代码是不是不符合设计意图呢?
把代码while(!top_tb.rst_n)改为while(top_tb.rst_n !== 1'b1)似乎是可以的,但我也不知道是不是合适的。恳请您给出合理的解答,感谢感谢!
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
关于源码2.2.4,我还有个疑问想请教大佬:
即uvm_config_db::set为何可以先于uvm_config_db::get执行?为什么?
执行run_test("my_driver");,会在什么地方停下来,将执行权交由其他进程?

相关代码如下:


// top_tb.sv

`timescale 1ns/1ps
`include "uvm_macros.svh"

import uvm_pkg::*;
`include "my_if.sv"
`include "my_driver.sv"

module top_tb;

reg clk;
reg rst_n;
reg[7:0] rxd;
reg rx_dv;
wire[7:0] txd;
wire tx_en;

my_if input_if(clk, rst_n);
my_if output_if(clk, rst_n);

dut my_dut(.clk(clk),
           .rst_n(rst_n),
           .rxd(input_if.data),
           .rx_dv(input_if.valid),
           .txd(output_if.data),
           .tx_en(output_if.valid));

initial begin
   clk = 0;
   forever begin
      #100 clk = ~clk;
   end
end

initial begin
   rst_n = 1'b0;
   #1000;
   rst_n = 1'b1;
end

initial begin
   run_test("my_driver");
end

initial begin
   uvm_config_db#(virtual my_if)::set(null, "uvm_test_top", "vif", input_if);
end

endmodule


// my_driver.sv

`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;

   virtual my_if vif;

   `uvm_component_utils(my_driver)
   function new(string name = "my_driver", uvm_component parent = null);
      super.new(name, parent);
      `uvm_info("my_driver", "new is called", UVM_LOW);
   endfunction

   virtual function void build_phase(uvm_phase phase);
      super.build_phase(phase);
      `uvm_info("my_driver", "build_phase is called", UVM_LOW);
      if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
         `uvm_fatal("my_driver", "virtual interface must be set for vif!!!")
   endfunction

   extern virtual task main_phase(uvm_phase phase);
endclass

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


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2025-9-3 16:11 , Processed in 0.585754 second(s), 3 queries , Gzip On, Redis On.

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