對(duì)于一個(gè)驗(yàn)證平臺(tái)而言,最重要的角色是激勵(lì)的產(chǎn)生,最開(kāi)始,driver是集合了數(shù)據(jù)的產(chǎn)生、發(fā)送于一體這么一個(gè)重要的角色(后面到進(jìn)入真正UVM會(huì)將功能分離)。對(duì)于整個(gè)驗(yàn)證平臺(tái)而言,產(chǎn)生激勵(lì),將激勵(lì)送到DUT,收集DUT產(chǎn)生的數(shù)據(jù),進(jìn)行對(duì)比,這是最基本的功能。后面一系列的UVM機(jī)制,都只是為了能夠更好的實(shí)現(xiàn)這個(gè)基本功能。
這里也強(qiáng)調(diào)一點(diǎn),學(xué)習(xí)UVM,我個(gè)人覺(jué)得最重要的是搞清楚,what,where,how。你應(yīng)該產(chǎn)生什么樣的激勵(lì)數(shù)據(jù)(what),你的激勵(lì)是在哪里產(chǎn)生(where),能各個(gè)組件之間是怎么連接,數(shù)據(jù)怎么發(fā)送,怎么收集,怎么對(duì)比,這就是how的問(wèn)題。數(shù)據(jù)在哪里對(duì)比,這又是where的問(wèn)題。能夠從數(shù)據(jù)產(chǎn)生的源頭,一路追,追到數(shù)據(jù)在各個(gè)組件里頭的流轉(zhuǎn)。就像你找到了一條小溪的源頭,你能夠沿著這條小溪,一路追下去,直到你明白這條小溪會(huì)流經(jīng)那些村莊,目的地是哪里。
學(xué)過(guò)verilog的應(yīng)該知道,verilog里面進(jìn)行驗(yàn)證,只有兩個(gè)部分,一個(gè)是DUT,一個(gè)是tb,這兩個(gè)組件,組成了最最基本的驗(yàn)證平臺(tái),其中,它包含了激勵(lì)部分,以及代碼部分。在UVM中,最基本的驗(yàn)證平臺(tái)也是由這兩部分組成,但是多了一個(gè)top_tb.sv的組件。下面,先認(rèn)識(shí)一下這個(gè)簡(jiǎn)單的平臺(tái),從代碼進(jìn)行剖析,代碼全部來(lái)自張強(qiáng)老師的《UVM》實(shí)戰(zhàn)的源碼,張強(qiáng)老師如果覺(jué)得我侵權(quán)了,請(qǐng)聯(lián)系我。
module dut(clk,
rst_n,
rxd,
rx_dv,
txd,
tx_en);
input clk;
input rst_n;
input[7:0] rxd;
input rx_dv;
output [7:0] txd;
output tx_en;
reg[7:0] txd;
reg tx_en;
always @(posedge clk) begin
if(!rst_n) begin
txd <= 8'b0;
tx_en <= 1'b0;
end
else begin
txd <= rxd;
tx_en <= rx_dv;
end
end
endmodule
這個(gè)dut確實(shí)是很簡(jiǎn)單。當(dāng)復(fù)位也就是rst_n=0時(shí),將輸出數(shù)據(jù)(txd)和使能(tx_en)都設(shè)置為0,否則,將輸入給輸出。
看到這個(gè)DUT,如果讓你自己寫(xiě)一個(gè)Tb.v,你會(huì)怎么寫(xiě)呢?不妨自己寫(xiě)一個(gè),然后再對(duì)照下面這個(gè)。其實(shí)思路也很簡(jiǎn)答,就是產(chǎn)生相應(yīng)的數(shù)據(jù)給四根輸入信號(hào),經(jīng)過(guò)dut,看輸出的數(shù)據(jù)。產(chǎn)生時(shí)鐘給clk,產(chǎn)生復(fù)位信號(hào)給rst_n,產(chǎn)生數(shù)據(jù)給rxd,產(chǎn)生使能信號(hào)給rx_dv。下面我們來(lái)看看driver和tb。
`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
//這個(gè)`ifndef和`define其實(shí)就是相當(dāng)于一個(gè)判斷條件,便于調(diào)用
class my_driver extends uvm_driver;
function new(string name = "my_driver", uvm_component parent = null);
super.new(name, parent);
endfunction
extern virtual task main_phase(uvm_phase phase);
endclass
//這里出現(xiàn)了extern,你翻翻SV的書(shū)就知道,只是因?yàn)榘汛a全部寫(xiě)在這個(gè)類(lèi)里面顯得臃腫
//所以,在這里用extern留下了一個(gè)索引,具體的內(nèi)容放到class外面
task my_driver::main_phase(uvm_phase phase);//::作用域符號(hào),這個(gè)寫(xiě)法就是個(gè)規(guī)則,記住就行
top_tb.rxd <= 8'b0;
top_tb.rx_dv <= 1'b0;
//這兩句相當(dāng)于初始化
while(!top_tb.rst_n)//這里其實(shí)是等待復(fù)位結(jié)束,否則一直在這里循環(huán)
@(posedge top_tb.clk);
for(int i = 0; i < 256; i++)begin// 復(fù)位結(jié)束之后開(kāi)始for循環(huán),產(chǎn)生256個(gè)數(shù)據(jù)
@(posedge top_tb.clk);
top_tb.rxd <= $urandom_range(0, 255);//產(chǎn)生隨機(jī)數(shù),賦值給rxd
top_tb.rx_dv <= 1'b1;
`uvm_info("my_driver", "data is drived", UVM_LOW)
end
@(posedge top_tb.clk);//賦值結(jié)束以后,等待時(shí)鐘上升沿,將rx_dv,重新歸零
top_tb.rx_dv <= 1'b0;
endtask
`endif
`timescale 1ns/1ps //時(shí)鐘精度
`include "uvm_macros.svh"//導(dǎo)入uvm的庫(kù)文件,才能識(shí)別定義的宏變量
import uvm_pkg::*; // 導(dǎo)入uvm的包
`include "my_driver.sv"
module top_tb;
reg clk;
reg rst_n;
reg[7:0] rxd;
reg rx_dv;
wire[7:0] txd;
wire tx_en;
dut my_dut(.clk(clk),
.rst_n(rst_n),
.rxd(rxd),
.rx_dv(rx_dv),
.txd(txd),
.tx_en(tx_en));
//這是信號(hào)的例化,相當(dāng)于把這個(gè)文件中的信號(hào),和DUT的輸入信號(hào)連接起來(lái)
initial begin
my_driver drv;//指定一個(gè)類(lèi)的指針,你可以理解為用drv代替了driver.
drv = new("drv", null);//實(shí)例化一個(gè)driver,不實(shí)例化的driver相當(dāng)于一張圖紙
drv.main_phase(null);
$finish();
end
initial begin
clk = 0;
forever begin // forever,永遠(yuǎn)發(fā)生,你還能想到其他方法嗎?
#100 clk = ~clk; //這是產(chǎn)生時(shí)鐘的地方,#是延遲,意思是每隔100個(gè)時(shí)鐘單位,clk進(jìn)行翻轉(zhuǎn)
end
end
initial begin
rst_n = 1'b0;
#1000; //復(fù)位持續(xù)了1000個(gè)時(shí)鐘單位
rst_n = 1'b1;
end
endmodule
用vcs進(jìn)行仿真
看一下波形:
從波形圖中,我們?cè)趺纯茨兀?看復(fù)位 ,是不是在1000個(gè)時(shí)間單位以前在復(fù)位; 看采樣 ,復(fù)位之后的時(shí)鐘上升沿是否開(kāi)始采樣,采的樣是不是復(fù)位之后的有效數(shù)據(jù), 看數(shù)據(jù) ,數(shù)據(jù)個(gè)數(shù),對(duì)照輸入輸出的數(shù)據(jù)是否一致;我們就基本可以判定,DUT的功能有沒(méi)有實(shí)現(xiàn)。
-
仿真器
+關(guān)注
關(guān)注
14文章
1045瀏覽量
86383 -
UVM
+關(guān)注
關(guān)注
0文章
183瀏覽量
19842 -
CLK
+關(guān)注
關(guān)注
0文章
132瀏覽量
17853 -
DUT
+關(guān)注
關(guān)注
0文章
192瀏覽量
13260
發(fā)布評(píng)論請(qǐng)先 登錄
認(rèn)識(shí)一下這款名叫“CAN總線存儲(chǔ)器”的神器
認(rèn)識(shí)一下NI SWITCH模塊的組成和特點(diǎn)

IC驗(yàn)證"一個(gè)簡(jiǎn)單的UVM驗(yàn)證平臺(tái)"是如何搭建的(六)
IC驗(yàn)證"UVM驗(yàn)證平臺(tái)加入factory機(jī)制"(六)
認(rèn)識(shí)一下針對(duì)單片機(jī)幾個(gè)基本概念
認(rèn)識(shí)一下Boost拓?fù)浣Y(jié)構(gòu)
先來(lái)認(rèn)識(shí)一下正激的基本原理
簡(jiǎn)單地認(rèn)識(shí)一下D/A和A/D
帶你重新認(rèn)識(shí)了一下真正的PID
認(rèn)識(shí)一下甲醛傳感器
認(rèn)識(shí)一下并列刷寫(xiě)(Parallel Flash)

簡(jiǎn)單認(rèn)識(shí)一下EMC中共模和差模的區(qū)別

認(rèn)識(shí)一下幾個(gè)常用的門(mén)級(jí)電路

評(píng)論