日常记录(72)-209
seq的消息返回
一般是seq发送给drv,drv可以给seq重新返回一个trans。这个trans可以默认是req类型的rsp,也可以在定义一个rsp的trans
简单发送和接收
- drv通过seq_item_port.put_response,实现rsp的发送。
- seq通过get_response(直接使用),获取rsp。
- get_response是阻塞的,当drv没有返回给seq时候,整个seq被阻塞,无法继续。
- drv返回给seq的trans,需要进行rsp.set_id_info,使得seqr知道要返回给哪个seq。
- rsp还可以通过drv的item_done方法实现返回。
- seqr能够存储返回的trans,但是最大能存储的量为8。
- pre_body是body的执行前
- uvm_declare_p_sequencer,p_sequencer
- wait 语句,实现对多个进程的等待过程
- get_full_name,获取路径(字符串)
seq给test_case发送变量
- seq写了uvm_config_db,使用顶层向下传递,一个值。还会变化的值。
- test_case中,创建了一个线程,使用while,然后内部的uvm_config_db::wait_modified,实现阻塞、数据监控,获取
- uvm_root是类,唯一的实例是uvm_top,是顶层。uvm_test是类,被run_test进行后,实例化出来的实例是uvm_test_top,是这个实例。
将接收过程分离
- 接收过程分离,使得seq不会在被阻塞而不再另外发送,使用pre_do,进行use_response_handler
- 定义response_handler的方法,其中的seq_item是response名称。然后进行$cast转换
数据获取的问题
- uvm_do的宏方式,也可以从req获取返回值,这个返回值来自于drv对req的修改。由于drv对req修改,则rsp的数据可能有影响。
- 如下,在接收端,req的值被rsp覆盖。
module taa ();
import uvm_pkg::*;
class my_trans extends uvm_sequence_item;
`uvm_object_utils(my_trans)
rand int a;
rand int b;
function new(string name="my_trans");
super.new(name);
endfunction: new
endclass: my_trans
class my_seqr extends uvm_sequencer#(my_trans);
`uvm_component_utils(my_seqr)
int a = 5;
function new(string name="my_seqr", uvm_component parent);
super.new(name, parent);
endfunction: new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
endfunction: build_phase
endclass: my_seqr
class my_seq extends uvm_sequence#(my_trans);
`uvm_object_utils(my_seq)
`uvm_declare_p_sequencer(my_seqr)
my_trans tr;
function new(string name="my_seq");
super.new(name);
endfunction: new
task pre_body();
use_response_handler(1);
endtask: pre_body
function void response_handler(uvm_sequence_item response);
$cast(tr, response);
`uvm_info("RESPONSE_HANDLER", $sformatf("response handler get: %d", tr.b), UVM_LOW)
endfunction: response_handler
task body();
int i = 0;
repeat (10) begin
fork
//inner block must be execute step by step.
begin
`uvm_do_with(tr, {a==p_sequencer.a;});
`uvm_info("SEQ_GET_BY_REQ", $sformatf("check value b from drv: %d", tr.b), UVM_LOW)
/* get_response(rsp); */
/* `uvm_info("SEQ_GET_RSP", $sformatf("get rsp value is %d", rsp.b), UVM_LOW) */
end
join_none
uvm_config_db#(int)::set(null, "uvm_test_top", "info_value", i++);
#1;
/* `uvm_do_with(tr, {a==m_sequencer.a;}); */
end
`uvm_info("MY_SEQ", $sformatf("full name: %s", get_full_name()), UVM_LOW)
wait fork;
endtask: body
endclass: my_seq
class my_driver extends uvm_driver#(my_trans);
`uvm_component_utils(my_driver)
function new(string name="my_driver", uvm_component parent);
super.new(name, parent);
endfunction: new
task run_phase(uvm_phase phase);
int i;
forever begin
seq_item_port.get_next_item(req);
`uvm_info("DRV_DATA", $sformatf("getdata: %d, %d", req.a, req.b), UVM_LOW)
rsp = new("rsp");
rsp.set_id_info(req);
// comment for test.
rsp.b = 10 + i++;
req.b = 123;
seq_item_port.put_response(rsp);
`uvm_info("DRIVER_RSP", $sformatf("driver rsp value b is %d", rsp.b), UVM_LOW)
/* seq_item_port.item_done(rsp); */
seq_item_port.item_done();
end
endtask: run_phase
endclass: my_driver
class my_vseqr extends uvm_sequencer#(uvm_sequence_item);
`uvm_component_utils(my_vseqr)
my_seqr seqr1;
function new(string name="my_vseqr", uvm_component parent);
super.new(name, parent);
endfunction: new
endclass: my_vseqr
class my_vseq extends uvm_sequence;
`uvm_object_utils(my_vseq)
`uvm_declare_p_sequencer(my_vseqr)
my_seq seq;
function new(string name="my_vseq");
super.new(name);
endfunction: new
task body();
seq = new("seq");
seq.start(p_sequencer.seqr1);
endtask: body
endclass: my_vseq
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_seqr seqr;
my_seq seq;
my_driver drv;
my_vseq vseq;
my_vseqr vseqr;
function new(string name="my_test", uvm_component parent);
super.new(name, parent);
endfunction: new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
seqr = my_seqr::type_id::create("seqr", this);
drv = my_driver::type_id::create("my_drv", this);
vseqr = my_vseqr::type_id::create("vseqr", this);
vseq = my_vseq::type_id::create("vseq", this);
endfunction: build_phase
function void connect_phase(uvm_phase phase);
drv.seq_item_port.connect(seqr.seq_item_export);
vseqr.seqr1 = seqr;
endfunction: connect_phase
task run_phase(uvm_phase phase);
int info_value;
phase.raise_objection(this);
fork
begin
seq = new("seq");
seq.start(seqr);
`uvm_info("MY_TEST", $sformatf("------------------------------------"), UVM_LOW)
vseq.start(vseqr);
end
while(1) begin
// the first value can be get from this method.
uvm_config_db#(int)::wait_modified(this, "", "info_value");
uvm_config_db#(int)::get(this, "", "info_value", info_value);
`uvm_info("RUN_PHASE_VALUE", $sformatf("info value is %d", info_value), UVM_LOW)
end
join_any
phase.drop_objection(this);
endtask: run_phase
endclass: my_test
initial begin
run_test("my_test");
end
endmodule
输出结果
点击查看代码
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
UVM_INFO taa.sv(152) @ 0: uvm_test_top [RUN_PHASE_VALUE] info value is 0
UVM_INFO taa.sv(75) @ 0: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -78381851
UVM_INFO taa.sv(40) @ 0: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 10
UVM_INFO taa.sv(82) @ 0: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 10
UVM_INFO taa.sv(50) @ 0: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 10
UVM_INFO taa.sv(152) @ 1: uvm_test_top [RUN_PHASE_VALUE] info value is 1
UVM_INFO taa.sv(75) @ 1: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1567809654
UVM_INFO taa.sv(40) @ 1: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 11
UVM_INFO taa.sv(82) @ 1: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 11
UVM_INFO taa.sv(50) @ 1: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 11
UVM_INFO taa.sv(152) @ 2: uvm_test_top [RUN_PHASE_VALUE] info value is 2
UVM_INFO taa.sv(75) @ 2: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -870449368
UVM_INFO taa.sv(40) @ 2: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 12
UVM_INFO taa.sv(82) @ 2: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 12
UVM_INFO taa.sv(50) @ 2: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 12
UVM_INFO taa.sv(152) @ 3: uvm_test_top [RUN_PHASE_VALUE] info value is 3
UVM_INFO taa.sv(75) @ 3: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1194549615
UVM_INFO taa.sv(40) @ 3: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 13
UVM_INFO taa.sv(82) @ 3: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 13
UVM_INFO taa.sv(50) @ 3: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 13
UVM_INFO taa.sv(152) @ 4: uvm_test_top [RUN_PHASE_VALUE] info value is 4
UVM_INFO taa.sv(75) @ 4: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -485146056
UVM_INFO taa.sv(40) @ 4: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 14
UVM_INFO taa.sv(82) @ 4: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 14
UVM_INFO taa.sv(50) @ 4: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 14
UVM_INFO taa.sv(152) @ 5: uvm_test_top [RUN_PHASE_VALUE] info value is 5
UVM_INFO taa.sv(75) @ 5: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -778133797
UVM_INFO taa.sv(40) @ 5: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 15
UVM_INFO taa.sv(82) @ 5: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 15
UVM_INFO taa.sv(50) @ 5: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 15
UVM_INFO taa.sv(152) @ 6: uvm_test_top [RUN_PHASE_VALUE] info value is 6
UVM_INFO taa.sv(75) @ 6: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 466944809
UVM_INFO taa.sv(40) @ 6: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 16
UVM_INFO taa.sv(82) @ 6: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 16
UVM_INFO taa.sv(50) @ 6: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 16
UVM_INFO taa.sv(152) @ 7: uvm_test_top [RUN_PHASE_VALUE] info value is 7
UVM_INFO taa.sv(75) @ 7: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1679537710
UVM_INFO taa.sv(40) @ 7: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 17
UVM_INFO taa.sv(82) @ 7: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 17
UVM_INFO taa.sv(50) @ 7: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 17
UVM_INFO taa.sv(152) @ 8: uvm_test_top [RUN_PHASE_VALUE] info value is 8
UVM_INFO taa.sv(75) @ 8: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -118173612
UVM_INFO taa.sv(40) @ 8: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 18
UVM_INFO taa.sv(82) @ 8: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 18
UVM_INFO taa.sv(50) @ 8: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 18
UVM_INFO taa.sv(152) @ 9: uvm_test_top [RUN_PHASE_VALUE] info value is 9
UVM_INFO taa.sv(75) @ 9: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -326880774
UVM_INFO taa.sv(40) @ 9: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 19
UVM_INFO taa.sv(82) @ 9: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 19
UVM_INFO taa.sv(50) @ 9: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 19
UVM_INFO taa.sv(59) @ 10: uvm_test_top.seqr@@seq [MY_SEQ] full name: uvm_test_top.seqr.seq
UVM_INFO taa.sv(145) @ 10: uvm_test_top [MY_TEST] -----------------
UVM_INFO taa.sv(152) @ 10: uvm_test_top [RUN_PHASE_VALUE] info value is 0
UVM_INFO taa.sv(75) @ 10: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 45043238
UVM_INFO taa.sv(40) @ 10: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 20
UVM_INFO taa.sv(82) @ 10: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 20
UVM_INFO taa.sv(50) @ 10: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 20
UVM_INFO taa.sv(152) @ 11: uvm_test_top [RUN_PHASE_VALUE] info value is 1
UVM_INFO taa.sv(75) @ 11: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1013263232
UVM_INFO taa.sv(40) @ 11: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 21
UVM_INFO taa.sv(82) @ 11: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 21
UVM_INFO taa.sv(50) @ 11: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 21
UVM_INFO taa.sv(152) @ 12: uvm_test_top [RUN_PHASE_VALUE] info value is 2
UVM_INFO taa.sv(75) @ 12: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 1819336339
UVM_INFO taa.sv(40) @ 12: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 22
UVM_INFO taa.sv(82) @ 12: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 22
UVM_INFO taa.sv(50) @ 12: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 22
UVM_INFO taa.sv(152) @ 13: uvm_test_top [RUN_PHASE_VALUE] info value is 3
UVM_INFO taa.sv(75) @ 13: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -874872002
UVM_INFO taa.sv(40) @ 13: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 23
UVM_INFO taa.sv(82) @ 13: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 23
UVM_INFO taa.sv(50) @ 13: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 23
UVM_INFO taa.sv(152) @ 14: uvm_test_top [RUN_PHASE_VALUE] info value is 4
UVM_INFO taa.sv(75) @ 14: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 403913649
UVM_INFO taa.sv(40) @ 14: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 24
UVM_INFO taa.sv(82) @ 14: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 24
UVM_INFO taa.sv(50) @ 14: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 24
UVM_INFO taa.sv(152) @ 15: uvm_test_top [RUN_PHASE_VALUE] info value is 5
UVM_INFO taa.sv(75) @ 15: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1968400630
UVM_INFO taa.sv(40) @ 15: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 25
UVM_INFO taa.sv(82) @ 15: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 25
UVM_INFO taa.sv(50) @ 15: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 25
UVM_INFO taa.sv(152) @ 16: uvm_test_top [RUN_PHASE_VALUE] info value is 6
UVM_INFO taa.sv(75) @ 16: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1693679335
UVM_INFO taa.sv(40) @ 16: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 26
UVM_INFO taa.sv(82) @ 16: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 26
UVM_INFO taa.sv(50) @ 16: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 26
UVM_INFO taa.sv(152) @ 17: uvm_test_top [RUN_PHASE_VALUE] info value is 7
UVM_INFO taa.sv(75) @ 17: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -763372401
UVM_INFO taa.sv(40) @ 17: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 27
UVM_INFO taa.sv(82) @ 17: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 27
UVM_INFO taa.sv(50) @ 17: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 27
UVM_INFO taa.sv(152) @ 18: uvm_test_top [RUN_PHASE_VALUE] info value is 8
UVM_INFO taa.sv(75) @ 18: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1117477085
UVM_INFO taa.sv(40) @ 18: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 28
UVM_INFO taa.sv(82) @ 18: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 28
UVM_INFO taa.sv(50) @ 18: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 28
UVM_INFO taa.sv(152) @ 19: uvm_test_top [RUN_PHASE_VALUE] info value is 9
UVM_INFO taa.sv(75) @ 19: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 1967911515
UVM_INFO taa.sv(40) @ 19: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 29
UVM_INFO taa.sv(82) @ 19: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 29
UVM_INFO taa.sv(50) @ 19: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 29
UVM_INFO taa.sv(59) @ 20: uvm_test_top.seqr@@seq [MY_SEQ] full name: uvm_test_top.seqr.seq
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_objection.svh(1276) @ 20: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_report_catcher.svh(705) @ 20: reporter [UVM/REPORT/CATCHER]
--- UVM Report catcher Summary ---
Number of demoted UVM_FATAL reports : 0
Number of demoted UVM_ERROR reports : 0
Number of demoted UVM_WARNING reports: 0
Number of caught UVM_FATAL reports : 0
Number of caught UVM_ERROR reports : 0
Number of caught UVM_WARNING reports : 0
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_report_server.svh(894) @ 20: reporter [UVM/REPORT/SERVER]
--- UVM Report Summary ---
** Report counts by severity
UVM_INFO : 107
UVM_WARNING : 0
UVM_ERROR : 0
UVM_FATAL : 0
** Report counts by id
[DRIVER_RSP] 20
[DRV_DATA] 20
[MY_SEQ] 2
[MY_TEST] 1
[RESPONSE_HANDLER] 20
[RNTST] 1
[RUN_PHASE_VALUE] 20
[SEQ_GET_BY_REQ] 20
[TEST_DONE] 1
[UVM/RELNOTES] 1
[UVM/REPORT/CATCHER] 1
$finish called from file "/home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_root.svh", line 527.
$finish at simulation time 20
不进行put_response操作
接收数据没有(response_handler),但是req的数据正常了。
点击查看代码
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
UVM_INFO taa.sv(152) @ 0: uvm_test_top [RUN_PHASE_VALUE] info value is 0
UVM_INFO taa.sv(75) @ 0: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -78381851
UVM_INFO taa.sv(82) @ 0: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 10
UVM_INFO taa.sv(50) @ 0: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 1: uvm_test_top [RUN_PHASE_VALUE] info value is 1
UVM_INFO taa.sv(75) @ 1: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1567809654
UVM_INFO taa.sv(82) @ 1: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 11
UVM_INFO taa.sv(50) @ 1: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 2: uvm_test_top [RUN_PHASE_VALUE] info value is 2
UVM_INFO taa.sv(75) @ 2: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -870449368
UVM_INFO taa.sv(82) @ 2: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 12
UVM_INFO taa.sv(50) @ 2: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 3: uvm_test_top [RUN_PHASE_VALUE] info value is 3
UVM_INFO taa.sv(75) @ 3: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1194549615
UVM_INFO taa.sv(82) @ 3: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 13
UVM_INFO taa.sv(50) @ 3: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 4: uvm_test_top [RUN_PHASE_VALUE] info value is 4
UVM_INFO taa.sv(75) @ 4: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -485146056
UVM_INFO taa.sv(82) @ 4: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 14
UVM_INFO taa.sv(50) @ 4: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 5: uvm_test_top [RUN_PHASE_VALUE] info value is 5
UVM_INFO taa.sv(75) @ 5: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -778133797
UVM_INFO taa.sv(82) @ 5: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 15
UVM_INFO taa.sv(50) @ 5: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 6: uvm_test_top [RUN_PHASE_VALUE] info value is 6
UVM_INFO taa.sv(75) @ 6: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 466944809
UVM_INFO taa.sv(82) @ 6: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 16
UVM_INFO taa.sv(50) @ 6: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 7: uvm_test_top [RUN_PHASE_VALUE] info value is 7
UVM_INFO taa.sv(75) @ 7: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1679537710
UVM_INFO taa.sv(82) @ 7: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 17
UVM_INFO taa.sv(50) @ 7: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 8: uvm_test_top [RUN_PHASE_VALUE] info value is 8
UVM_INFO taa.sv(75) @ 8: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -118173612
UVM_INFO taa.sv(82) @ 8: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 18
UVM_INFO taa.sv(50) @ 8: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 9: uvm_test_top [RUN_PHASE_VALUE] info value is 9
UVM_INFO taa.sv(75) @ 9: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -326880774
UVM_INFO taa.sv(82) @ 9: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 19
UVM_INFO taa.sv(50) @ 9: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(59) @ 10: uvm_test_top.seqr@@seq [MY_SEQ] full name: uvm_test_top.seqr.seq
UVM_INFO taa.sv(145) @ 10: uvm_test_top [MY_TEST] -----------------
UVM_INFO taa.sv(152) @ 10: uvm_test_top [RUN_PHASE_VALUE] info value is 0
UVM_INFO taa.sv(75) @ 10: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 45043238
UVM_INFO taa.sv(82) @ 10: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 20
UVM_INFO taa.sv(50) @ 10: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 11: uvm_test_top [RUN_PHASE_VALUE] info value is 1
UVM_INFO taa.sv(75) @ 11: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1013263232
UVM_INFO taa.sv(82) @ 11: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 21
UVM_INFO taa.sv(50) @ 11: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 12: uvm_test_top [RUN_PHASE_VALUE] info value is 2
UVM_INFO taa.sv(75) @ 12: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 1819336339
UVM_INFO taa.sv(82) @ 12: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 22
UVM_INFO taa.sv(50) @ 12: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 13: uvm_test_top [RUN_PHASE_VALUE] info value is 3
UVM_INFO taa.sv(75) @ 13: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -874872002
UVM_INFO taa.sv(82) @ 13: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 23
UVM_INFO taa.sv(50) @ 13: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 14: uvm_test_top [RUN_PHASE_VALUE] info value is 4
UVM_INFO taa.sv(75) @ 14: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 403913649
UVM_INFO taa.sv(82) @ 14: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 24
UVM_INFO taa.sv(50) @ 14: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 15: uvm_test_top [RUN_PHASE_VALUE] info value is 5
UVM_INFO taa.sv(75) @ 15: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1968400630
UVM_INFO taa.sv(82) @ 15: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 25
UVM_INFO taa.sv(50) @ 15: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 16: uvm_test_top [RUN_PHASE_VALUE] info value is 6
UVM_INFO taa.sv(75) @ 16: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1693679335
UVM_INFO taa.sv(82) @ 16: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 26
UVM_INFO taa.sv(50) @ 16: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 17: uvm_test_top [RUN_PHASE_VALUE] info value is 7
UVM_INFO taa.sv(75) @ 17: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -763372401
UVM_INFO taa.sv(82) @ 17: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 27
UVM_INFO taa.sv(50) @ 17: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 18: uvm_test_top [RUN_PHASE_VALUE] info value is 8
UVM_INFO taa.sv(75) @ 18: uvm_test_top.my_drv [DRV_DATA] getdata: 5, -1117477085
UVM_INFO taa.sv(82) @ 18: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 28
UVM_INFO taa.sv(50) @ 18: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(152) @ 19: uvm_test_top [RUN_PHASE_VALUE] info value is 9
UVM_INFO taa.sv(75) @ 19: uvm_test_top.my_drv [DRV_DATA] getdata: 5, 1967911515
UVM_INFO taa.sv(82) @ 19: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value b is 29
UVM_INFO taa.sv(50) @ 19: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO taa.sv(59) @ 20: uvm_test_top.seqr@@seq [MY_SEQ] full name: uvm_test_top.seqr.seq
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_objection.svh(1276) @ 20: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_report_catcher.svh(705) @ 20: reporter [UVM/REPORT/CATCHER]
--- UVM Report catcher Summary ---
Number of demoted UVM_FATAL reports : 0
Number of demoted UVM_ERROR reports : 0
Number of demoted UVM_WARNING reports: 0
Number of caught UVM_FATAL reports : 0
Number of caught UVM_ERROR reports : 0
Number of caught UVM_WARNING reports : 0
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_report_server.svh(894) @ 20: reporter [UVM/REPORT/SERVER]
--- UVM Report Summary ---
** Report counts by severity
UVM_INFO : 87
UVM_WARNING : 0
UVM_ERROR : 0
UVM_FATAL : 0
** Report counts by id
[DRIVER_RSP] 20
[DRV_DATA] 20
[MY_SEQ] 2
[MY_TEST] 1
[RNTST] 1
[RUN_PHASE_VALUE] 20
[SEQ_GET_BY_REQ] 20
[TEST_DONE] 1
[UVM/RELNOTES] 1
[UVM/REPORT/CATCHER] 1
$finish called from file "/home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_root.svh", line 527.
$finish at simulation time 20
定义不同的rsp
修改drv、seq、seqr即可。
module taa ();
import uvm_pkg::*;
class my_trans extends uvm_sequence_item;
`uvm_object_utils(my_trans)
rand int a;
rand int b;
function new(string name="my_trans");
super.new(name);
endfunction: new
endclass: my_trans
class my_trans2 extends uvm_sequence_item;
`uvm_object_utils(my_trans2)
rand int c;
function new(string name="my_trans2");
super.new(name);
endfunction: new
endclass: my_trans2
typedef uvm_sequencer#(my_trans, my_trans2) my_seqr;
class my_seq extends uvm_sequence#(my_trans, my_trans2);
`uvm_object_utils(my_seq)
`uvm_declare_p_sequencer(my_seqr)
my_trans tr;
my_trans2 tr2;
function new(string name="my_seq");
super.new(name);
endfunction: new
task pre_body();
use_response_handler(1);
endtask: pre_body
function void response_handler(uvm_sequence_item response);
$cast(tr2, response);
`uvm_info("RESPONSE_HANDLER", $sformatf("response handler get: %d", tr2.c), UVM_LOW)
endfunction: response_handler
task body();
int i = 0;
repeat (10) begin
fork
begin
`uvm_do(tr);
`uvm_info("SEQ_GET_BY_REQ", $sformatf("check value b from drv: %d", tr.b), UVM_LOW)
end
join_none
uvm_config_db#(int)::set(null, "uvm_test_top", "info_value", i++);
#1;
end
`uvm_info("MY_SEQ", $sformatf("full name: %s", get_full_name()), UVM_LOW)
wait fork;
endtask: body
endclass: my_seq
class my_driver extends uvm_driver#(my_trans, my_trans2);
`uvm_component_utils(my_driver)
function new(string name="my_driver", uvm_component parent);
super.new(name, parent);
endfunction: new
task run_phase(uvm_phase phase);
int i;
forever begin
seq_item_port.get_next_item(req);
`uvm_info("DRV_DATA", $sformatf("getdata: %d, %d", req.a, req.b), UVM_LOW)
rsp = new("rsp");
rsp.set_id_info(req);
// comment for test.
rsp.c = 10 + i++;
req.b = 123;
seq_item_port.put_response(rsp);
seq_item_port.put_response(rsp);
`uvm_info("DRIVER_RSP", $sformatf("driver rsp value c is %d", rsp.c), UVM_LOW)
seq_item_port.item_done(rsp);
/* seq_item_port.item_done(); */
end
endtask: run_phase
endclass: my_driver
class my_test extends uvm_test;
`uvm_component_utils(my_test)
my_seqr seqr;
my_seq seq;
my_driver drv;
function new(string name="my_test", uvm_component parent);
super.new(name, parent);
endfunction: new
function void build_phase(uvm_phase phase);
super.build_phase(phase);
seqr = my_seqr::type_id::create("seqr", this);
drv = my_driver::type_id::create("my_drv", this);
endfunction: build_phase
function void connect_phase(uvm_phase phase);
drv.seq_item_port.connect(seqr.seq_item_export);
endfunction: connect_phase
task run_phase(uvm_phase phase);
int info_value;
phase.raise_objection(this);
seq = new("seq");
seq.start(seqr);
phase.drop_objection(this);
endtask: run_phase
endclass: my_test
initial begin
run_test("my_test");
end
endmodule
输出结果
点击查看代码
UVM_INFO @ 0: reporter [RNTST] Running test my_test...
UVM_INFO tbb.sv(69) @ 0: uvm_test_top.my_drv [DRV_DATA] getdata: -78381851, 786796573
UVM_INFO tbb.sv(38) @ 0: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 10
UVM_INFO tbb.sv(38) @ 0: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 10
UVM_INFO tbb.sv(77) @ 0: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 10
UVM_INFO tbb.sv(38) @ 0: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 10
UVM_INFO tbb.sv(47) @ 0: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 1: uvm_test_top.my_drv [DRV_DATA] getdata: -1567809654, -1846025264
UVM_INFO tbb.sv(38) @ 1: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 11
UVM_INFO tbb.sv(38) @ 1: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 11
UVM_INFO tbb.sv(77) @ 1: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 11
UVM_INFO tbb.sv(38) @ 1: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 11
UVM_INFO tbb.sv(47) @ 1: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 2: uvm_test_top.my_drv [DRV_DATA] getdata: -870449368, 1242958576
UVM_INFO tbb.sv(38) @ 2: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 12
UVM_INFO tbb.sv(38) @ 2: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 12
UVM_INFO tbb.sv(77) @ 2: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 12
UVM_INFO tbb.sv(38) @ 2: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 12
UVM_INFO tbb.sv(47) @ 2: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 3: uvm_test_top.my_drv [DRV_DATA] getdata: -1194549615, 409103587
UVM_INFO tbb.sv(38) @ 3: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 13
UVM_INFO tbb.sv(38) @ 3: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 13
UVM_INFO tbb.sv(77) @ 3: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 13
UVM_INFO tbb.sv(38) @ 3: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 13
UVM_INFO tbb.sv(47) @ 3: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 4: uvm_test_top.my_drv [DRV_DATA] getdata: -485146056, 1062949625
UVM_INFO tbb.sv(38) @ 4: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 14
UVM_INFO tbb.sv(38) @ 4: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 14
UVM_INFO tbb.sv(77) @ 4: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 14
UVM_INFO tbb.sv(38) @ 4: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 14
UVM_INFO tbb.sv(47) @ 4: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 5: uvm_test_top.my_drv [DRV_DATA] getdata: -778133797, -1870235948
UVM_INFO tbb.sv(38) @ 5: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 15
UVM_INFO tbb.sv(38) @ 5: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 15
UVM_INFO tbb.sv(77) @ 5: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 15
UVM_INFO tbb.sv(38) @ 5: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 15
UVM_INFO tbb.sv(47) @ 5: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 6: uvm_test_top.my_drv [DRV_DATA] getdata: 466944809, 1666432231
UVM_INFO tbb.sv(38) @ 6: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 16
UVM_INFO tbb.sv(38) @ 6: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 16
UVM_INFO tbb.sv(77) @ 6: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 16
UVM_INFO tbb.sv(38) @ 6: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 16
UVM_INFO tbb.sv(47) @ 6: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 7: uvm_test_top.my_drv [DRV_DATA] getdata: -1679537710, -669000388
UVM_INFO tbb.sv(38) @ 7: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 17
UVM_INFO tbb.sv(38) @ 7: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 17
UVM_INFO tbb.sv(77) @ 7: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 17
UVM_INFO tbb.sv(38) @ 7: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 17
UVM_INFO tbb.sv(47) @ 7: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 8: uvm_test_top.my_drv [DRV_DATA] getdata: -118173612, 393166877
UVM_INFO tbb.sv(38) @ 8: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 18
UVM_INFO tbb.sv(38) @ 8: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 18
UVM_INFO tbb.sv(77) @ 8: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 18
UVM_INFO tbb.sv(38) @ 8: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 18
UVM_INFO tbb.sv(47) @ 8: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(69) @ 9: uvm_test_top.my_drv [DRV_DATA] getdata: -326880774, 1457553035
UVM_INFO tbb.sv(38) @ 9: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 19
UVM_INFO tbb.sv(38) @ 9: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 19
UVM_INFO tbb.sv(77) @ 9: uvm_test_top.my_drv [DRIVER_RSP] driver rsp value c is 19
UVM_INFO tbb.sv(38) @ 9: uvm_test_top.seqr@@seq [RESPONSE_HANDLER] response handler get: 19
UVM_INFO tbb.sv(47) @ 9: uvm_test_top.seqr@@seq [SEQ_GET_BY_REQ] check value b from drv: 123
UVM_INFO tbb.sv(53) @ 10: uvm_test_top.seqr@@seq [MY_SEQ] full name: uvm_test_top.seqr.seq
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_objection.svh(1276) @ 10: reporter [TEST_DONE] 'run' phase is ready to proceed to the 'extract' phase
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_report_catcher.svh(705) @ 10: reporter [UVM/REPORT/CATCHER]
--- UVM Report catcher Summary ---
Number of demoted UVM_FATAL reports : 0
Number of demoted UVM_ERROR reports : 0
Number of demoted UVM_WARNING reports: 0
Number of caught UVM_FATAL reports : 0
Number of caught UVM_ERROR reports : 0
Number of caught UVM_WARNING reports : 0
UVM_INFO /home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_report_server.svh(894) @ 10: reporter [UVM/REPORT/SERVER]
--- UVM Report Summary ---
** Report counts by severity
UVM_INFO : 65
UVM_WARNING : 0
UVM_ERROR : 0
UVM_FATAL : 0
** Report counts by id
[DRIVER_RSP] 10
[DRV_DATA] 10
[MY_SEQ] 1
[RESPONSE_HANDLER] 30
[RNTST] 1
[SEQ_GET_BY_REQ] 10
[TEST_DONE] 1
[UVM/RELNOTES] 1
[UVM/REPORT/CATCHER] 1
$finish called from file "/home/synopsys/vcs-mx/O-2018.09-1/etc/uvm-1.2/base/uvm_root.svh", line 527.
$finish at simulation time 10
Le vent se lève! . . . il faut tenter de vivre!
Le vent se lève! . . . il faut tenter de vivre!

浙公网安备 33010602011771号