@@ -45,77 +45,152 @@ package adi_axi_agent_pkg;
4545 import m_axi_sequencer_pkg :: * ;
4646 import s_axi_sequencer_pkg :: * ;
4747 import adi_axi_monitor_pkg :: * ;
48+ import vip_agent_typedef_pkg :: * ;
4849
50+ class adi_axi_agent_base extends adi_agent ;
4951
50- class adi_axi_master_agent # (int `AXI_VIP_PARAM_ORDER (master)) extends adi_agent ;
52+ m_axi_sequencer_base master_sequencer;
53+ s_axi_sequencer_base slave_sequencer;
54+ adi_axi_monitor_base monitor;
55+
56+ local agent_typedef agent_type;
57+
58+ function new (
59+ input string name,
60+ input agent_typedef agent_type,
61+ input adi_environment parent = null );
62+
63+ super .new (name, parent);
64+
65+ this .agent_type = agent_type;
66+ endfunction : new
67+
68+ virtual task start_master ();
69+ if (agent_type == SLAVE ) begin
70+ this .fatal ($sformatf (" Agent is in slave mode!" ));
71+ end
72+ endtask : start_master
73+
74+ virtual task start_slave ();
75+ if (agent_type == MASTER ) begin
76+ this .fatal ($sformatf (" Agent is in master mode!" ));
77+ end
78+ endtask : start_slave
79+
80+ virtual task start_monitor ();
81+ if (agent_type != PASSTHROUGH ) begin
82+ this .fatal ($sformatf (" Agent is not in passthrough mode!" ));
83+ end
84+ endtask : start_monitor
85+
86+ virtual task stop_master ();
87+ if (agent_type == SLAVE ) begin
88+ this .fatal ($sformatf (" Agent is in slave mode!" ));
89+ end
90+ endtask : stop_master
91+
92+ virtual task stop_slave ();
93+ if (agent_type == MASTER ) begin
94+ this .fatal ($sformatf (" Agent is in master mode!" ));
95+ end
96+ endtask : stop_slave
97+
98+ virtual task stop_monitor ();
99+ if (agent_type != PASSTHROUGH ) begin
100+ this .fatal ($sformatf (" Agent is not in passthrough mode!" ));
101+ end
102+ endtask : stop_monitor
103+
104+ endclass : adi_axi_agent_base
105+
106+
107+ class adi_axi_master_agent # (int `AXI_VIP_PARAM_ORDER (master)) extends adi_axi_agent_base ;
51108
52109 axi_mst_agent # (`AXI_VIP_PARAM_ORDER (master)) agent;
53- m_axi_sequencer # (`AXI_VIP_PARAM_ORDER (master)) sequencer ;
110+ m_axi_sequencer # (`AXI_VIP_PARAM_ORDER (master)) master_sequencer ;
54111 adi_axi_monitor # (`AXI_VIP_PARAM_ORDER (master)) monitor;
55112
56113 function new (
57114 input string name,
58115 virtual interface axi_vip_if # (`AXI_VIP_IF_PARAMS (master)) master_vip_if,
59116 input adi_environment parent = null );
60117
61- super .new (name, parent);
118+ super .new (name, MASTER , parent);
62119
63120 this .agent = new (" Agent" , master_vip_if);
64- this .sequencer = new (" Sequencer" , this .agent.wr_driver, this .agent.rd_driver, this );
121+ this .master_sequencer = new (" Master Sequencer" , this .agent.wr_driver, this .agent.rd_driver, this );
65122 this .monitor = new (" Monitor TX" , this .agent.monitor, this );
66123 endfunction : new
67124
68- task start ();
69- this .agent.start_master ();
70- endtask : start
125+ function void pre_link_agent (adi_axi_agent_base adi_axi_agent);
126+ this .name = adi_axi_agent.name;
127+ this .parent = adi_axi_agent.parent;
128+ endfunction : pre_link_agent
71129
72- task run ();
73- this .monitor.run ();
74- endtask : run
130+ function void post_link_agent (adi_axi_agent_base adi_axi_agent);
131+ adi_axi_agent.master_sequencer = this .master_sequencer;
132+ adi_axi_agent.monitor = this .monitor;
133+ endfunction : post_link_agent
75134
76- task stop ();
77- this .monitor.stop ();
135+ virtual task start_master ();
136+ super .start_master ();
137+ this .agent.start_master ();
138+ this .monitor.start ();
139+ endtask : start_master
140+
141+ virtual task stop_master ();
142+ super .stop_master ();
78143 this .agent.stop_master ();
79- endtask : stop
144+ this .monitor.stop ();
145+ endtask : stop_master
80146
81147 endclass : adi_axi_master_agent
82148
83149
84- class adi_axi_slave_mem_agent # (int `AXI_VIP_PARAM_ORDER (slave)) extends adi_agent ;
150+ class adi_axi_slave_mem_agent # (int `AXI_VIP_PARAM_ORDER (slave)) extends adi_axi_agent_base ;
85151
86152 axi_slv_mem_agent # (`AXI_VIP_PARAM_ORDER (slave)) agent;
87- s_axi_sequencer # (`AXI_VIP_PARAM_ORDER (slave)) sequencer ;
153+ s_axi_sequencer # (`AXI_VIP_PARAM_ORDER (slave)) slave_sequencer ;
88154 adi_axi_monitor # (`AXI_VIP_PARAM_ORDER (slave)) monitor;
89155
90156 function new (
91157 input string name,
92158 virtual interface axi_vip_if # (`AXI_VIP_IF_PARAMS (slave)) slave_vip_if,
93159 input adi_environment parent = null );
94160
95- super .new (name, parent);
161+ super .new (name, SLAVE , parent);
96162
97163 this .agent = new (" Agent" , slave_vip_if);
98- this .sequencer = new (" Sequencer" , this .agent.mem_model, this );
164+ this .slave_sequencer = new (" Slave Sequencer" , this .agent.mem_model, this );
99165 this .monitor = new (" Monitor TX" , this .agent.monitor, this );
100166 endfunction : new
101167
102- task start ();
103- this .agent.start_slave ();
104- endtask : start
168+ function void pre_link_agent (adi_axi_agent_base adi_axi_agent);
169+ this .name = adi_axi_agent.name;
170+ this .parent = adi_axi_agent.parent;
171+ endfunction : pre_link_agent
105172
106- task run ();
107- this .monitor.run ();
108- endtask : run
173+ function void post_link_agent (adi_axi_agent_base adi_axi_agent);
174+ adi_axi_agent.slave_sequencer = this .slave_sequencer;
175+ adi_axi_agent.monitor = this .monitor;
176+ endfunction : post_link_agent
109177
110- task stop ();
111- this .monitor.stop ();
178+ virtual task start_slave ();
179+ super .start_slave ();
180+ this .agent.start_slave ();
181+ this .monitor.start ();
182+ endtask : start_slave
183+
184+ virtual task stop_slave ();
185+ super .stop_slave ();
112186 this .agent.stop_slave ();
113- endtask : stop
187+ this .monitor.stop ();
188+ endtask : stop_slave
114189
115190 endclass : adi_axi_slave_mem_agent
116191
117192
118- class adi_axi_passthrough_mem_agent # (int `AXI_VIP_PARAM_ORDER (passthrough)) extends adi_agent ;
193+ class adi_axi_passthrough_mem_agent # (int `AXI_VIP_PARAM_ORDER (passthrough)) extends adi_axi_agent_base ;
119194
120195 axi_passthrough_mem_agent # (`AXI_VIP_PARAM_ORDER (passthrough)) agent;
121196 m_axi_sequencer # (`AXI_VIP_PARAM_ORDER (passthrough)) master_sequencer;
@@ -127,27 +202,60 @@ package adi_axi_agent_pkg;
127202 virtual interface axi_vip_if # (`AXI_VIP_IF_PARAMS (passthrough)) passthrough_vip_if,
128203 input adi_environment parent = null );
129204
130- super .new (name, parent);
205+ super .new (name, PASSTHROUGH , parent);
131206
132207 this .agent = new (" Agent" , passthrough_vip_if);
133- this .master_sequencer = new (" Slave Sequencer" , this .agent.mst_wr_driver, this .agent.mst_rd_driver, this );
208+ this .master_sequencer = new (" Master Sequencer" , this .agent.mst_wr_driver, this .agent.mst_rd_driver, this );
134209 this .slave_sequencer = new (" Slave Sequencer" , this .agent.mem_model, this );
135210 this .monitor = new (" Monitor TX" , this .agent.monitor, this );
136211 endfunction : new
137212
138- task start ();
139- this .warning ($sformatf (" Start must called manually in the test program or environment" ));
140- endtask : start
213+ function void pre_link_agent (adi_axi_agent_base adi_axi_agent);
214+ this .name = adi_axi_agent.name;
215+ this .parent = adi_axi_agent.parent;
216+ endfunction : pre_link_agent
141217
142- task run ();
143- this .monitor.run ();
144- endtask : run
218+ function void post_link_agent (adi_axi_agent_base adi_axi_agent);
219+ adi_axi_agent.master_sequencer = this .master_sequencer;
220+ adi_axi_agent.slave_sequencer = this .slave_sequencer;
221+ adi_axi_agent.monitor = this .monitor;
222+ endfunction : post_link_agent
145223
146- task stop ();
224+ virtual task start_master ();
225+ super .start_master ();
226+ this .agent.start_master ();
227+ this .monitor.start ();
228+ endtask : start_master
229+
230+ virtual task start_slave ();
231+ super .start_slave ();
232+ this .agent.start_slave ();
233+ this .monitor.start ();
234+ endtask : start_slave
235+
236+ virtual task start_monitor ();
237+ super .start_monitor ();
238+ this .agent.start_monitor ();
239+ this .monitor.start ();
240+ endtask : start_monitor
241+
242+ virtual task stop_master ();
243+ super .stop_master ();
244+ this .agent.stop_master ();
147245 this .monitor.stop ();
246+ endtask : stop_master
247+
248+ virtual task stop_slave ();
249+ super .stop_slave ();
148250 this .agent.stop_slave ();
149- this .agent.stop_master ();
150- endtask : stop
251+ this .monitor.stop ();
252+ endtask : stop_slave
253+
254+ virtual task stop_monitor ();
255+ super .stop_monitor ();
256+ this .agent.stop_monitor ();
257+ this .monitor.stop ();
258+ endtask : stop_monitor
151259
152260 endclass : adi_axi_passthrough_mem_agent
153261
0 commit comments