OpenCores
URL https://opencores.org/ocsvn/uart2bus_testbench/uart2bus_testbench/trunk

Subversion Repositories uart2bus_testbench

[/] [uart2bus_testbench/] [trunk/] [tb/] [agent/] [driver/] [uart_driver.svh] - Blame information for rev 14

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 HanySalah
//-------------------------------------------------------------------------------------------------
2 2 HanySalah
//
3 3 HanySalah
//                                     UART2BUS VERIFICATION
4 2 HanySalah
//
5 3 HanySalah
//-------------------------------------------------------------------------------------------------
6 2 HanySalah
// CREATOR    : HANY SALAH
7
// PROJECT    : UART2BUS UVM TEST BENCH
8
// UNIT       : DRIVER
9 3 HanySalah
//-------------------------------------------------------------------------------------------------
10
// TITLE      : UART DRIVER
11
// DESCRIPTION: THIS DRIVER IS RESPONSIBLE FOR SETTING BFMS CONFIGURATIONS. ALSO DRIVING STIMULUS
12
//              TO THE BFMS AND SENDING TRANSACTIONS TO SCOREBOARD.
13
//-------------------------------------------------------------------------------------------------
14 2 HanySalah
// LOG DETAILS
15
//-------------
16
// VERSION      NAME        DATE        DESCRIPTION
17
//    1       HANY SALAH    02012016    FILE CREATION
18 3 HanySalah
//    2       HANY SALAH    07012016    ADD INITIALIZE BFM METHOD
19
//    3       HANY SALAH    17022016    IMPROVE BLOCK DESCRIPTION AND ADD COMMENTS
20
//-------------------------------------------------------------------------------------------------
21
// ALL COPYRIGHTS ARE RESERVED FOR THE PRODUCER ONLY .THIS FILE IS PRODUCED FOR OPENCORES MEMBERS
22
// ONLY AND IT IS PROHIBTED TO USE THIS MATERIAL WITHOUT THE CREATOR'S PERMISSION
23
//-------------------------------------------------------------------------------------------------
24 2 HanySalah
 
25
class uart_driver extends uvm_driver #(uart_transaction);
26
 
27 3 HanySalah
  // Two Transaction Instances that are used to bring and clone the stimulus
28 2 HanySalah
  uart_transaction      trans,_trans;
29
 
30
  // Instance from Global UART Configuration
31
  uart_config           _config;
32
 
33
  // UART Interafce instance
34
  virtual uart_interface  uart_inf;
35
 
36
  // RF Interface instance
37
  virtual rf_interface rf_inf;
38
 
39
  // Arbiter Interface Instance
40
  virtual uart_arbiter  arb_inf;
41
 
42 3 HanySalah
  // Analysis Port to both scoreboard and driver
43 2 HanySalah
  uvm_analysis_port #(uart_transaction)   drv_scbd_cov;
44
 
45
  `uvm_component_utils(uart_driver)
46
 
47
  function new (string name , uvm_component parent);
48
    super.new(name,parent);
49
  endfunction: new
50
 
51 3 HanySalah
  // UVM Build Phase Declaration that includes locating instances and get interfaces handler from
52
  // the configuration database
53 2 HanySalah
  extern function void build_phase (uvm_phase phase);
54
 
55 3 HanySalah
  // Both BFMs configurations setting and BFMs assignment are carried out through this UVM phase.
56 2 HanySalah
  extern function void end_of_elaboration_phase (uvm_phase phase);
57
 
58
  extern task run_phase (uvm_phase phase);
59
 
60
  // Actual drive data routine
61 3 HanySalah
  extern task drive_data ();
62 2 HanySalah
 
63
  // initialize bfms
64
  extern function void initialize_bfms (act_edge  _edge,
65
                                        start_bit _bit,
66 3 HanySalah
                                        int enable,
67 2 HanySalah
                                        int num_stop_bits,
68
                                        int num_of_bits,
69
                                        data_mode _datamode,
70
                                        parity_mode _paritymode,
71
                                        time _resp);
72
endclass:uart_driver
73
 
74
function void uart_driver::build_phase (uvm_phase phase);
75
  super.build_phase(phase);
76
 
77
  trans   = uart_transaction::type_id::create("trans");
78
  _trans  = uart_transaction::type_id::create("_trans");
79
 
80
  _config = uart_config::type_id::create("_config");
81
 
82
  drv_scbd_cov = new("drv_scbd_cov",this);
83
 
84
endfunction:build_phase
85
 
86
function void uart_driver::end_of_elaboration_phase (uvm_phase phase);
87
 
88
  if(!uvm_config_db#(uart_config)::get(this, "", "UART_CONFIGURATION", _config))
89
    `uvm_fatal("NOCONFIGURATION",{"configuration instance must be set for: ",get_full_name(),"._config"});
90
 
91
  if(!uvm_config_db#(virtual uart_interface)::get(this, "", "uart_inf", _config.uart_inf))
92
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".uart_inf"});
93
    uart_inf=_config.uart_inf;
94
 
95
  if(!uvm_config_db#(virtual rf_interface)::get(this, "", "rf_inf", _config.rf_inf))
96
      `uvm_fatal("NOVIF",{"virtual interface must be set for: ",get_full_name(),".rf_inf"});
97
    rf_inf=_config.rf_inf;
98
 
99
  if(!uvm_config_db#(virtual uart_arbiter)::get(this,"","arb_inf",_config.arb_inf))
100
      `uvm_fatal("NOVIF",{"virtual interface must be set for:",get_full_name(),".arb_inf"})
101
    arb_inf=_config.arb_inf;
102 3 HanySalah
  initialize_bfms(_config._edge,
103
              _config._start,
104
              _config.use_false_data,
105
              _config.num_stop_bits,
106
              _config.num_of_bits,
107
              _config._datamode,
108
              _config._paritymode,
109
              _config.response_time);
110
 
111 2 HanySalah
endfunction:end_of_elaboration_phase
112
 
113
function void uart_driver::initialize_bfms (act_edge  _edge,
114
                                            start_bit _bit,
115 3 HanySalah
                                            int  enable,
116 2 HanySalah
                                            int num_stop_bits,
117
                                            int num_of_bits,
118
                                            data_mode _datamode,
119
                                            parity_mode _paritymode,
120
                                            time      _resp);
121 3 HanySalah
  uart_inf.set_configuration (_edge,_bit,num_stop_bits,num_of_bits,_datamode,_paritymode,_resp,enable);
122 8 HanySalah
 
123 2 HanySalah
endfunction:initialize_bfms
124
 
125
task uart_driver::run_phase (uvm_phase phase);
126
 
127
  forever
128
    begin
129
    seq_item_port.get_next_item(_trans);
130
    $cast(trans,_trans.clone());
131
    drv_scbd_cov.write(trans);
132 3 HanySalah
    drive_data();
133 2 HanySalah
    seq_item_port.item_done();
134
    end
135
endtask:run_phase
136
 
137 3 HanySalah
task uart_driver::drive_data();
138 2 HanySalah
  uart_inf.wait_idle_time(trans.time_before*trans.scale);
139
  uart_inf.set_event();
140 3 HanySalah
  if (trans._mode == text || trans._mode == wrong_mode_text)
141 2 HanySalah
    begin
142 3 HanySalah
    case(trans._command)
143 2 HanySalah
      read:
144
        begin
145
        rf_inf.fill_byte (trans.address,
146
                          trans._data[0]);
147 3 HanySalah
        uart_inf.read_text_mode(trans._mode,
148
                                trans.wrong_prefix,
149
                                trans._chartype,
150 2 HanySalah
                                trans._spacetype1,
151
                                trans.space_wrong1,
152
                                trans._eoltype,
153
                                trans.eol_wrong,
154 3 HanySalah
                                trans.address,
155
                                trans.false_data[0],
156
                                trans.false_data_en);
157
 
158 2 HanySalah
        end
159
      write:
160
        begin
161 3 HanySalah
        uart_inf.write_text_mode(trans._mode,
162
                                 trans.wrong_prefix,
163
                                 trans._chartype,
164 2 HanySalah
                                 trans._spacetype1,
165
                                 trans.space_wrong1,
166
                                 trans._spacetype2,
167
                                 trans.space_wrong2,
168
                                 trans._eoltype,
169
                                 trans.eol_wrong,
170
                                 trans.address,
171
                                 trans._data[0]);
172 3 HanySalah
 
173 2 HanySalah
        end
174
      nop:
175
        begin
176 14 HanySalah
        `uvm_fatal("TB ISSUE","NOP command value shouldn't be valued in text mode")
177 2 HanySalah
        end
178
      default:
179
        begin
180 14 HanySalah
        `uvm_fatal("TB ISSUE", "wrong_mode")
181 2 HanySalah
        end
182
    endcase
183
    end
184 3 HanySalah
  else if (trans._mode==binary || trans._mode==wrong_mode_bin)
185 2 HanySalah
    begin
186 3 HanySalah
    if (trans._command == read || trans._command == invalid_read)
187
      begin
188
      rf_inf.fill_block(trans.address,
189
                        trans._data,
190
                        trans.length_data);
191
      uart_inf.read_binary_mode(trans._mode,
192
                                trans.wrong_prefix,
193
                                trans._command,
194
                                trans._reqack,
195
                                trans._reqinc,
196
                                trans.length_data,
197
                                trans.address,
198
                                trans._data,
199
                                trans.false_data,
200
                                trans.false_data_en);
201
      end
202
    else if (trans._command == write || trans._command == invalid_write)
203
      begin
204
      uart_inf.write_binary_mode(trans._mode,
205
                                 trans.wrong_prefix,
206
                                 trans._command,
207
                                 trans._reqack,
208
                                 trans._reqinc,
209
                                 trans.length_data,
210
                                 trans.address,
211
                                 trans._data);
212
      end
213
    else
214
      begin
215
      uart_inf.nop_command(trans._mode,
216
                           trans.wrong_prefix,
217
                           trans._reqack,
218
                           trans._reqinc);
219
      end
220
 
221 2 HanySalah
    end
222
  uart_inf.wait_idle_time(trans.time_after*trans.scale);
223 14 HanySalah
endtask:drive_data

powered by: WebSVN 2.1.0

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