之前有一篇文章介紹過仿真測試文件編寫的步驟:
1.給A模塊寫測試,其測試模塊的模塊名為A_tb,比如原模塊模塊名叫做led,測試模塊名就叫 led_tb;
2.復制A模塊的所有輸入輸出端口,也就是I/O聲明部分(input和output信號),注意這里不包括中間變量(reg型和wire型信號);將所有的input 改為 reg, output 改為 wire;
3.再把A模塊的端口定義部分復制過來,包括 模塊名到分號結束,進行模塊例化;
4.測試模塊的意義就是模擬輸入信號,來驗證原模塊的輸出信號是否符合代碼邏輯,所以在測試模塊里面需要寫一個initial塊模擬所有的輸入變量,進行賦值操作;
5.如果有時鐘,需要再產生一個時鐘信號;
6.最后添加時間標識。
這篇文章就詳細說一下怎么做,舉得例子是上一篇二選一數據選擇器的例子,大家可以動手做一做。
設計背景:
測試文件在我們的項目中格外的重要,比如我們要驗證你的模塊的正確性難道要不停的下板來驗證嗎,如果你的項目小還可以,如果編譯一下超過10分鐘了你難道不停的等待,修改中循壞下去嗎,所以如果我們可以設計出我們的測試文件,那么先驗證我們的系統,如果我們的邏輯都正確了,我們就可以下班來查看,如果還不正確那么我們就可以用quartus 中的工具signaltap來捕捉我們信號來驗證,這些都會在我們以后的文檔中給大家說明。
設計原理:
我們的設計就是一個簡單的2選一多路選擇器,我們通過給這個簡單的多路選擇器來寫測試文件,讓大家對測試有一個簡單的認識。
在架構中我們可以明白的看出我們設計的架構,我們的項目中有2個輸入數據data_1,data_2,一個輸入的選擇位select,還有一個輸出data_out。其實給這個架構寫測試也就是激勵,其實說白了就是給其寫輸入,當給其寫好輸入后,我們不就可以在仿真工具中驗證其邏輯關系了。
設計架構圖:
sel_1架構
總架構
設計代碼:
我們寫好的代碼如下,大家看下,然后我們給大家講解測試怎么寫
模塊
0modulesel_1(data_1,data_2,select,data_out);
1
2 inputdata_1,data_2; //數據輸入
3 inputselect; //選擇位
4
5 outputregdata_out; //數據的輸出
6
7 always@(*)
8 begin
9 if(select) //如果選擇位為高,輸出data_1
10 data_out =data_1;
11 else //如果選擇位為低,輸出data_2
12 data_out =data_2;
13 end
14
15endmodule
測試模塊
測試的簡單寫法,測試中模塊的輸入定義為寄存器reg型,輸出定義為wire型,然后加上我們的塊 initial ,再加上我們的例化,如下:
0`timescale1ns/1ps
1
2module模塊名;
3
4 reg模塊輸入;
5 wire模塊輸出;
6
7 initialbegin
8
9
10
11
12 end
13
14 模塊名 例化名(
15 .端口(端口),
16 .端口(端口),
17
18 );
19
20endmodule
在測試中我們也有許多的系統比如我們的系統任務$stop等,這些都屬于語法知識了,大家可以買一本適合的書來看看,我們為我們的設計寫好的激勵如下:
0`timescale1ns/1ps //這一行中1ns定義我們測試時的時間單位,后面的ps 是精度
1//前面的timescale英文也就是時間量程的意思
2
3modulesel_1_tb;//module 后面跟上我們測試名字,一般我們都寫成模塊名
4//加上_tb,如果我們對一個項目的多個模塊寫測試我們就能清楚的分清
5
6 regdata_1,data_2; //定義模塊的輸入輸出
7 regselect; //模塊中的輸入定義為寄存器
8
9 wiredata_out; //輸出定義為wire型也就是線型
10
11 initialbegin //initial 是一個串型執行的,在測試中被綜合,
12 //如果你寫到模塊中,可是會報錯的
13 data_1 =0; //然后我們就可以定義我們的端口,給我們的端口賦初值
14 data_2 =0;
15 select =0;
16
17 #200data_1 =1;data_2 =0;//延遲200ns給輸入賦值
18 #100select =1; //延遲200ns后給選擇位賦值
19 #100select =0; //延遲200ns后給選擇位賦值
20
21 #200data_1 =0;data_2 =1;
22 #100select =0;
23 #100select =1;
24
25 #300$stop; //$stop 系統任務,也就是停止的意思,這句 就是延遲 300ns后,仿真停止
26 end
27
28 sel_1 sel_1_dut( //模塊的例化,和端口的連接
29 .data_1(data_1),
30 .data_2(data_2),
31 .select(select),
32 .data_out(data_out)
33 );
34
35endmodule
在測試中如果我們用到時鐘了怎么辦,我們可以這樣寫,如下
0`timescale1ns/1ps
1
2module模塊名;
3
4 reg模塊輸入;
5 wire模塊輸出;
6 regclk,rst_n;
7
8 initialbegin
9 clk =1;
10 rst_n =0;
11
12 #200.1rst_n =1;
13
14 end
15
16 always#10clk =~clk; //always 一直,這樣可以寫成一個 50M的時鐘
17 //說的是延遲10ns翻轉一次,也就是一 個周期20ns
18
19 模塊名 例化名(
20 .端口(端口),
21 .端口(端口),
22
23 );
24
25endmodule
仿真圖:
在仿真中我們可以真實的看到,當數據data_1為1,data_2位0的時候,當選擇位select為0的時候,輸出data_out的值為0也就是data_2的值,當select為1的時候,data_out的值位1,也就是data_1的值,后面的仿真也一樣我們可以清楚的看到。
以上就是對于二選一數據選擇器的仿真測試文件的編寫細節,大家可以動手去做一做,加油,各位。
-
FPGA
+關注
關注
1629文章
21753瀏覽量
604198 -
仿真測試
+關注
關注
0文章
90瀏覽量
11318
發布評論請先 登錄
相關推薦
評論