uvm实战(32位全加器)

(1)首先写明32位加法器的verilog代码
在这里插入图片描述
在这里插入图片描述
(2)interface.sv(使用时钟块控制同步信号的时序)

在这里插入图片描述

(3)my_transaction.sv(相当于数据包,具有生命周期,派生于uvm_object的派生类,uvm_sequence_item类)

  • 为激励成员指定rand属性
  • 将自定义的事务类向UVM注册(uvm_object_utils,uvm_field_int)
  • 约束项,控制随机成员的随机范围
  • uvm中包含着field_automatic机制,可以通过宏uvm_object_utils_begin和宏uvm_object_utils_end来实现my_transaction的factory注册,根据数据类型的不同,分为:
    在这里插入图片描述
    在这里插入图片描述

解释:
1、通过import语句将整个uvm_pkg导入验证平台中,只有导入这个库,编译器才能识别uvm_component类
2、uvm_macros.svh文件中包括众多宏定义
3、通过继承的方式修改构造函数

(4)my_sequence.sv

  • 从uvm_sequence扩展,其中后面的参数指定产生transaction的类型
  • 使用uvm_object_utils注册到factory中(也具有生命周期,当其中所有transaction发送完毕,即结束)
  • body()任务是sequence中的一个重要方法,作用是创建并控制transaction
  • 其中`uvm_do是uvm内建的宏,用来产生transaction,每调用一次产生一个transaction,是创建一个my_transaction的实例m_trans,将其随机化,最终送给sequencer
  • UVM通过objection机制来控制验证平台的关闭,在task phase中调用raise_objection()和drop_objection(),task phase其他需要执行的语句放在这两个方法之间,在执行消耗仿真时间语句之前raise_objection(),在task phase结束时drop_objection(),建议每一个task phase都raise,drop一次
    在这里插入图片描述

(5)my_sequencer.sv

  • 派送于uvm_sequencer类,并且使用宏uvm_component_utils注册到factory,参数是my_transaction类型
    在这里插入图片描述
    sequencer的作用:

  • 启动sequence

  • 将sequence产生的item发送到driver中

(6)my_driver.sv

  • 声明interface,在类中使用virtual interface,virtual my_if vif;(避免使用绝对路径)
  • 数据传递至reference model ,使用uvm_analysis_port #(my_transaction) ap;声明ap,并在build_phase中实例化ap
  • build_phase也是UVM内建的一个phase,当UVM启动后会自动执行build_phase,build_phase在new函数之后main_phase函数之前执行,在build_phase中主要通过config_db的set和get操作传递一些数据,以及实例化成员变量,由于build_phase是一个函数,所以不消耗仿真时间
  • config_db机制,分为set、get操作,set可以理解为“寄信”,而get相当于"收信“即设置配置资源,获取配置资源uvm_config_db#(type)::get(获取配置资源的源组件,配置路径,资源ID,目标变量或对象)
  • main_phase(),driver从这个方法完成对sequencer的transaction获取,对transaction的分解和驱动DUT,seq_item_port.get_next_item(req);//从sequencer中获取transaction,seq_item_port.item_done();//通知sequencer事务已经处理完毕
    在这里插入图片描述
    在这里插入图片描述
    (7)my_monitor.v
  • 验证平台中实现监测DUT的部件是monitor,monitor收集DUT的端口数据,并将其转换为transaction送给scoreboard等
  • 与driver类似,在my_monitor中也需要一个virtual my_if
    在这里插入图片描述
    (8) my_agent.sv
  • agent封装了sequencer、driver、monitor,先需要声明句柄
  • agent需要实例化sequencer、driver、monitor对象并将sequencer与driver连接起来
  • agent有active和passive之分,passive模式只有monitor而没有sequencer和driver
  • 分为build_phase与connect_phase这两个函数,其中build_phase创建sequencer、driver、monitor对象,connect_phase将driver中的seq_item_port与sequencer中的seq_item_export连接,实现之间的transaction通信
    在这里插入图片描述
    (9)my_model.sv
  • reference_model 的输出被scoreboard接受,与DUT的输出比较
    在这里插入图片描述
    (10)my_scoreboard.sv
  • my_scoreboard比较的数据一是来源于reference_model,二是来源于monitor,前者通过exp_port获取,后者通过act_port获取
  • 在main_phase中通过fork建立两个进程,一个进程处理exp_port的数据,当收到数据,放入expect_queue中,另一个进程处理act_port的数据,是DUT的输出数据
  • 当收集到数据后,从expect_queue中弹出之前从exp_port收到的数据,并调用my_transaction的compare函数(前提是exp_port先于act_port收到数据)
    在这里插入图片描述
    在这里插入图片描述
    (11)my_env.sv
  • my_env实例化 i_agent(driver,monitor,sequencer),o_agent(monitor),scoreboard,
    reference_model组件以及三个tlm_analysis_fifo(agt_scb_fifo、agt_mdl_fifo、mdl_scb_fifo)
  • 在connect_phase函数中将analysis_export与blocking_get_expect连接起来

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(12)my_test.sv

  • 例化env
  • 设置整个验证平台的超时退出时间
  • 通过config_db设置验证平台中某些参数的值
  • report_phase(在main_phase之后执行)

在这里插入图片描述
(13)top.sv

  • 例化DUT
  • 例化输入输出的interface
  • 定义时钟频率
  • run_test()
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章