The Verilog system tasks I actually use: $display vs $strobe vs $monitor, format specifiers, $finish, file I/O, $readmemh, waveform dumping, $random and $clog2.
Browsing: HDL design
Verilog tasks vs functions explained with examples: return values, timing controls, synthesis, how arguments are passed, and static vs automatic.
How to define Verilog modules, declare ports, instantiate modules with named connections and parameters, build a hierarchy, and use generate for repeated instances.