每次我都搞不清楚testbench要怎麼設定開頭,整理成一個簡單的示意圖,這樣就很清楚了。

- `timescale設定(第一行一定要定義的東西)
格式說明:`timescale <time_unit> / <time_precision>
1ns代表該testbench時間單位,所有的#開頭的delay都會是ns的時間
1ps代表時間的精度
常見的幾種組合:
1ns/1ps:最常見,精度高
1ns/1ns:精度普通
10ns/1ns:常用於舊專案
1ps/1ps:高速電路模擬`timescale 1ns/1ps
- 設定Testbench的PIN,就像一般的.V檔一樣把這個testbench當成一個元件,這邊定出來的PIN name,就會出現在Modelsim上的波形上。
module state_exer_tb();
reg clk;
reg rst_n;
reg ext_bot;
wire led_r;
wire led_y;
wire led_g;
- 定義我們要模擬的.V檔的PIN,與我們的tessbench PIN做連結
Testbench pin link:// 被測試模組
Module state_exercise pin define
state_exercise u_state (
.ext_clk(clk),
.ext_rst_n(rst_n),
.ext_bot(ext_bot),
.led_r(led_r),
.led_y(led_y),
.led_g(led_g)
);
- 開始定義我們的動作,主要就是一些input動作的0或1的設定,接著敲我們的clk,可以看到我們的rst_n從50ns後開始轉太,而clk則是固定40ns。
// 初始化
initial begin
clk = 0;
rst_n = 0; // 一開始 reset
ext_bot = 0;
#50 rst_n = 1; // 50ns 後釋放 reset
end
// 模擬時鐘,假設 25MHz -> 40ns 一個週期
always #20 clk = ~clk;
- 後續就是我們其他input的設定,而led_r, led_y, led_y,則是照我們在程式內設定的方式來動作。當我的ext_bot每轉態一次,而clk在rising的時候,就會觸發led的動作更新。
//testbench_tb.v
initial
begin
#110 ext_bot = 1;
#63 ext_bot = 0;
#70 ext_bot = 1;
#58 ext_bot = 0;
#65 ext_bot = 1;
#91 ext_bot = 0;
#155 ext_bot = 1;
#63 ext_bot = 0;
#155 ext_bot = 1;
#62 ext_bot = 0;
#155 ext_bot = 1;
#68 ext_bot = 0;
#155 ext_bot = 1;
#77 ext_bot = 0;
end
endmodule
//欲模擬的.V檔
always @(posedge ext_clk or negedge ext_rst_n) begin
if (!ext_rst_n)
state <= S0;
else
if (ext_bot)
state <= next_state;
end
















