So Verilator is the answer! Except..
- It's a two-state simulator, so some reset bugs are not found.
- Your Verilog-style testbench will not work.
- No encrypted IP support.
On the other hand:
- Verilator is fast. This is a big deal for fuzzing tests.
- The linting is awesome- it's good enough that you don't have to run the synthesis tool.
- gtkwave works well with it (you must use the FST format "--trace-fst", not VCD), then you get enums and structures. Counterintuitively, structures show up as modules not signals, but you get used to it.
You can also get free ModelSim as part of Lattice (or Questa as part of Altera) if you don't need the Xilinx IP.