uvm白皮书练习_ch2_ch222加入factory机制

news/2024/12/29 18:37:18/

uvm白皮书练习_ch2_ch222只有factory机制
factory机制的实现被集成在了一个宏中:uvm_component_utils。
这个宏所做的事情非常多,其中之一就是将my_driver登记在UVM内部的一张表中,这张表是factory功能实现的基础。

自动创建一个类的实例并调用其中的函数(function)和任务(task)。
factory机制的实现被集成在了一个宏中:uvm_component_utils。
这个宏所做的事情非常多,其中之一就是将my_driver登记在UVM内部的一张表中,这张表是factory功能实现的基础。
只要在定义一个新的类时使用这个宏,就相当于把这个类注册到了这张表中。一个run_test语句会创建一个my_driver的实例,并且会自动调用my_driver的main_ phase。仔细观察run_test语句,会发现传递给它的是一个字符串。UVM根据这个字符串创建了其所代表类的一个实例。根据类名创建一个类的实例,这是uvm_component_utils宏所带来的效果,同时也是factory机制给读者的最初印象。只有在类定义时声明了这个宏,才能使用这个功能。
所以从某种程度上来说,这个宏起到了注册的作用。只有经过注册的类,才能使用这个功能,否则根本不能使用。
请记住一点:所有派生自uvm_component及其派生类的类都应该使用uvm_component_utils宏注册。除了根据一个字符串创建类的实例外,上述代码中另外一个神奇的地方是main_phase被自动调用了。
在UVM验证平台中,只要一个类使用uvm_component_utils注册且此类被实例化了,那么这个类的main_phase就会自动被调用。
这也就是为什么上一节中会强调实现一个driver等于实现其main_phase。所以,在driver中,最重要的就是实现main_phase。
上面的例子中,只输出到“main_phase is called”。
令人沮丧的是,根本没有输出“data is drived”,而按照预期,它应该输出256次。关于这个问题,牵涉UVM的objection机制。

dut.sv

module dut (clk,rst_n,rxd,rx_dv,txd,tx_en
);input clk    ;   input rst_n  ;   input rxd    ; input rx_dv  ;   output txd   ;  output tx_en ; reg [7:0]   txd;
reg         tx_en;  always @(posedge clk) beginif(!rst_n)begintxd     <=  8'h00;tx_en   <=  1'b0;endelse begintxd     <=  rxd;tx_en   <=  rx_dv;end
end
endmodule

mydriver.sv

`ifndef MY_DRIVER_SV
`define MY_DRIVER_SVclass my_driver  extends uvm_driver;`uvm_component_utils(my_driver)  function new(string name="my_driver",uvm_component parent =null);super.new(name,parent);endfunction //new()extern  virtual task main_phase(uvm_phase phase);//调用附近的代码
endclass //my_driver  extends uvm_drivertask 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<25;i++)begin@(posedge top_tb.clk);//等个时钟top_tb.rxd <= i[7:0];// top_tb.rxd <= $urand_range(0.255);top_tb.rx_dv    <= 1'b1;`uvm_info("my_driver","data is driver",UVM_LOW);end@(posedge top_tb.clk);top_tb.rx_dv    <=  1'b0;
endtask //my_driver::main_phase
`endif/*
2023-9-19 07:43:57
ch221
只有driver的验证平台
2023-9-19 07:44:44
ch222
加入factory机制*/

top_tb.sv

`timescale 1ns/1ns
`include "uvm_macros.svh"import uvm_pkg::*;
`include "my_driver.sv"module top_tb ;
reg         clk     ;    //时钟
reg         rst_n   ;   //复位
reg [7:0]   rxd     ;   //接受数据
reg         rx_dv   ;   //接受数据
reg [7:0]   txd     ;   //发送数据
reg         tx_en   ;   //发送数据dut my_dut(
.clk   (clk  ),
.rst_n (rst_n),
.rxd   (rxd  ),
.rx_dv (rx_dv),
.txd   (txd  ),
.tx_en (tx_en)
);// initial begin
//     my_driver drv;
//     drv = new("drv",null);//传入数据
//     drv.main_phase(null);
//     $finish;
// end
initial beginrun_test("my_driver");
end
/*时钟模块*/
initial beginclk = 0;forever begin#100ns clk = ~clk;end
end
/*复位模块*/
initial beginrst_n = 1'b0;#1000;rst_n = 1'b1;
end/*fsdb*/
initial begin$fsdbDumpfile("verilog.fsdb");$fsdbDumpvars(0);$display("fsdbDumpfilrs is start at %d",$time);// #1e7;// $finish;
end
endmodule

仿真结果

fsdbDumpfilrs is start at                    0--- UVM Report Summary ---** Report counts by severity
UVM_INFO :    1
UVM_WARNING :    0
UVM_ERROR :    0
UVM_FATAL :    0
** Report counts by id
[RNTST]     1

http://www.ppmy.cn/news/1125209.html

相关文章

SpringBoot 学习(一)自动装配

本系列文章为【狂神说 Java 】视频的课堂笔记&#xff0c;若有需要可配套视频学习。 1.1 pom.xml (1) 父工程&#xff08; spring-boot-starter-parent &#xff09; 核心依赖&#xff0c;静态资源过滤等配置。编写或导入 springboot 依赖时不需要指定版本号&#xff0c;继承…

【数据库原理与应用(第3版)】第三章:关系数据库理论(选择与填空)

目录 一、填空题二、选择题 一、填空题 关系模型用单一的数据结构&#xff0c;即【二维表】来描述实体以及实体之间的联系。关系数据模型中的关系可用二维表来表示&#xff0c;表中的一行对应关系的一个【元组】&#xff0c;表中的一列对应关系的一个【属性】。早期的关系操作…

MIPI协议介绍-CPHY

MIPI协议概述 MIPI(Mobile Industry Processor Interface): 是MIPI联盟发起为移动应用处理器制定的开放标准.MIPI接口协议层主要包括CSI和DSI两种,其中CSI主要用于图像输出&#xff0c;如图像传感器等&#xff1b; DSI主要用于图像输入&#xff0c;如屏幕显示器等.对于camera而…

root用户自动安装mysql 5.7脚本

#!/bin/bash # -*- codeing utf-8 -*- # Time : 2023/09/25 22:11 # Author : lidachuan # File : mysql_install.sh # Software : PyCharm #1.设置mysql安装目录 mysql_install/home/mysql #2.设置mysql安装目录 mysql_data/testdata #3.设置mysql端口 mysql_port3306 #4.设…

【算法深入浅出】字符串匹配之 KMP 算法

KMP 算法是一种字符串匹配算法。字符串匹配算法的目标是&#xff1a;在字符串 s 中找到与模式串 p 相等的子串&#xff0c;输出其位置。例如&#xff1a;s “abcdef”&#xff0c;p “cdef”&#xff0c;p 在 s 中的位置是 2&#xff08;从 0 开始计数&#xff09;。 容易想到…

CarbonData详细解析

一、CarbonData简介 CarbonData是一种新型的Apache Hadoop本地文件格式&#xff0c;使用先进的列式存储、索引、压缩和编码技术&#xff0c;以提高计算效率&#xff0c;有助于加速超过PB数量级的数据查询&#xff0c;可用于更快的交互查询。同时&#xff0c;CarbonData也是一种…

客户端负载均衡_负载均衡策略

以前的Ribbon有多种负载均衡策略 RandomRule - 随性而为 解释&#xff1a; 随机 RoundRobinRule - 按部就班 解释&#xff1a; 轮询 RetryRule - 卷土重来 解释&#xff1a; 先按照RoundRobinRule的策略获取服务&#xff0c;如果获取服务失败则在指定时间内会进行重试。 Weigh…

比特币上的可验证延迟函数

可验证延迟函数 (VDF) 是一种需要大量 顺序计算 来评估但可以快速验证的函数。我们首次在比特币上实现了它。VDF 作为密码学技术可用于构建大量新应用程序&#xff0c;例如公共随机信标、计算时间戳和数据复制证明。 VDF 场景 链上随机信标 在区块链中很难实现随机性&#xf…