概述

class ue_driver extends uvm_driver #(ue_transaction);bit show_info;ue_config cfg;virtual ue_interface vif; `uvm_component_utils(ue_driver)extern function new(string name ="ue_driver",uvm_component parent = null);extern function void build();extern task run();extern protected task _reset_listener();extern protected task _get_and_drive();extern protected task _drive_transfer(ue_transaction t);extern protected task _do_idle();extern protected task _set_scaler(ue_transaction t);extern protected task _wr_base_number(ue_transaction t);endclass : ue_driver

不同的sequence对应不同的testcase,但是只有一个driver,所以driver中包含了所有需要用到的sequence配套方法。

1.build 和 new

function ue_driver::new(string name ="ue_driver",uvm_component parent = null);super.new(name, parent);`uvm_info(get_type_name(), $sformatf("created"), UVM_LOW)
endfunction : newfunction void ue_driver::build();super.build();if(!uvm_config_db#(ue_config)::get(this,"","cfg", cfg)) begincfg = ue_config::type_id::create("cfg");endshow_info = cfg.show_info_drv;`uvm_info(get_type_name(), "built", UVM_LOW)
endfunction : build

2.run

task ue_driver::run();super.run();vif.wr_en_i = 1'b0;vif.set_scaler_i = 1'b0;vif.wr_data_i = 1'b0;vif.rd_val_o = 1'b0;vif.rd_data_o = 1'b0;vif.scaler_o = 1'b0;while(!vif.rstn)@(posedge vif.clk);`uvm_info(get_type_name(), "start run()", UVM_LOW)forkue_driver::_get_and_drive();ue_driver::_reset_listener();join`uvm_info(get_type_name(), "end run()", UVM_LOW)
endtask : run

    首先将interface上所有信号复位。在时钟上升沿启动任务,当get and driver 以及reset listener均结束后,结束function run。

3.get and driver 和 reset listener

task ue_driver::_get_and_drive();forever begin seq_item_port.get_next_item(req);this._drive_transfer(req);void'($cast(rsp, req.clone()));rsp.set_sequence_id(req.get_sequence_id());seq_item_port.item_done(rsp);end
endtask

driver向sqr发送请求,sqr将transaction发送给driver。driver根据transaction不同类型进行不同的解析驱动DUT,同时将解析后的信号clone至rsp,返回sqr完成一次握手。

task ue_driver::_drive_transfer(ue_transaction t);if(show_info)t.print_info("ue_driver _drive_transfer");case (t.ttype) ue_transaction::IDLE:_do_idle();  ue_transaction::SET_SCALER:_set_scaler(t);  ue_transaction::WR_BASE_NUMBER:_wr_base_number(t); default:`uvm_error("ERRTYPE", "_drive_transfer mode err")endcaseendtask
task ue_driver::_reset_listener();forever begin @(negedge vif.rstn);vif.wr_en_i = 0;vif.set_scaler_i =0 ;vif.wr_data_i = 0;if(show_info)`uvm_info(get_type_name(), "_reset_listener done", UVM_LOW)end
endtask

发送完成后,复位。

4.三种不同的解析方式

task ue_driver::_do_idle();@(vif.cb_drv);vif.cb_drv.wr_en_i <= 1'b0;vif.cb_drv.wr_data_i<= 1'b0;
endtasktask ue_driver::_set_scaler(ue_transaction t);@(vif.cb_drv);vif.cb_drv.wr_en_i <= 1'b1;vif.cb_drv.set_scaler_i<= 1'b1;vif.cb_drv.wr_data_i <= t.wr_scaler;@(vif.cb_drv);//dut收到信号@(vif.cb_drv);t.rd_scaler = vif.cb_drv.scaler_o;
endtasktask ue_driver::_wr_base_number(ue_transaction t);@(vif.cb_drv);vif.cb_drv.wr_en_i <= 1'b1;vif.cb_drv.set_scaler_i <= 1'b0;   vif.cb_drv.wr_data_i <= {t.no,t.base_number};t.rd_scaler = vif.cb_drv.scaler_o;repeat(t.idle_cycles) _do_idle();
endtask

Driver——同相运算放大器相关推荐

  1. 《电路基础》同相运算放大器

    同相运算放大器

  2. 同相运算放大器电压增益计算

    同相运算放大器电压增益 运算放大器的放大主要取决于两个反馈电阻,如 R1 和 R2,它们连接在分压器配置中.R1 电阻器称为反馈电阻器 (Rf),提供给运算放大器反相引脚的分压器输出等效于 Vin,因 ...

  3. env——同相运算放大器

    放小豪老师的b站  IC验证 - 手把手教你搭建UVM芯片验证环境(含代码)_哔哩哔哩_bilibili 整个验证环境由4个组件组成,i_agt.o_agt .mdl(reference model) ...

  4. DUT——同相运算放大器

    一.DUT概述 系统信号 clk_i                                          系统时钟 rstn_i                              ...

  5. 运算放大器电路PCB的设计技巧

    印制电路板(PCB)布线在高速电路中具有关键的作用,但它往往是电路设计过程的最后几个步骤之一. 本文主要从实践的角度来探讨高速电路的布线问题. 主要目的在于帮助新用户当设计高速电路 PCB 布线时对需 ...

  6. 运算放大器应用汇总2

    内容包括Howland电流源的仿真与其定性分析.定量计算,峰值检波电路,正弦波信号频率测量电路,工业4-20mA转0-3.3V/5V/10V/15V转换变送器电路,基于LM358被动红外人体检测,单电 ...

  7. 运算放大器节点电压方程_干货分享 | 关于放大器配置,你不得不知道的22个常用设计方程...

    放大器种类纷繁复杂,有运算放大器.功率放大器,还有射频放大器.仪表放大器等等.作为电路学习中的一大课题,想必大家对于放大器配置肯定不陌生.为了帮助大家更好的学习该知识点,或随时对这一知识点" ...

  8. 运算放大器加法器设计学习笔记

    运算放大器构成加法器    可以分为同相加法器和反相加法器 第一种:同相加法器 举个栗子:Vin1=0.4*Sin(wt)   也就是一个正弦信号    Vin2=1V    那么要实现两个信号的叠加 ...

  9. 同相放大器原理是什么?

    在运算放大器电路中,有一个专有名词叫做"同相放大器".同相运算放大器通过两个规则工作,如电流规则和电压规则,电流规则指出没有电流流向运算放大器的输入,而电压规则指出运算放大器电压试 ...

最新文章

  1. 用eclipse在windows下搭建cocos2d-x开发环境
  2. 利用Hadoop Streaming处理二进制格式文件
  3. LeetCode: Longest Consecutive Sequence [128]
  4. oracle thread日志查看,请教归档日志的视图v$archived_log里的thread#的问题
  5. 【Level 08】U08 Positive Attitude L5 Satisfy your need to know
  6. linux下源码安装log4cxx
  7. 关于国庆假期延长的通知
  8. 再看中国互联网web2.0百强名单
  9. Netmeeting 安装步骤
  10. JS 获取浏览器高度和宽度
  11. 《视觉SLAM十四讲》笔记摘抄
  12. 计算机冰雪世界教案,教案有趣的冰
  13. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
  14. Leetcode 037 解数独 思路详解 python
  15. Python 画樱花树(樱花树下的约定)
  16. 一个压长定式衍生出的一个角部攻防
  17. APL开发日志--2012-12-03
  18. 软件工程专业大学生的一年半 | 2022年度总结
  19. 利用Python做excel文本合并(根据左侧单元格,快速合并右侧单元格内容)
  20. 使用账号激活MATLAB软件

热门文章

  1. 解决稻香老农无组件上传类在文件上传时当文件名中含中文单双引号取不到正确的文件名的方案
  2. Hydra 使用方法
  3. lecture12-玻尔兹曼机和受限玻尔兹曼机
  4. Python读写CSV文件
  5. python csv
  6. jQuery 知识总结
  7. 2019第四届新媒体千人峰会广州站将于6月正式开幕!
  8. Golang源码探究 —— 网络轮询器netpoller
  9. 【小程序从0到1】网络数据请求——request合法域名|GET|POST|跨域?Ajax?
  10. 临界区(临界段)的含义