女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

認識一下只有driver的驗證平臺

冬至子 ? 來源:不二魚 ? 作者:不二魚 ? 2023-06-15 18:09 ? 次閱讀

對于一個驗證平臺而言,最重要的角色是激勵的產生,最開始,driver是集合了數據的產生、發送于一體這么一個重要的角色(后面到進入真正UVM會將功能分離)。對于整個驗證平臺而言,產生激勵,將激勵送到DUT,收集DUT產生的數據,進行對比,這是最基本的功能。后面一系列的UVM機制,都只是為了能夠更好的實現這個基本功能。

這里也強調一點,學習UVM,我個人覺得最重要的是搞清楚,what,where,how。你應該產生什么樣的激勵數據(what),你的激勵是在哪里產生(where),能各個組件之間是怎么連接,數據怎么發送,怎么收集,怎么對比,這就是how的問題。數據在哪里對比,這又是where的問題。能夠從數據產生的源頭,一路追,追到數據在各個組件里頭的流轉。就像你找到了一條小溪的源頭,你能夠沿著這條小溪,一路追下去,直到你明白這條小溪會流經那些村莊,目的地是哪里。

學過verilog的應該知道,verilog里面進行驗證,只有兩個部分,一個是DUT,一個是tb,這兩個組件,組成了最最基本的驗證平臺,其中,它包含了激勵部分,以及代碼部分。在UVM中,最基本的驗證平臺也是由這兩部分組成,但是多了一個top_tb.sv的組件。下面,先認識一下這個簡單的平臺,從代碼進行剖析,代碼全部來自張強老師的《UVM》實戰的源碼,張強老師如果覺得我侵權了,請聯系我。

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

這個dut確實是很簡單。當復位也就是rst_n=0時,將輸出數據(txd)和使能(tx_en)都設置為0,否則,將輸入給輸出。

圖片

看到這個DUT,如果讓你自己寫一個Tb.v,你會怎么寫呢?不妨自己寫一個,然后再對照下面這個。其實思路也很簡答,就是產生相應的數據給四根輸入信號,經過dut,看輸出的數據。產生時鐘給clk,產生復位信號給rst_n,產生數據給rxd,產生使能信號給rx_dv。下面我們來看看driver和tb。

`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
//這個`ifndef和`define其實就是相當于一個判斷條件,便于調用
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
//這里出現了extern,你翻翻SV的書就知道,只是因為把代碼全部寫在這個類里面顯得臃腫
//所以,在這里用extern留下了一個索引,具體的內容放到class外面
task my_driver::main_phase(uvm_phase phase);//::作用域符號,這個寫法就是個規則,記住就行
   top_tb.rxd <= 8'b0; 
   top_tb.rx_dv <= 1'b0;
//這兩句相當于初始化
   while(!top_tb.rst_n)//這里其實是等待復位結束,否則一直在這里循環
      @(posedge top_tb.clk);
   for(int i = 0; i < 256; i++)begin// 復位結束之后開始for循環,產生256個數據
      @(posedge top_tb.clk);
      top_tb.rxd <= $urandom_range(0, 255);//產生隨機數,賦值給rxd
      top_tb.rx_dv <= 1'b1;
      `uvm_info("my_driver", "data is drived", UVM_LOW)
   end
   @(posedge top_tb.clk);//賦值結束以后,等待時鐘上升沿,將rx_dv,重新歸零
   top_tb.rx_dv <= 1'b0;
endtask
`endif
`timescale 1ns/1ps //時鐘精度
`include "uvm_macros.svh"//導入uvm的庫文件,才能識別定義的宏變量


import uvm_pkg::*; // 導入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));
//這是信號的例化,相當于把這個文件中的信號,和DUT的輸入信號連接起來
initial begin
   my_driver drv;//指定一個類的指針,你可以理解為用drv代替了driver.
   drv = new("drv", null);//實例化一個driver,不實例化的driver相當于一張圖紙
   drv.main_phase(null);
   $finish();
end


initial begin
   clk = 0;
   forever begin  // forever,永遠發生,你還能想到其他方法嗎?
      #100 clk = ~clk; //這是產生時鐘的地方,#是延遲,意思是每隔100個時鐘單位,clk進行翻轉
   end
end


initial begin
   rst_n = 1'b0;
   #1000; //復位持續了1000個時鐘單位
   rst_n = 1'b1;
end


endmodule

用vcs進行仿真

看一下波形:

圖片

從波形圖中,我們怎么看呢? 看復位 ,是不是在1000個時間單位以前在復位; 看采樣 ,復位之后的時鐘上升沿是否開始采樣,采的樣是不是復位之后的有效數據, 看數據 ,數據個數,對照輸入輸出的數據是否一致;我們就基本可以判定,DUT的功能有沒有實現。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 仿真器
    +關注

    關注

    14

    文章

    1033

    瀏覽量

    84936
  • UVM
    UVM
    +關注

    關注

    0

    文章

    182

    瀏覽量

    19425
  • CLK
    CLK
    +關注

    關注

    0

    文章

    127

    瀏覽量

    17518
  • DUT
    DUT
    +關注

    關注

    0

    文章

    190

    瀏覽量

    12839
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    認識一下這款名叫“CAN總線存儲器”的神器

    CAN總線數據不能及時查看怎么辦?CAN總線數據過多沒時間處理怎么辦?想要回看CAN總線歷史數據又怎么辦?總線數據三連問,卻只需要個答案,是時候認識一下這款名叫“CAN總線存儲器”的神器了。
    的頭像 發表于 05-20 08:08 ?8501次閱讀

    認識一下NI SWITCH模塊的組成和特點

    許多自動化測試應用都需要通過部署個開關網絡來實現儀器儀表和DUT之間的信號路由。而開關不僅可用于路由信號,也是增加昂貴儀器儀表的通道數以及提高測量靈活性和可重復性的種低成本方法。
    的頭像 發表于 03-22 13:41 ?2162次閱讀
    <b class='flag-5'>認識一下</b>NI SWITCH模塊的組成和特點

    IC驗證"個簡單的UVM驗證平臺"是如何搭建的(六)

    個文件,里面包含了眾多的宏定義,只需要包含 次。第4行通過import語句將整個uvm_pkg導入驗證平臺中。只有導入了這個庫,編譯器
    發表于 12-04 15:48

    IC驗證"UVM驗證平臺加入factory機制"(六)

      加入factory機制 上節《IC驗證"個簡單的UVM驗證平臺"是如何搭建的(五)》給出了
    發表于 12-08 12:07

    認識一下針對單片機幾個基本概念

    我們日常的生活離不開秒表的計時,它提醒著我們什么時刻該干什么,單片機也樣,通過單片機內置的晶振來計時,首先讓我們認識一下針對單片機幾個基本概念:時鐘周期:時鐘周期 T 是時序中最小的時間單位,具體
    發表于 11-22 06:43

    認識一下Boost拓撲結構

    上期答案揭曉:答案上圖 c ,下圖 a小伙伴們答對了嗎?YTDFWANGWEI :我的笨辦法:source,源的意思,就是提供電流。所以,只要是電流流出,就是source。不知道是否正確?作者:完全正確。繼續下步講解:參考一下以下兩個圖:sink...
    發表于 12-31 08:25

    先來認識一下正激的基本原理

    我們先來認識一下正激的基本原理,如圖所示:正激在原邊加正向電壓 MOS 管導通時,副邊的輸出符合變壓器原理,即:Vs = n* VinVs :變壓器副邊輸出電壓n:匝比 = Ns/NpVin:輸入電壓由上式可知正激拓撲不難理解。* 注意:原邊還有個繞組稱為復位繞組,副邊有...
    發表于 12-31 06:18

    簡單地認識一下D/A和A/D

    隨著我們學習的逐步推進,我們可以了解到51單片機的更多的知識和元件,今天我們就來簡單地認識一下D/A和A/D。首先我們先來介紹一下D/A,就是兩個單詞digital和anolog.就是把數據量轉換
    發表于 02-24 07:21

    個真實網站的驗證碼為例,實現了基于一下KNN的驗證碼識別

    很多網站登錄都需要輸入驗證碼,如果要實現自動登錄就不可避免的要識別驗證碼。本文以個真實網站的驗證碼為例,實現了基于一下KNN的
    的頭像 發表于 12-24 17:27 ?7995次閱讀

    帶你重新認識一下真正的PID

    網上關于PID算法的文章很多,但是感覺有必要自己再進行次總結,抽絲剝繭地重新認識一下PID;
    的頭像 發表于 10-10 14:48 ?3006次閱讀

    認識一下丙烷傳感器

    丙烷傳感器主要用于丙烷氣體(C3H8)的檢測,般基于半導體或催化燃燒原理。
    的頭像 發表于 09-07 16:41 ?2318次閱讀
    <b class='flag-5'>認識一下</b>丙烷傳感器

    認識一下并列刷寫(Parallel Flash)

    再有,在車輛下線時EOL(End of Line),工廠追求效率,般會1(刷寫上位機)拖N(N個 ECU)刷寫,這是不是種Parallel Flash呢?
    的頭像 發表于 11-15 16:03 ?5079次閱讀
    <b class='flag-5'>認識一下</b>并列刷寫(Parallel Flash)

    帶你認識一下鋁電解電容

    電解電容是種由兩塊平行金屬板以及兩金屬板之間放置電解液所構成的電容。
    的頭像 發表于 05-16 10:53 ?6286次閱讀
    帶你<b class='flag-5'>認識一下</b>鋁電解電容

    簡單認識一下EMC中共模和差模的區別

    電壓電流的變化通過導線傳輸時有兩種形態, 即共模和差模。下面帶大家簡單認識一下共模和差模的區別。
    發表于 06-08 14:58 ?8140次閱讀
    簡單<b class='flag-5'>認識一下</b>EMC中共模和差模的區別

    認識一下幾個常用的門級電路

    標準單元庫是數字集成電路的積木,是復雜電路和系統的基礎。今天我們來認識一下其中的幾個常用門級電路。
    的頭像 發表于 10-09 15:49 ?2475次閱讀
    <b class='flag-5'>認識一下</b>幾個常用的門級電路