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

Subversion Repositories uart2bus_testbench

[/] [uart2bus_testbench/] [trunk/] [tb/] [analysis/] [uart_scoreboard.svh] - Blame information for rev 10

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       : ANALYSIS
9 3 HanySalah
//-------------------------------------------------------------------------------------------------
10
// TITLE      : UART SCOREBOARD
11
// DESCRIPTION: SCOREBOARD IS RESPONSIBLE FOR DOING COMPARISONS BETWEEN THE TRANSACTION CREATED IN
12
//                                                      THE SEQUENCE AND THE TRANSACTION CAPTURED BY THE MONITOR.
13
//-------------------------------------------------------------------------------------------------
14 2 HanySalah
// LOG DETAILS
15
//-------------
16
// VERSION      NAME        DATE        DESCRIPTION
17
//    1       HANY SALAH    22012016    FILE CREATION
18 3 HanySalah
//              2                       HANY SALAH              28012016                ADD BINARY COMMAND CHECKING
19
//              3                               HANY SALAH              18022016                IMPROVE BLOCK DESCRIPTION & 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
 
25 2 HanySalah
class uart_scoreboard extends uvm_scoreboard;
26
 
27 3 HanySalah
        // TLM fifo which buffers the trasaction captured by the monitor.
28 2 HanySalah
        uvm_tlm_analysis_fifo #(uart_transaction)       mon_fifo;
29
 
30 3 HanySalah
        // TLM port connected to the monitor.
31 2 HanySalah
        uvm_analysis_export #(uart_transaction) scbd_mon;
32
 
33 3 HanySalah
        // TLM fifo which buffers the trasaction drived from the driver.
34 2 HanySalah
        uvm_tlm_analysis_fifo #(uart_transaction) drv_fifo;
35
 
36 3 HanySalah
        // TLM port connected to the driver.
37 2 HanySalah
        uvm_analysis_export #(uart_transaction) scbd_drv;
38
 
39
        uart_transaction                        frm_drv,frm_drv_tmp;
40
 
41
        uart_transaction                        frm_mon,frm_mon_tmp;
42
 
43 9 HanySalah
        int                                     match=0;
44
 
45
        `uvm_component_utils_begin(uart_scoreboard)
46
           `uvm_field_int(match,UVM_ALL_ON)
47
        `uvm_component_utils_end
48 2 HanySalah
 
49
        function new (string name , uvm_component parent);
50
                super.new(name,parent);
51
        endfunction:new
52
 
53
        extern function void build_phase (uvm_phase phase);
54
 
55
        extern function void connect_phase (uvm_phase phase);
56
 
57
        extern task run_phase (uvm_phase phase);
58 3 HanySalah
 
59 10 HanySalah
        extern function void extract_phase (uvm_phase phase);
60
 
61 3 HanySalah
        extern function void ack_checker ();
62 2 HanySalah
endclass:uart_scoreboard
63
 
64
 
65
function void uart_scoreboard::build_phase (uvm_phase phase);
66
        super.build_phase(phase);
67
 
68
        frm_drv                 = uart_transaction::type_id::create("frm_drv");
69
        frm_drv_tmp     = uart_transaction::type_id::create("frm_drv_tmp");
70
 
71
        frm_mon                 = uart_transaction::type_id::create("frm_mon");
72
        frm_mon_tmp = uart_transaction::type_id::create("frm_mon_tmp");
73
 
74
        mon_fifo = new ("mon_fifo",this);
75
        scbd_mon = new ("scbd_mon",this);
76
 
77
        drv_fifo = new ("drv_fifo",this);
78
        scbd_drv = new ("scbd_drv",this);
79
 
80
endfunction:build_phase
81
 
82
function void uart_scoreboard::connect_phase (uvm_phase phase);
83
        scbd_mon.connect(mon_fifo.analysis_export);
84
        scbd_drv.connect(drv_fifo.analysis_export);
85
endfunction:connect_phase
86
 
87 3 HanySalah
// Run Phase
88 2 HanySalah
task uart_scoreboard::run_phase (uvm_phase phase);
89 3 HanySalah
 
90 2 HanySalah
        forever
91
                begin
92
                drv_fifo.get(frm_drv_tmp);
93
                $cast(frm_drv,frm_drv_tmp.clone());
94
                mon_fifo.get(frm_mon_tmp);
95
                $cast(frm_mon,frm_mon_tmp.clone());
96
                if (frm_drv._mode != frm_mon._mode)
97
                        begin
98 3 HanySalah
                        `uvm_fatal("Testbench Bug",$sformatf("Modes aren't similiar .. It was requested to use %p mode and the applied mode is %p \n ",frm_drv._mode,frm_mon._mode))
99 2 HanySalah
                        end
100 3 HanySalah
 
101
                else if (frm_drv._mode inside {wrong_mode_text,wrong_mode_bin})
102
                        begin
103
                        if (frm_drv._data == frm_mon._data)
104
                                begin
105
                                `uvm_error("Failed UART Undefined Command","DUT responds to undefined Prefix \n")
106
                                end
107
                        else
108
                                begin
109 9 HanySalah
                                `uvm_info("Passed UART Undefined Command","DUT doesn't respond to undefined Prefix \n",UVM_HIGH)
110
                                   match++;
111 3 HanySalah
                                end
112
                        end
113
 
114
                else if (frm_drv._command inside {invalid_read,invalid_write})
115
                        begin
116
                        if (frm_drv._data == frm_mon._data)
117
                                begin
118
                                `uvm_error("Failed UART Invalid Command","DUT responds to invalid binary command \n")
119
                                end
120
                        else
121
                                begin
122 9 HanySalah
                                `uvm_info("Passed UART Invalid Command","DUT doesn't respond to invalid binary command \n",UVM_HIGH)
123
                                   match++;
124 3 HanySalah
                                end
125
                        end
126
 
127 2 HanySalah
                else
128
                        begin
129
                        case (frm_drv._mode)
130
                                text:
131
                                        begin
132
                                        if(frm_drv._command != frm_mon._command)
133
                                                begin
134 3 HanySalah
                                                `uvm_fatal("Testbench Bug",$sformatf("Commands aren't identical .. It was requested to drive %p command and the applied command is %p \n",frm_drv._command,frm_mon._command))
135 2 HanySalah
                                                end
136
                                        else
137
                                                begin
138
                                                case(frm_drv._command)
139
                                                        read:
140
                                                                begin
141 3 HanySalah
                                                                if (frm_drv._spacetype1 == wrong_space || frm_drv._eoltype == wrong_eol)
142 2 HanySalah
                                                                        begin
143 3 HanySalah
                                                                        if (frm_drv._data == frm_mon._data)
144
                                                                                begin
145
                                                                                `uvm_error("Failed Wrong Read Command","DUT responds to stimulus with wrong white space or eol charachters \n")
146
                                                                                end
147
                                                                        else
148
                                                                                begin
149 9 HanySalah
                                                                                `uvm_info("Passed Wrong Read Command",$sformatf("Dut was requested to read the data of the address %h with wrong white spaces or eol character \n",frm_mon.address),UVM_HIGH)
150
                                                                                   match++;
151 3 HanySalah
                                                                                end
152 2 HanySalah
                                                                        end
153 3 HanySalah
                                                                else if (frm_drv._data != frm_mon._data)
154
                                                                        begin
155
                                                                        `uvm_error("Failed Read Text Mode",$sformatf("Data fields aren't identical ,, It was requested to drive %b and dut reply with the data %b \n",frm_drv._data,frm_mon._data))
156
                                                                        end
157 2 HanySalah
                                                                else if((frm_drv._data                          == frm_mon._data)       &&
158
                                                                                                (frm_drv.address                        == frm_mon.address) &&
159
                                                                                                (frm_drv._spacetype1    == frm_mon._spacetype1) &&
160
                                                                                                (frm_drv._eoltype                       == frm_mon._eoltype) &&
161
                                                                                                (frm_drv._chartype              == frm_mon._chartype))
162
                                                                        begin
163 3 HanySalah
                                                                        `uvm_info("Passed Read Text Mode",$sformatf("Data fields are identical ,, It was requested to read from the address %h and dut reply with the data %p using white space = %p and %p prefix character and %p as end of line character \n",frm_drv.address,frm_mon._data,frm_drv._spacetype1,frm_drv._chartype,
164 9 HanySalah
                                                                                frm_drv._eoltype),UVM_HIGH)
165
                                                                           match++;
166 2 HanySalah
                                                                        end
167
                                                                else
168
                                                                        begin
169 3 HanySalah
                                                                        `uvm_error("Failed Read Text Mode",$sformatf("It is Requested to request to read data = %p address of %h with character prefix : %p using white space = %p and end of line character %p .. and found data = %p and address=%h with character prefix : %p using white space = %p and end of line character %p \n",frm_drv._data,frm_drv.address,frm_drv._chartype,frm_drv._spacetype1,frm_drv._eoltype,
170 2 HanySalah
                                                                         frm_mon._data,frm_mon.address,frm_mon._chartype,frm_mon._spacetype1,frm_mon._eoltype))
171
                                                                        end
172
                                                                end
173
                                                        write:
174
                                                                begin
175 3 HanySalah
                                                                if (frm_drv._spacetype1 == wrong_space || frm_drv._spacetype2 == wrong_space || frm_drv._eoltype == wrong_eol)
176 2 HanySalah
                                                                        begin
177 3 HanySalah
                                                                        if (frm_drv._data == frm_mon._data)
178
                                                                                begin
179
                                                                                `uvm_error("Failed Wrong Write Command","DUT responds to stimulus with wrong white space or eol charachters \n")
180
                                                                                end
181
                                                                        else
182
                                                                                begin
183 9 HanySalah
                                                                                `uvm_info("Passed Wrong Write Command",$sformatf("Dut was requested to read the data of the address %h with wrong white spaces or eol character \n",frm_mon.address),UVM_HIGH)
184
                                                                                   match++;
185 3 HanySalah
                                                                                end
186 2 HanySalah
                                                                        end
187 3 HanySalah
                                                                else if (frm_drv._data != frm_mon._data)
188
                                                                        begin
189
                                                                        `uvm_error("Failed Write Text Mode",$sformatf("Data fields aren't identical ,, It was requested to drive %p and dut register the data %p \n",frm_drv._data,frm_mon._data))
190
                                                                        end
191 2 HanySalah
                                                                else if((frm_drv._data                          == frm_mon._data)       &&
192
                                                                                                (frm_drv.address                        == frm_mon.address) &&
193
                                                                                                (frm_drv._spacetype1    == frm_mon._spacetype1) &&
194 3 HanySalah
                                                                                                (frm_drv._spacetype2    == frm_mon._spacetype2) &&
195 2 HanySalah
                                                                                                (frm_drv._eoltype                       == frm_mon._eoltype) &&
196
                                                                                                (frm_drv._chartype              == frm_mon._chartype))
197
                                                                        begin
198 3 HanySalah
                                                                        `uvm_info("Passed write Text Mode",$sformatf("Data fields are identical ,, It was requested to write to the address %h and dut register the data %p using white space = %p and %p prefix character and %p as end of line character \n",frm_drv.address,frm_mon._data,frm_drv._spacetype1,frm_drv._chartype,
199 9 HanySalah
                                                                                frm_drv._eoltype),UVM_HIGH)
200
                                                                           match++;
201 2 HanySalah
                                                                        end
202
                                                                else
203
                                                                        begin
204 3 HanySalah
                                                                        `uvm_error("Failed write Text Mode",$sformatf("It is Requested to request to write data = %p address of %h with character prefix : %p using white space = %p and end of line character %p .. and found data = %p and address=%h with character prefix : %p using white space = %p and end of line character %p \n",frm_drv._data,frm_drv.address,frm_drv._chartype,frm_drv._spacetype1,frm_drv._eoltype,
205 2 HanySalah
                                                                         frm_mon._data,frm_mon.address,frm_mon._chartype,frm_mon._spacetype1,frm_mon._eoltype))
206
                                                                        end
207
                                                                end
208
                                                        default:
209
                                                                begin
210 3 HanySalah
                                                                `uvm_fatal("Testbench Bug",$sformatf("It isn't allowablt to drive %p command through text mode \n",frm_drv._command))
211 2 HanySalah
                                                                end
212
                                                endcase
213
                                                end
214
                                        end
215
                                binary:
216
                                        begin
217 3 HanySalah
                                        if (frm_drv._command != frm_mon._command)
218
                                                begin
219
                                                `uvm_fatal("Testbench Bug",$sformatf("Commands aren't identical .. It was requested to drive %p command and the applied command is %p \n",frm_drv._command,frm_mon._command))
220
                                                end
221
                                        else if (frm_drv._command inside {read,write})
222
                                                begin
223
                                                if (frm_drv._reqack             == frm_mon._reqack &&
224
                                                                frm_drv._reqinc                 == frm_mon._reqinc &&
225
                                                                frm_drv.address                 == frm_mon.address &&
226
                                                                frm_drv.length_data == frm_mon.length_data &&
227
                                                                frm_drv._data                   == frm_mon._data)
228
                                                        begin
229 9 HanySalah
                                                        `uvm_info($sformatf("Passed Binary %p Command",frm_drv._command),$sformatf("Dut is requested to %p command to start address=%h with data = %p and data length = %0d \n",frm_drv._command,frm_drv.address,frm_drv._data,frm_drv.length_data),UVM_HIGH)
230
                                                           match++;
231 3 HanySalah
                                                        ack_checker();
232
                                                        end
233
                                                else
234
                                                        begin
235
                                                        `uvm_error("Failed Binary Command",$sformatf("Dut is requested to %p command to start address=%h with data = %p, data length = %0d and dut reply with start address = %h and data = %p, length_data=%0d \n",
236
                                                                frm_drv._command,frm_drv.address,frm_drv._data,frm_drv.length_data,
237
                                                                                                                                 frm_mon.address,frm_mon._data,frm_mon.length_data))
238
                                                        end
239
                                                end
240
                                        else if (frm_drv._command == nop)
241
                                                begin
242 9 HanySalah
                                                `uvm_info("NOP Command",$sformatf("Dut is requested to %p command \n",frm_drv._command),UVM_HIGH)
243
                                                   match++;
244 3 HanySalah
                                                ack_checker();
245
                                                end
246 2 HanySalah
                                        end
247
                                default:
248
                                        begin
249 3 HanySalah
                                        `uvm_fatal("Testbench Bug",$sformatf("Mode is undefined = %p \n",frm_drv._mode))
250 2 HanySalah
                                        end
251
                        endcase
252 9 HanySalah
                        end // else: !if(frm_drv._command inside {invalid_read,invalid_write})
253 10 HanySalah
 
254 2 HanySalah
                end
255 3 HanySalah
endtask:run_phase
256
 
257 10 HanySalah
function void uart_scoreboard::extract_phase(uvm_phase phase);
258
   uvm_resource_db#(int)::write_by_name("Reporting","matched_packets",match);
259
endfunction // extract_phase
260
 
261
 
262 3 HanySalah
function void uart_scoreboard::ack_checker();
263
 
264
        if(frm_drv._reqack == yes && frm_mon.acknowledge != 8'h5A)
265
                begin
266
                `uvm_error("Undefined Acknowledge",$sformatf("DUT reply with %h  as acknowledge character \n",frm_mon.acknowledge))
267
                end
268
        else if (frm_drv._reqack == no && frm_mon.acknowledge != 8'h00)
269
                begin
270
                `uvm_error("Wrong Response","Command doesn't request Acknowledge and DUT forward acknowledge character \n")
271
                end
272
        else
273
                begin
274 9 HanySalah
                `uvm_info("Accepted Acknowledge","Acknowledge is the defined as standard \n",UVM_HIGH)
275 3 HanySalah
                end
276
 
277 9 HanySalah
endfunction:ack_checker

powered by: WebSVN 2.1.0

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