系列文章目錄
一、FPGA學習筆記(一)入門背景、軟件及時鐘約束
二、FPGA學習筆記(二)Verilog語法初步學習(語法篇1)
三、FPGA學習筆記(三) 流水燈入門FPGA設(shè)計流程
四、FPGA學習筆記(四)通過數(shù)碼管學習頂層模塊和例化的編寫
五、FPGA學習筆記(五)Testbench(測試平臺)文件編寫進行Modelsim仿真
六、FPGA學習筆記(六)Modelsim單獨仿真和Quartus聯(lián)合仿真
七、FPGA學習筆記(七)verilog的深入學習之任務與函數(shù)(語法篇3)
Testbench文件
編寫Testbench的目的是在Modsim中進行仿真驗證,查看仿真波形和打印信息驗證代碼邏輯。
例如下面代碼:
`timescale 1ns/1ns
module tb_led_dynamic();
//parameter define
parameter T =20 ;
//reg define
reg sys_clk;
reg sys_rst_n;
//wire define
wire [7:0]seg_led;
wire [5:0]sel;
reg key;
wire led;
//*****************************************************
//** main code
//*****************************************************
initial begin
sys_clk <=1'b0;
sys_rst_n <=1'b0;
key <=1'b1;
#50 sys_rst_n <=1'b1;
#1200_000_000 key <=1'b0;
#50_000_000 key <=1'b1;
#950_000_000 key <=1'b0;
#50_000_000 key <=1'b1;
end
always # (T/2) sys_clk <= ~sys_clk;
top_seg_led u0(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.seg_sel (sel),
.seg_led (seg_led),
.key (key),
.led (led)
);
endmodule
變量聲明
聲明信號或變量的關(guān)鍵字為reg和wire,在initial語句或者always語句(過程賦值語句)中使用的變量定義成reg類型,在assign(連續(xù)賦值語句)語句或者用于連接被例化模塊名的信號定義成wire類型。
關(guān)于為什么會出現(xiàn)reg和wire的區(qū)別:
鏈接: Verilog 中定義信號為什么要區(qū)分 wire 和 reg 兩種類型?
經(jīng)典解釋:wire表示直通,即輸入有變化,輸出馬上無條件地反映(如與、非門的簡單連接)。reg表示一定要有觸發(fā),輸出才會反映輸入的狀態(tài)。reg相當于存儲單元,wire相當于物理連線。
寄存器型數(shù)據(jù)保持最后一次的賦值,而線型數(shù)據(jù)需要持續(xù)的驅(qū)動。wire使用在連續(xù)賦值語句中,而reg使用在過程賦值語句(initial ,always)中。wire若無驅(qū)動器連接,其值為z,reg默認初始值為不定值 x 。
時間單位/精度
timescale
定義時間單位: `timescale 1ns/1ns 表示時間單位為1ns,時間精度為1ns。
通常由值 1、10、和 100 以及單位 s、ms、us、ns、ps 和 fs 組成。
定義的是仿真過程所有與時間相關(guān)量的單位(即1單位的時間)。
例如常用的延時函數(shù):#50,代表著延時50個單位時間。
define
`define clock_period 20
always #(`clock_period/2) clock = ~clock;
可以自己宏定義,后面調(diào)用的時候在名字前面加 `。
測試模塊
module tb_led_dynamic();
......
.....
...
endmodule
這里是定義了測試模塊的名字為tb_led_dynamic,編寫的.v文件中的模塊叫功能模塊,那里也有名字的定義。
在測試模塊中,輸入信號一般定義為 reg 型信號,因為后面需要在always/initial語句塊中被賦值,輸出信號一般為 wire型即可。
輸入信號初始化
用initial 語句進行初始化,該語句中的代碼塊只執(zhí)行一次
always 語句實現(xiàn)信號變化
這里的意思是每隔10個時間單位,sys_clk時鐘信號反轉(zhuǎn)一次。實現(xiàn)了50Mhz的時鐘。
還有例如:
always #10 in <= {$random} % 8
表示每隔10個時間單位in的電平變化一次
{$random}%8 表示隨機選取[0,7]之間的數(shù)。
in <= {$random} % 8; 在賦值時會自動進行數(shù)據(jù)類型轉(zhuǎn)換
實例化
如何把自定義的信號以及模擬的信號和實際功能模塊掛鉤呢,所以采用的是實例化,即把模擬的輸入信號傳入到功能模塊中。
系統(tǒng)函數(shù)
例如:
$timeformat(-9, 0, "ns", 6);
$monitor("time:%t in:%b out:%b",$time,in,out);
$timeformat 設(shè)置顯示時間的格式
常見的有:
(1)$time
作用:返回所在模塊的仿真時間,可以查看信號的出現(xiàn)的時間,用來把握信號的時序。
如:
d
i
s
p
l
a
y
(
′
′
t
h
e
t
i
m
e
i
s
display(''the time is %t'',
display(′′thetimeistime) ;//顯示當時的時間
(2)$display
作用: 將需要顯示的內(nèi)容在命令欄顯示出來
如: $display(“the signal is %d”,ad); //將ad信號以十進制的方式顯示出來
(3)$monitor
作用:監(jiān)視變量的變化,一旦變量變化,則將變量顯示出
如:$ monitor (“at time is %t and the signal is %b\n”,$time , signal) ;
(3) 文件操作類
$fopen
作用:打開一個文件面,對文件的操作
$fdisplay
作用:在打開的文件里,寫入顯示的內(nèi)容
$fmonitor
作用:在打開的文件里,寫入監(jiān)視的變量變化時的內(nèi)容
$fclose
作用:關(guān)閉當前的內(nèi)容文章來源:http://www.zghlxwxcb.cn/news/detail-469884.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-469884.html
到了這里,關(guān)于FPGA學習筆記(五)Testbench(測試平臺)文件編寫進行Modelsim仿真的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!