The nice thing with using an emulation system versus a raw FPGA board for learning is the same as debugging software with a source code debugger versus only having access to the disassembly.
In my experience, great hardware designers automagically write Verilog but think schematics.
A classic:
always @(posedge clk) begin
q1 <= d;
q2 <= q1;
end
Do you visualize the back-to-back flip-flops, and immediately double-check that the code uses non-blocking assignments? If so, you're fine. If the code used blocking assignments, you'd have a major bug.And finally, most senior designers still get puzzled by one of my favorite quizzes:
what is the functional difference between those pieces of code, that both represent a flip-flop with async set/reset, one expressed in Verilog and one expressed in VHDL:
always @(posedge clk or negedge rst or posedge set) begin
if(!rst) q <= 0;
else if(set) q <= 1;
else q <= d;
end
process begin
if(not rst) q <= 0;
else if(set) q <= 1;
else if(clk'posedge) q <= d;
end process;