-
Notifications
You must be signed in to change notification settings - Fork 3
/
fnob_db.sv
127 lines (108 loc) · 4.56 KB
/
fnob_db.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//###################################################################################
// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
// The following information is considered proprietary and confidential to Facebook,
// and may not be disclosed to any third party nor be used for any purpose other
// than to full fill service obligations to Facebook
//###################################################################################
`ifndef __FNOB_DB_SV__
`define __FNOB_DB_SV__
class fnob_db#(type T=bit[63:0]) extends uvm_object;
`uvm_object_utils(fnob_db)
//fnob pool that tracks all fnob vars
//key is fnob_name
static fnob#(T) m_fnob_pool[string];
function new(string name ="fnob_db");
super.new(name);
endfunction: new
//used for regular fnob type
static function void set(string fname, FNOB_TYPE ftype, T param[string][$]);
`uvm_info("fnob_db", $psprintf("set::%s, type %s, param: %p", fname, ftype, param), UVM_LOW)
//check if exist in the m_fnob_pool or not
if (check(fname) == 1) begin
`uvm_fatal("fnob_db", $psprintf("set:: %s already in the m_fnob_pool", fname))
end else begin
fnob#(T) fnob_new;
//disable name chk, since key check is already implemented in fnob_db
fnob_new = new(fname, ftype, param, /*no_name_chk*/ 1);
m_fnob_pool[fname] = fnob_new;
end
endfunction: set
//used for fnob multi type
static function void set_multi(string fname, FNOB_TYPE ftype, string param_s);
`uvm_info("fnob_db", $psprintf("set::%s, type %s, param_s: %s", fname, ftype, param_s), UVM_LOW)
//check if exist in the m_fnob_pool or not
if (check(fname) == 1) begin
`uvm_fatal("fnob_db", $psprintf("set:: %s already in the m_fnob_pool", fname))
end else begin
fnob#(T) fnob_new;
//disable name chk, since key check is already implemented in fnob_db
fnob_new =fnob#(T)::new_multi(fname, param_s);
m_fnob_pool[fname] = fnob_new;
end
endfunction: set_multi
static function void update(string fname, FNOB_TYPE ftype, T param[string][$]);
`uvm_info("fnob_db", $psprintf("update::%s, type %s, param: %p", fname, ftype, param), UVM_LOW)
//check if exist in the m_fnob_pool or not
if (check(fname) == 1) begin
m_fnob_pool.delete(fname);
end
//construct and add
m_fnob_pool[fname] = new(fname, ftype, param, /*no_name_chk*/ 1);
endfunction: update
static function fnob#(T) get(string fname);
if (check(fname) == 0) begin
`uvm_fatal("fnob_db", $psprintf("check:: %s does not exist in the m_fnob_pool", fname))
end
`uvm_info("fnob_db", $psprintf("get::%s", fname), UVM_LOW)
return m_fnob_pool[fname];
endfunction: get
static function bit check(string fname);
if(m_fnob_pool.exists(fname)) begin
`uvm_info("fnob_db", $psprintf("check:: %s exists in the m_fnob_pool", fname), UVM_LOW)
return 1;
end else begin
`uvm_info("fnob_db", $psprintf("check:: %s does not exist in the m_fnob_pool", fname), UVM_LOW)
return 0;
end
endfunction: check
//check certain fnob has cli/inline cfg_db ovrd or not
static function bit has_ovrd(string fname);
fnob#(T) fnob_tmp;
fnob_tmp = get(fname);
`uvm_info("fnob_db", $psprintf("has_ovrd:: %s has_ovrd: %0d", fname, fnob_tmp.is_set()), UVM_LOW)
return fnob_tmp.is_set();
endfunction: has_ovrd
static function T gen(string fname);
fnob#(T) fnob_tmp;
T gen_val;
T old_val;
if (check(fname) == 0) begin
`uvm_fatal("fnob_db", $psprintf("check:: %s does not exist in the m_fnob_pool", fname))
end
fnob_tmp = m_fnob_pool[fname];
//old_val = fnob_tmp.m_cur_val;
gen_val = fnob_tmp.gen();
//TODO write to fnob trace log, remove cur_val
//`uvm_info("fnob_db", $psprintf("gen_val_trace:%s, cur_val:0x%h -> new_val:0x%h", fname, old_val, gen_val), UVM_HIGH)
`uvm_info("fnob_db", $psprintf("gen::%s, val:0x%h", fname, gen_val), UVM_LOW)
return gen_val;
endfunction: gen
static function T val(string fname);
fnob#(T) fnob_tmp;
T fval;
if (check(fname) == 0) begin
`uvm_fatal("fnob_db", $psprintf("check:: %s does not exist in the m_fnob_pool", fname))
end
fnob_tmp = m_fnob_pool[fname];
fval = fnob_tmp.val();
//TODO write to fnob trace log, remove cur_val
`uvm_info("fnob_db", $psprintf("gen::%s, fval:0x%h", fname, fval), UVM_LOW)
return fval;
endfunction: val
static function void dump();
foreach(m_fnob_pool[i]) begin
`uvm_info("fnob_db", $psprintf("dump::%s", i), UVM_LOW)
end
endfunction: dump
endclass: fnob_db
`endif