An associative array of events is legal, but you are correct that it takes an assignment to an array element to construct it. Both an event trigger → and event control @ are just references.
Unfortunately, there is no such thing as a built-in event constructor, so you have to make your own.
module event_associative_array;
// String-indexed
event e_str[string];
function automatic event new_event();
event e;
return e;
endfunction
initial begin
e_str["a"]=new_event();
forever begin
@(e_str["a"]);
$display("Triggered");
end
end
// Stimulus
initial begin
#10;
->e_str["a"];
#10 $finish;
end
endmodule
Note that uvm_event_pool accomplishes the same thing.