5.1.2 Signal Strengths
Solution to Resolve Signal Contention
-
In Verilog, signal strength determines how strongly a signal drives a logic value (0, 1, or Z) on a net. It plays a key role in resolving logic values when multiple drivers are connected to a net (like tri or wire).
​
-
When multiple drivers assign values to a net (e.g., wire), the resulting logic value is determined by the strongest driver.
​
-
It's especially important in bus systems, tri-state buffers, and bidirectional lines.
Strength Available in Verilog HDL​
Strength Level Type Degree
supply0, supply1
​​
strong0, strong1
​​​
pull0,
pull1
​​​
large0,
large1
​​​
weak0,
weak1
​​​
medium0, medium1
​​​
small0, small1
​​​
highz0, highz1
DRIVING
​
​​
DRIVING
​​
​
DRIVING
​​
​
STORAGE/CAPACITIVE
​​
​
DRIVING
​​
​
STORAGE
​​
​
STORAGE
​​
​
HIGH IMPEDENCE
Strongest
​
​
​
​
​
​
​
​
​
​
​
​
​​
​
​
​
​
​
​
​
Weakest
NOTE:
<strength>0 -> Refer to 0 value
​
<strength>1 -> Refer to 1 value
Example - 1

supply0
strong1
Verilog
module vlsimentor;
wire in1, in2;
wire y;
buf (supply0) b1(y, in1);
buf (strong1) b1(y, in1);
//assign (supply0) y = in1;
//assign (strong1) y = in2;
initial begin
$monitor($time, " | in1 = %b, in2 = %b, y = %b", in1, in2, y);
in1 = 0; in2 = 0;
#5 in1 = 0; in2 = 1;
#5 in1 = 1; in2 = 0;
#5 in1 = 1; in2 = 1;
end
endmodule
Output

0 | in1 = 0, in2 = 0, y = 0

15 | in1 = 1, in2 = 1, y = 1

5 | in1 = 0, in2 = 1, y = 0

10 | in1 = 1, in2 = 0, y = x
Example - 2

Verilog
module vlsimentor;
wire in1, in2;
wire y;
buf (supply0) b1(y, in1);
buf (supply1) b1(y, in1);
//assign (supply0) y = in1;
//assign (supply1) y = in2;
initial begin
$monitor($time, " | in1 = %b, in2 = %b, y = %b", in1, in2, y);
in1 = 0; in2 = 0;
#5 in1 = 0; in2 = 1;
#5 in1 = 1; in2 = 0;
#5 in1 = 1; in2 = 1;
end
endmodule
Output

5 | in1 = 0, in2 = 1, y = x

10 | in1 = 1, in2 = 0, y = x
Example - 3

Verilog
module vlsimentor;
wire in1, in2;
wire y;
buf (strong1, weak0) b1(y, in1);
buf (supply0, pull1) b1(y, in1);
//assign (strong1, weak0) y = in1;
//assign (supply0, pull1) y = in2;
initial begin
$monitor($time, " | in1 = %b, in2 = %b, y = %b", in1, in2, y);
in1 = 0; in2 = 0;
#5 in1 = 0; in2 = 1;
#5 in1 = 1; in2 = 0;
#5 in1 = 1; in2 = 1;
end
endmodule
Output

5 | in1 = 0, in2 = 1, y = 1

10 | in1 = 1, in2 = 0, y = 0
