Ваш код не работает по другой причине:
Блок Always не чувствителен к изменениям сигнала, пока все действия не завершены.
Таким образом, после того, как ваши часы переключились, блок Always ожидает нового события синхронизации, которое не ожидается.
Чтобы сгенерировать часы, вы должны использовать что-то вроде:
initial
begin
clk = 1'b0;
forever
#(CLK_PERIOD/2) clk = ~clk;
end