verilog驱动强度解析

rules:

1. verilog-ieee-2001 (6-7章)里边有驱动的详细解释,此处就理解和应用做些探讨

2. rtl内的线网都有默认的强度,一般是(strong1, strong0),连续赋值语句可以让不同强度的信号互相赋值

3. 阻塞赋值和非阻塞赋值也能让不同强度的信号互相驱动

4. 通过module的port列表传递的信号不改变强度(例子中led.in1到led的input x, ouput y)

 

example:

`timescale 1ns/1ns
module led( a, clk , b, c, e, y);
input a, clk;
output b;
output c;
output e;
output y;
wire y;
reg e;
reg b;
wire (pull1,pull0) d = a;
wire (strong1, strong0) c = d;

always @( d)
begin
e = d;
end
always@(posedge clk)
begin
b <=d;
end

in in1(.x(d), .y(y));
endmodule

module in(x,y);
input x;
output y;
wire (weak1,weak0) z =!x;
wire (pull1, pull0) y = z;
endmodule

module tb();
reg clk = 0;
reg a = 0;
wire b ;
wire c ;
wire e;
wire y;
initial begin
clk = 0;
repeat(400) clk = #5ns !clk;
end
initial begin
repeat(100) a = #50ns !a;
end

led led1(.a(a), .clk(clk),.b(b), .c(c), .e(e));

initial begin
$display("tb.a(%v), tb.b(%v),tb.c(%v) ", tb.a, tb.b, tb.c);
$monitor("tb.a(%v), tb.b(%v),tb.c(%v)", tb.a, tb.b, tb.c);
$monitor("tb.e(%v)", tb.e);
$monitor("tb.y(%v)", tb.y);

end
initial begin
$display("led.a(%v), led.b(%v), led.c(%v),led.d(%v), led.e(%v),led.y(%v) led.in1.y(%v),led.in1.x(%v) ", led1.a,
  led1.b,led1.c,led.d,led.e,led.y,led.in1.y,led.in1.x);
$monitor("led.a(%v), led.b(%v), led.c(%v),led.d(%v), led.e(%v),led.y(%v) led.in1.y(%v),led.in1.x(%v)", led1.a, led1.b,led1.c,led.d,led.e,led.y,led.in1.y,led.in1.x);
end
initial begin
     $fsdbDumpfile("ceb.fsdb"); 
     $fsdbDumpvars(0,tb.led1);
     $fsdbDumpvars(1,tb);
     $fsdbDumpvars(0,tb);
     $fsdbDumpvars(2,tb );
end
endmodule

result:

tb.a(St0), tb.b(StX),tb.c(St0)
led.a(St0), led.b(StX), led.c(St0),led.d(Pu0), led.e(StX),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
Novas FSDB Dumper for VCS70, Release 6.1v1 (Linux) 01/02/2006
Copyright (C) 1996 - 2006 by Novas Software, Inc.
*Novas* Create FSDB file 'ceb.fsdb'
*Novas* Start dumping the scope(tb.led1), layer(0).
*Novas* End of dumping.
*Novas* Start dumping the scope(tb), layer(1).
*Novas* End of dumping.
*Novas* Start dumping the scope(tb), layer(0).
*Novas* End of dumping.
*Novas* Start dumping the scope(tb), layer(2).
*Novas* End of dumping.
led.a(St0), led.b(StX), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St0), led.b(St0), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St1), led.b(St0), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St1), led.b(St1), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St0), led.b(St1), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St0), led.b(St0), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St1), led.b(St0), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St1), led.b(St1), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St0), led.b(St1), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St0), led.b(St0), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St1), led.b(St0), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St1), led.b(St1), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St0), led.b(St1), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St0), led.b(St0), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St1), led.b(St0), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St1), led.b(St1), led.c(St1),led.d(Pu1), led.e(St1),led.y(Pu0) led.in1.y(Pu0),led.in1.x(Pu1)
led.a(St0), led.b(St1), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)
led.a(St0), led.b(St0), led.c(St0),led.d(Pu0), led.e(St0),led.y(Pu1) led.in1.y(Pu1),led.in1.x(Pu0)

你可能感兴趣的:(verilog驱动强度解析)