I may have completely mis-understood Hendrik's question -
I'm likely not able to answer what I now perceive the question. Let me
restate it just for clarities sake and Hendrik can say yes or no.
He asking about the use of NetAssign/NetAssignNB within icarus and the
followup was a question whether blocking/non-blocking might be their use?
Hendrik - does that capture the question correctly?
Steve
Steven Wilson wrote:
I'll take this - Steve isn't around for the moment.
This is one of those very basic confusions of verilog -
Two examples - one of each:
reg a, b,c ;
// Assume that we start at before the clock with a = 1, b = 0, c = 0.
always @ ( posedge clk) // Blocking
begin
b = a;
c = b;
end
always @(posedge clk) // Non-blocking
begin
b <= a;
c <= b;
end
So what is the difference - after the rising clock edge occurs -
Blocking: a = 1, b = 1, c = 1.
Non-blocking a = 1, b = 1, c = 0.
Why?
Well - blocking means wait till the current step is completed before
moving to the next statement. Non-blocking means perform all
statements in parallel.
Applying these definitions to the examples we find that in the
blocking code. First the value of a is assigned to b, then the value
of b is assigned to c. Thus the value of a propagates to both of the
other variables.
In the non-blocking case, the value of a is ONLY assigned to the first
statement, while the current value of b is assigned to c SIMULTANEOUSLY.
As a coding convention - a way to keep out of trouble is to use
Blocking ONLY for combinational logic (think muxes..) while you only
use non-blocking for describing registered logic. So anywhere you
have a "posedge/negedge" in the always statement - no blocking code.
Hope this helps.
Steve
Hendrik Greving wrote:
Hendrik Greving wrote:
Hi,
I'm Hendrik, new to this group.. Currently, I'm working with Icarus
and modifying it according my purpose. I've got a short question,
could anybody tell me, what's the difference between above?
Regards,
Hendrik
blocking/non-blocking?
Regards,
Hendrik Greving