Parameterized class - environment and agents

So, I have my agents classes which are parameterized. The parameter values would be different in different instances and reflect the DUT configuration.
For example, the bus width.

I have been able to take care of this in agents/monitors all the way up to env class.
So, essentially, the parameters start at the top and propagate all the way till monitors etc.

Beyond env class, I am a bit stuck. If I make the test class parameterized, how can I pass the parameter when test is instanced.
The user normally does not instantiate a test class and is done automatically done by the UVM/simulator.

Or is it sufficient if I fix the value of the parameters when I instantiate the environment class in the test class?

I would like to know what has been the experience.

In reply to verif_learner:

The most reliable way to do this is have your DUT and Testbench read parameters from a common package. You are not going to be able to change the bus width of your DUT with a run-time option.

But if you do have parameters just for your testbench, you can instantiate the test class from the top module and call run_test() with no argument, and do not provide a +UVM_TESTNAME switch.

You can also create unparameterized wrapper classes around your parameterized test class:

class test10 extends my_test#(10);
`uvm_component_utils(test10)
function new (string name, uvm_component parent);
  super.new(name,parent);
endfunction
endclass
class test25 extends my_test#(25);
`uvm_component_utils(test25)
function new (string name, uvm_component parent);
  super.new(name,parent);
endfunction
endclass

Now you will be able to choose between +UVM_TESTNAME=test10 and +UVM_TESTNAME=test25.

In reply to dave_59:

In reply to verif_learner:
The most reliable way to do this is have your DUT and Testbench read parameters from a common package. You are not going to be able to change the bus width of your DUT with a run-time option.
But if you do have parameters just for your testbench, you can instantiate the test class from the top module and call run_test() with no argument, and do not provide a +UVM_TESTNAME switch.
You can also create unparameterized wrapper classes around your parameterized test class:

class test10 extends my_test#(10);
`uvm_component_utils(test10)
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction
endclass
class test25 extends my_test#(25);
`uvm_component_utils(test25)
function new (string name, uvm_component parent);
super.new(name,parent);
endfunction
endclass

Now you will be able to choose between +UVM_TESTNAME=test10 and +UVM_TESTNAME=test25.

Thanks. I think I will probably create multiple test base class per DUT configuration.
So, the parameterization will stop at the test class.
This is similar to what you have indicated about wrapping the test class.

It is probably easier this way.