按键抖动仿真Testbench(repeat、task、random)的用法
文章目錄
- 一、關(guān)鍵字的用法
- 1、random的用法
- 2、task的用法
- 3、repeat的用法
- 二、按鍵隨機(jī)抖動仿真(testbench訓(xùn)練)
之前一講,我們是用了簡單的TB的寫法,產(chǎn)生的是固定的抖動。
下面我們要用到隨機(jī)函數(shù)、task任務(wù)、repeat函數(shù)來生成隨機(jī)的抖動仿真
https://blog.csdn.net/ciscomonkey/article/details/86485111
一、關(guān)鍵字的用法
1、random的用法
$ random這一系列函數(shù)可以產(chǎn)生一個有符號的32bit隨機(jī)整數(shù)。一般的用法是$ random %b, 其中b>0; 這樣就會生成一個范圍在(-b+1):(b-1)中的隨機(jī)數(shù)。
如果只得到正數(shù)的隨機(jī)數(shù),可采用{$random}%b來產(chǎn)生。
比如我們可以用于隨機(jī)時間: {$random}%20_000_000 表示的是20_000_000以內(nèi)的隨機(jī)數(shù)。
2、task的用法
task和function綜合出來的電路都是組合電路,如果你想在task和function來寫時序功能,那你需要的是module而不是這兩個。
task <任務(wù)名>
<端口及其數(shù)據(jù)類型聲明語句>
<組合語句1>
<組合語句2>
<組合語句n>
endtask
任務(wù)的調(diào)用的語法如下:
<任務(wù)名>(頂層端口1,頂層端口2,。。。頂層端口n)
task只綜合組合邏輯部分。
實際例子如下:
//任務(wù)task使用示例 module test (input [3:0] A, B, input CIN, output [3:0] S, output COUT );reg [1:0] S0, S1, S2, S3;task ADD;input A, B, CIN;output [1:0] C;reg [1:0] C;reg S, COUT;beginS = A ^ B ^ CIN;COUT = (A&B) | (A&CIN) | (B&CIN);C = {COUT, S};end endtaskalways @(A or B or CIN) beginADD (A[0], B[0], CIN, S0);ADD (A[1], B[1], S0[1], S1);ADD (A[2], B[2], S1[1], S2);ADD (A[3], B[3], S2[1], S3);S = {S3[0], S2[0], S1[0], S0[0]};COUT = S3[1]; endendmodule3、repeat的用法
表示重復(fù)執(zhí)行的次數(shù),不可以綜合
語法結(jié)構(gòu)
二、按鍵隨機(jī)抖動仿真(testbench訓(xùn)練)
運用上面講述的三個函數(shù),進(jìn)行仿真,也就是說,我們隨機(jī)的隔一段時間,就把key翻轉(zhuǎn)一次,一共執(zhí)行key翻轉(zhuǎn)50次的65535ns隨機(jī)變量的抖動,來模擬的抖動,那么我的最大抖動時間就是random的最大數(shù)*50(假設(shè)每次都隨機(jī)數(shù)去取了最大數(shù))
`timescale 1ns/1ns `define clk_period 20module key_filter_tb;reg clk;reg rst_n;reg key;wire key_flag;wire key_state;key_filter key_filter(.clk(clk),.rst_n(rst_n),.key(key),.key_flag(key_flag),.key_state(key_state));initial beginrst_n = 1'b0;#(`clk_period*10) rst_n = 1'b1;#(`clk_period*10 + 1);press_key(39999999,49999999);press_key(59999999,49999999);press_key(159999999,99999999);endinitial clk = 1;always#(`clk_period/2) clk = ~clk;reg [15:0]myrand;task press_key;input [31:0]press_time;input [31:0]release_time;beginrepeat(50)beginmyrand = {$random}%65536;#myrand key = ~key; endkey = 0;#press_time;repeat(50)beginmyrand = {$random}%65536;#myrand key = ~key; endkey = 1;#release_time; end endtaskendmodule總結(jié)
以上是生活随笔為你收集整理的按键抖动仿真Testbench(repeat、task、random)的用法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: modelsim的工程仿真流程--2
- 下一篇: SPI配置8通道ADC128S022