参考《UVM实战》-张强
自己总结的一些简单笔记
系统架构框图
这是1种测试用例的框图,每一种测试用例,都会生成这么一个架构。
下面是,结构中的组件分别需要做些什么事情。
transaction
- 声明、定义数据包格式,是需要测试的数据包,常用random函数去随机化数据用以测试
- field_automation注册,注册后才可以使用uvm中的print、compare等常用函数
driver
- 与DUT建立连接,使用uvm_config_db#机制
- 向sequencer请求sequence,并在发送完成后,返回一个done给sequencer。
- 将transaction转化成interface数据,进行发送
monitor
- 与DUT建立连接,使用uvm_config_db#机制
- 与model和scoreboard建立通信(TLM机制),实现接收transaction功能用`uvm_blocking_get_port#( my transaction),实现发送transaction功能用 `uvm_analysis_port#(my transaction)
- 将transaction转化成interface数据,进行接收
sequencer
- 调度sequence和driver,确保它们正常进行transaction的产生和发送。
agent
- 实例化driver、monitor、sequencer
- 连接drv和sequencer,drv.seq_item_port.connect(sqr.seq_item_export);
- 在TLM机制中准备好monitor的ap(发送)口,准备好发送数据给scoreboard或者reference model,实现接收transaction功能用`uvm_blocking_get_port#( my transaction),实现发送transaction功能用 `uvm_analysis_port#(my transaction)
- UVM_ACTIVE机制,用来产生i_agt和o_agt这些可以自定义配置的agent
reference model
- 接收i_agt发送过来的transaction,发送transaction给scoreboard,实现接收transaction功能用`uvm_blocking_get_port#( my transaction),实现发送transaction功能用 `uvm_analysis_port#(my transaction)
- 建立与DUT同样功能的模型,让transaction包进入模型进行工作,然后将输出发送给scoreboard
scoreboard
- 在TLM机制中准备好接收monitor和model的数据port,实现接收transaction功能用`uvm_blocking_get_port#( my transaction),实现发送transaction功能用 `uvm_analysis_port#(my transaction)
- 并行接收数据,然后进行compare、report等操作,
environment
- 实例化agent、model、scoreboard
- 创建TLM中所需要用的fifo,在我的框图中是三个
- 连接mdl和scoreboard,中间插入一个fifo,同理连接mdl和i_agt,o_agt和scoreboard。
base_test
- 实例化envrionment
- 打印最终验证结果
sequence(case)
- `uvm_do(transaction),产生随机化数据的数据包transaction
- raise_objection ,drop_objection,uvm的objection机制,用以启动和结束整个平台
- 使用default_sequence机制,实例化seq,连接seq(sequence)和sqr(sequencer)