(筆記) 如何以絕對時間指定testbench波形? (SOC) (Verilog)

本文探讨了在Verilog中使用相对时间和绝对时间来指定testbench波形的方法。通过对比两种不同方式,展示了如何利用initial块和绝对时间戳来精确控制信号的变化,适用于那些已经清楚绝对时间波形需求的设计场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Abstract
一般指定testbench波形,用的是相對時間,若想用絕對時間呢?

Introduction
一般指定testbench波形,用的是相對時間,如下所是:(此範例原為(筆記) 如何設計邊緣檢測電路? (SOC) (Verilog)的testbench)

1  /*  
2  (C) OOMusou 2008 http://oomusou.cnblogs.com
3 
4  Filename    : posedge_detection_tb.v
5  Compiler    : ModelSim-Altera 6.1g
6  Description : testbench of posedge_detection.v
7  Release     : 07/09/2008 1.0
8  */
9 
10  `timescale 1ns / 10ps
11  module posedge_detection_tb;
12 
13  reg  clk;
14  reg  rst_n;
15  reg  i_data_in;
16  wire o_rising_edge;
17 
18  posedge_detection u0 (
19    .clk(clk),
20    .rst_n(rst_n),
21    .i_data_in(i_data_in),
22    .o_rising_edge(o_rising_edge)
23  );
24 
25  parameter clkper =   100 ;
26  initial begin
27    clk =   1 ' b0;
28  end
29 
30  always begin
31    #(clkper /   2 ) clk =   ~ clk;
32  end
33 
34  initial begin
35    rst_n =   1 ' b1;
36    i_data_in =   1 ' b0;
37   
38    # 75 ;
39    i_data_in =   1 ' b1;
40   
41    # 100 ;
42    i_data_in =   1 ' b0;
43   
44    # 125 ;
45    i_data_in =   1 ' b1;
46   
47    # 75 ;
48    i_data_in =   1 ' b0;
49   
50    # 175 ;
51    i_data_in =   1 ' b1;
52   
53    # 25 ;
54    i_data_in =   1 ' b0;
55  end
56 
57  endmodule


34行到55行

initial begin
  rst_n
=   1 ' b1;
  i_data_in =   1 ' b0;
 
  #
75 ;
  i_data_in
=   1 ' b1;
 
  #
100 ;
  i_data_in
=   1 ' b0;
 
  #
125 ;
  i_data_in
=   1 ' b1;
 
  #
75 ;
  i_data_in
=   1 ' b0;
 
  #
175 ;
  i_data_in
=   1 ' b1;
 
  #
25 ;
  i_data_in
=   1 ' b0;
end


這種方式的優點是都在一個initial block,但有時候你可能已經很清楚絕對時間該產生什麼波形,為了這種寫法你必須去算相對時間。

使用絕對時間指定波形

1  /*  
2  (C) OOMusou 2008 http://oomusou.cnblogs.com
3 
4  Filename    : posedge_detection_tb2.v
5  Compiler    : ModelSim-Altera 6.1g
6  Description : testbench of posedge_detection.v
7  Release     : 07/09/2008 1.0
8  */
9 
10  `timescale 1ns / 10ps
11  module posedge_detection_tb2;
12 
13  reg  clk;
14  reg  rst_n;
15  reg  i_data_in;
16  wire o_rising_edge;
17 
18  posedge_detection u0 (
19    .clk(clk),
20    .rst_n(rst_n),
21    .i_data_in(i_data_in),
22    .o_rising_edge(o_rising_edge)
23  );
24 
25  parameter clkper =   100 ;
26  initial begin
27    clk =   1 ' b0;
28  end
29 
30  always begin
31    #(clkper /   2 ) clk =   ~ clk;
32  end
33 
34  initial begin
35    rst_n =   1 ' b1;
36    i_data_in =   1 ' b0;
37  end
38   
39  initial # 75 i_data_in =   1 ' b1;
40  initial # 175 i_data_in =   1 ' b0;
41  initial # 300 i_data_in =   1 ' b1;
42  initial # 375 i_data_in =   1 ' b0;
43  initial # 550 i_data_in =   1 ' b1;
44  initial # 575 i_data_in =   1 ' b0;
45   
46  endmodule


39到45行

initial # 75 i_data_in =   1 ' b1;
initial # 175 i_data_in =   1 ' b0;
initial # 300 i_data_in =   1 ' b1;
initial # 375 i_data_in =   1 ' b0;
initial # 550 i_data_in =   1 ' b1;
initial # 575 i_data_in =   1 ' b0;


乍看之下,會覺得這種方是蠻笨的,他靠的是每個initial都是在#0執行的特色,所以能使用絕對時間。請參考(筆記) initial的幾個特色 (SOC) (Verilog)

See Also
(筆記) 如何設計邊緣檢測電路? (SOC) (Verilog)
(筆記) initial的幾個特色 (SOC) (Verilog)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值