UVM验证平台的总体架构如上图所示。上一节我们搭建了最简单的Driver和DUT,并加入了factory机制、objection机制和virtual interface中的config_db机制。这一节将加入其它部件。
1、transaction部件
transaction部件可以理解为网络传输中的“包”。这个类中我们需要定义这个“包”所含的内容。
rand bit[47:0] dmac;
rand bit[47:0] smac;
rand bit[15:0] ether_type;
rand byte pload[];
rand bit[31:0] crc;
如这个“包”中,定义了5个随机变量。rand修饰符是代表,每次实例化这个类——使用函数randomize()这个类时,这些变量都会随机赋予一个随机的值。这个“包”包含的pload[]是动态数组,需要的randomize()的时候规定其大小范围。同时在transaction类中,可以定义多个数据处理函数,如copy、compare、print等基本函数;也可以用field_automation机制
`uvm_object_utils_begin(my_transaction)
`uvm_field_int(dmac, UVM_ALL_ON)
`uvm_field_int(smac, UVM_ALL_ON)
`uvm_field_int(ether_type, UVM_ALL_ON)
`uvm_field_array_int(pload, UVM_ALL_ON)
`uvm_field_int(crc, UVM_ALL_ON)
`uvm_object_utils_end
使用该机制后,“包”的数据顺序是根据使用宏`uvm_field注册的顺序来排列的。如当前的排列顺序是dmac到smac这样顺着下来。而且使用上述宏注册后,可以直接调用copy、compare、print等函数,而不需要自己定义。
另外一方面,因为driver和monitor中的代码也可以使用下面语句来读入队列。
tr.pack_bytes(data_q)
2、env部件
env部件是整个uvm验证平台中最顶层部件,可以把env理解为一个“容器”。所有的其他部件都是包含在env里面的。这时候可以理解uvm为这个平台的树根(父节点,parent)。根据前面使用factory机制,run_test创建的就是树根,而且名字是固定的,为uvm_test_top。所以在top_tb模块中,使用factory机制实例化就需要改成:
initial begin
run_test("my_env");
end
在uvm的树形结构中,build_phase的执行遵照从树根到树叶的顺序,即先执行my_env的build_phase,再执行my_driver的build_phase。当把整棵树的build_phase都执行完后,再执行其他phase,如connect_phase。
3、monitor部件
验证平台中实现检测DUT行为的部件是monitor。driver负责把transaction级别的数据转变成DUT的端口级别,并驱动给DUT,monitor的行为与之相对,用于收集DUT的端口数据,并将其转换成transaction交给后续部件。
monitor的功能与driver相似,driver是把transaction的数据放入data_q队列里,然后寄存到vif_data通过虚拟接口传输;而monitor先接收接口的数据,再放入队列中data_q处理数据。
同样地,需要在top_tb模块中,使用config_db机制把monitor的端口与接口连接在一起:
initial begin
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.i_agt.drv", "vif", input_if);
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.i_agt.mon", "vif", input_if);
uvm_config_db#(virtual my_if)::set(null, "uvm_test_top.o_agt.mon", "vif", output_if);
end
4、reference model部件
reference model主要用于完成和DUT相同的功能。reference model的输出被scoreboard接收,用于和DUT的输出相比较。其中会用到port端口,FIFO等其他功能。
5、scoreboard部件
my_scoreboard要比较的数据一世来源于reference model,而是来源于o_agt的monitor。前者通过exp_port获取,后者通过act_port获取。