I am somewhat new to Verilog. I know that in a Clock Process we should use non blocking assignments, and in a Non Clock processes, we use blocking assignments.
I have c
By only changing to code to blocking assignments it may synthesize to latches and/or create logical equivalency check mismatches depending on the tools handle.
This is how it looks through the scheduler:
With blocking:
*_int signals are assigned*_met signals are assigned*_int keeps the non-updated values of *_metWith non-blocking:
*_int signals are assigned*_met signals are assigned*_met is detected causes a loop back the the Active region of the scheduler*_int signals*_int signals*_int has the same values as *_metThe correct, logical equivalent, and CPU friendly way would be to revers the assignment order (assign *_met before *_int):
always@(*)
begin
  iowrb_met = iowr_bar;
  iordb_met = iord_bar;
  iowrb_int = iowrb_met;
  iordb_int = iordb_met;
end
*_int signals are assigned*_met signals are assigned*_int has the same values as *_metOR use *_bar as the assigning value (i.e. if a==b and b==c, then a==b and a==c):
always@(*)
begin
  iowrb_int = iowr_bar;
  iordb_int = iord_bar;
  iowrb_met = iowr_bar;
  iordb_met = iord_bar;
end
*_int and *_met signals are assigned*_int has the same values as *_met