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 *_met
With 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 *_met
The 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 *_met
OR 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