失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Driver——同相运算放大器

Driver——同相运算放大器

时间:2023-05-04 07:08:23

相关推荐

Driver——同相运算放大器

概述

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);endendtask

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)endendtask

发送完成后,复位。

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——同相运算放大器》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。