OpenCores
URL https://opencores.org/ocsvn/avalon-wishbone-bridge/avalon-wishbone-bridge/trunk

Subversion Repositories avalon-wishbone-bridge

[/] [avalon-wishbone-bridge/] [trunk/] [UVM/] [av_master_agent/] [av_driver.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sumanta.ch
import uvm_pkg::*;
2
 
3
class av_driver #(AW =32, DW=128, TW= 2) extends uvm_driver #(av_mm_transaction #(AW, DW, TW));
4
 
5
 
6
virtual avalon_if#(AW, DW, TW) mif;
7
 
8
 
9
semaphore outstanding;
10
 
11
function new(string name, uvm_component parent);
12
        super.new(name,parent);
13
        outstanding=new(1);
14
endfunction
15
 
16
 
17
 
18
function void build_phase(uvm_phase phase);
19
        super.build_phase(phase);
20
endfunction
21
 
22
 
23
task run_phase(uvm_phase phase);
24
        //phase.raise_objection(this);
25
        fork
26
                req_loop();
27
                resp_loop();
28
        join_none
29
        //phase.drop_objection(this);
30
endtask
31
task req_loop();
32
                forever
33
                if (!mif.rst_n) begin
34
                        wait_transaction();
35
                        repeat(5) @(posedge mif.m_cb);
36
                end
37
                else begin
38
                        av_mm_transaction#(AW,DW,TW) tx;
39
                        seq_item_port.get_next_item(tx);
40
                        // to record transaction see webinar questa uvm debug
41
                        //begin_tr(tx,"txd");
42
                        case(tx.dir)
43
                                AVALON_RD: begin
44
                                                @(posedge mif.m_cb)
45
                                                 while(mif.waitrequest!==1'b0) @(posedge mif.m_cb);
46
                                                 wait_transaction();
47
                                                 outstanding.get(1);
48
                                                 read_transaction(tx);
49
                                                 //mif.read_transaction(tx.addr);
50
                                                $display ("RD ADDR=%d, stall_time=%f",tx.addr,tx.stall_time);
51
                                           end
52
                                AVALON_WR: begin
53
                                                @(posedge mif.m_cb)
54
                                                 while(mif.waitrequest!==1'b0) @(posedge mif.m_cb);
55
                                                 write_transaction(tx);
56
                                                 //mif.write_transaction(tx.addr,tx.data);
57
                                                `uvm_info ("","WR  ADDR=%d",tx.addr);
58
                                           end
59
                                AVALON_WAIT: begin
60
                                                @(posedge mif.m_cb)
61
                                                wait_transaction();
62
                                             end
63
                                default:   `uvm_fatal(get_type_name(),  $sformatf("Sequence item request unknown!") )
64
                        endcase
65
                //end
66
                        //end_tr(tx);
67
                        seq_item_port.item_done();
68
                end
69
endtask
70
task resp_loop();
71
                forever
72
                if (!mif.rst_n) begin
73
                        repeat(5) @(posedge mif.m_cb);
74
                end
75
                else begin
76
                        @(posedge mif.m_cb);
77
                        if(mif.readdatavalid ==1'b1) outstanding.put(1);
78
                end
79
 
80
endtask
81
task read_transaction(av_mm_transaction #(32,64,2) seq);
82
        mif.address<=seq.addr;
83
        mif.byteenable<=8'hFF;
84
        mif.chipselect<=1'b1;
85
        mif.read<=1'b1;
86
        mif.write<=1'b0;
87
        //mif.readdata;
88
        mif.writedata<='0;
89
        //mif.waitrequest;
90
        //mif.readdatavalid;
91
        mif.burstcount<='0;
92
        mif.beginbursttransfer<=1'b0;
93
endtask
94
task write_transaction(av_mm_transaction #(32,64,2) seq);
95
        mif.address<=seq.addr;
96
        mif.byteenable<=8'hFF;
97
        mif.chipselect<=1'b1;
98
        mif.read<=1'b0;
99
        mif.write<=1'b1;
100
        //mif.readdata;
101
        mif.writedata<=seq.data;
102
        //mif.waitrequest;
103
        //mif.readdatavalid;
104
        mif.burstcount<='0;
105
        mif.beginbursttransfer<=1'b0;
106
endtask
107
task wait_transaction();
108
        //if(outstanding.try_get(4))
109
        begin
110
        mif.address<='0;
111
        mif.byteenable<=8'h00;
112
        mif.chipselect<=1'b0;
113
        mif.read<=1'b0;
114
        mif.write<=1'b0;
115
        //mif.readdata;
116
        mif.writedata<='0;
117
        //mif.waitrequest;
118
        //mif.readdatavalid;
119
        mif.burstcount<='0;
120
        mif.beginbursttransfer<=1'b0;
121
        end
122
endtask
123
endclass

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.