outputdirection specifier in a modport declaration means. See, for example, comments in Mantis 2114.
Simulators are consistent with each other that the specifier has little meaning, that writing across a modport-type port is no different than writing across an interface-type port, namely, by reference.
In my opinion, this interpretation is contrary to intuition and to the very first paragraph of the LRM section on modports
To restrict interface access within a module, there are modport lists with directions declared within the interface. The keyword modport indicates that the directions are declared as if inside the module.
My intuition says a modport is just a way to declare a nested interface, implicitly instantiated by the enclosing interface instance.
For example, suppose interface
modport mp(input x, output y, import f);
then it’s as if it had instantiated and declared
interface mp(input … x, output … y);
function … f(…) = IFC.f(…); endfunction
where the … abbreviates replicated signatures.
ifc.mp is connected to a down-design, that’s exactly what’s connected — the nested interface instance — and references to the
y in it are references to those ports
y. For example, if
x is a variable input port, then you can’t assign to it, and so on.
When a down-design port is declared
interface.mp, that just means that references across the port must go to the nested instance.
GEN.mp is a generated modport, then connecting
GEN.mp or the down-design imposing
IFC.GEN.mp works out naturally, too.