pullup、pulldown的用法:
pullup或pulldown只對對當前無驅動的線wire才會有作用,若有驅動應該按照驅動信號來決定!
當線wire為z時,pullup或pulldonw才起作用!
也就是‘Z’可以變成‘1’或‘0’,而不是‘0’能變‘1’(‘1’變‘0’),否則就跟你設計想法不一樣了。
以下的例子進一步說明了這個問題:
`timescale 1ns/1ps
module test();
reg a;
reg d;
wire b;
wire c;
wire e;
reg clk;
always #10 clk = ~clk;
initial begin
clk =1'b0;
d = 1'bx;
#100;
a = 1'b1;
#100;
a = 1'b0;
#100;
d = 1'bz;
#100;
$finish;
end
pulldown(b);
pulldown(c);
pulldown(e);
assign b = a;
assign e = d;
always@(posedge clk) begin
$display("@%0t a = %b b = %b c= %b d = %b e = %b ",$realtime,a,b,c,d,e);
end
endmodule
結果如下所示:
@10000 a = x b = x c= 0 d = x e = x
@30000 a = x b = x c= 0 d = x e = x
@50000 a = x b = x c= 0 d = x e = x
@70000 a = x b = x c= 0 d = x e = x
@90000 a = x b = x c= 0 d = x e = x //pulldown(b);pulldown(c);pulldown(e);
@110000 a = 1 b = 1 c= 0 d = x e = x //#100 a=1'b1;assign b=a;assign e=d
@130000 a = 1 b = 1 c= 0 d = x e = x
@150000 a = 1 b = 1 c= 0 d = x e = x
@170000 a = 1 b = 1 c= 0 d = x e = x
@190000 a = 1 b = 1 c= 0 d = x e = x
@210000 a = 0 b = 0 c= 0 d = x e = x //#100 a=1'b0;assign a=b;assign e=d
@230000 a = 0 b = 0 c= 0 d = x e = x
@250000 a = 0 b = 0 c= 0 d = x e = x
@270000 a = 0 b = 0 c= 0 d = x e = x
@290000 a = 0 b = 0 c= 0 d = x e = x
@310000 a = 0 b = 0 c= 0 d = z e = 0 //#100 d=1'bz;assign a=b;assign e=d
@330000 a = 0 b = 0 c= 0 d = z e = 0
@350000 a = 0 b = 0 c= 0 d = z e = 0
@370000 a = 0 b = 0 c= 0 d = z e = 0
@390000 a = 0 b = 0 c= 0 d = z e = 0
reg a沒有驅動,所以為x;#100后,a被賦值為1;#100后,a被賦值為0;
wire b一直被a驅動,b和a的值一樣,雖然有assign b=a, 但是a為開始為x,所以a和b一致;
wire c無驅動,但是有pulldown(c),所以c為0;
reg d剛開始被賦值為x,后來被賦值為z;
wire e一直被reg d驅動,剛開始d為x,所以e也為x,后來d被賦值為z,因為pulldown(e),所以e為1。