The intended behavior for your scenario can be implemented in the following way.
Assume you have
1) 3 Agents which are running at 3 speeds: 10,100,1000 like Agent_10,Agent_100,Agent_1000
This 3 Agents will be using put Port to drive the data.
2) 1 Interface agent which will drive data from one of the above 3 Agents.
This Agent Will be using the get Port to get the data to drive on Interface.
3) Auto-Neg Agent which will decide the Speed (CuAgent_Config.op_speed_e)
Have one Top Agent (Agent_top) which instantiates the above 5 Agents.
The logic in TopAgent should be like below.
1) Have 3 seperate put implementations for Different Speed Agents.
task Copper_Media_Agent::put_10(AnalogData analog_data);
wait(Cu10BaseT_Data_Available == 0);
this.analog_data_10Mbps = analog_data;
Cu10BaseT_Data_Available = 1'b1;
endtask
task Copper_Media_Agent::put_100(AnalogData analog_data);
wait(Cu100BaseT_Data_Available == 0);
this.analog_data_100Mbps = analog_data;
Cu100BaseT_Data_Available = 1'b1;
endtask
task Copper_Media_Agent::put_1000(AnalogData analog_data);
wait(Cu1000BaseT_Data_Available == 0);
this.analog_data_1000Mbps = analog_data;
Cu1000BaseT_Data_Available = 1'b1;
endtask
These Put Implementations will wait for de-assertion of corresponding speed data available signal and once it is de-asserted assign data to local signal and assert the data_available signal.
2) The get implementation for Interface Agent will look like below.
task Copper_Media_Agent::get(output AnalogData analog_data);
/**
* @param analog_data Analog Data Get port..
*/
case(CuAgent_Config.op_speed_e)
SPEED10: begin
wait(Cu10BaseT_Data_Available == 1'b1);
analog_data = new analog_data_10Mbps;
Cu10BaseT_Data_Available = 1'b0;
end
SPEED100: begin
wait(Cu100BaseT_Data_Available == 1'b1);
analog_data = new analog_data_100Mbps;
Cu100BaseT_Data_Available = 1'b0;
end
SPEED1000: begin
wait(Cu1000BaseT_Data_Available == 1'b1);
analog_data = new analog_data_1000Mbps;
Cu1000BaseT_Data_Available = 1'b0;
end
default: begin
//!< Logic to be Added Later...
end
endcase // case(CuAgent_Config.op_speed_e)
endtask
In get Implementation it will fetch the data from corresponding Agent based on the Speed Configuration Parameter ((CuAgent_Config.op_speed_e) chosen by Auto-Negotiation Component.
With the above approach we can switch from one speed to another speed smoothly.
Hope this helps.