日常记录(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
posted @ 2022-03-07 22:23  大浪淘沙、  阅读(296)  评论(0)    收藏  举报