在上次網路研討會中,我解釋了在systemverilog中匯入程式包時會發生什麼情況。不過,仍然有很多問題,所以這裡給出了書面版本。
請在你自己的系統或eda工具上嘗試這些示例。將**剪下並貼上到systemverilog檔案中,進行編譯和除錯。犯些錯誤,搞得一團亂,然後從中學習(即不斷試錯,入坑又出坑)。如果你只是聽或讀了這篇,但從未執行過**,那麼這些概念將從你的腦中消失的速度比neowise彗星更快。
另一盒糖
想象你正在做晚餐,需要一些糖。你會怎麼做?把手伸到冰箱旁邊的櫃子裡,抓住盒子。糟糕,糖昨晚已經用完了,所以沒有盒子。因此,你需要去雜貨店再買一些。
systemverilog程式包就像雜貨店一樣,是乙個存放了很多東西,每當你在家裡找不到東西時就會去的地方。
乙個美國的雜貨店
什麼是程式包?
程式包中涵蓋了你想在模組之間共享的定義。可以包括引數,列舉型別,結構,型別定義(typedef),類,甚至是任務或函式。
這裡有乙個程式包,其中定義了資料型別和引數。
// chip_pkg.sv編譯乙個程式包package chip_pkg;
typedef logic [3:0] data_t;
parameter life = 9;
endpackage
當你使用questa進行編譯時,**將在工作庫中轉換為二進位制形式。相較於原始**,編譯器可以更快地讀取二進位制版本,這就是為什麼我們要匯入程式包而不是包含它們的原因。 uvm程式包有70,000行,但是編譯版本幾乎是即時匯入的。
匯入程式包
模組通過匯入來訪問已編譯的程式包**。這裡給了乙個宣告一些引數和變數並顯示引數的晶元模組。
// chip.sv程式包商店module chip;
import chip_pkg::*; // wildcard import
parameter init_value = 'hff; // initial value
data_t my_data = init_value; // what are data_t and init_value?
initial $display("my_data = 'h%x / 'b%b", my_data, my_data);
parameter life = 42; // ask douglas adams
initial $display("the meaning of life is %0d", life);
endmodul
systemverilog編譯器在本地查詢名稱。如果找不到它們,則轉到「雜貨店」-即程式包。
當你編譯此模組時,萬用字元import語句會告訴編譯器該包是查詢定義的地方。編譯器不會從包中引入所有名稱,否則那就是像把整個雜貨店帶回家!
模組定義引數init_value。對於「my_data」的宣告,編譯器需要弄清楚「data_t」和「init_value」的含義。編譯器始終從搜尋本地範圍(即晶元模組)開始,並成功在這裡找到init_value。但是,這裡沒有data_t。只有這樣編譯器才會檢視程式包。編譯器成功在晶元程式包中找到data_t的定義!
你可以證明在本地範圍之後程式包也被搜尋了。下乙個**塊定義了乙個引數life並進行列印。在$display()語句中,編譯器需要知道什麼是「 life」。由於你只是在本地宣告了它,因此即使其中有乙個具有相同名稱的引數,編譯器也不會在chip_pkg中查詢。本地定義與包中的引數不衝突,因為從未匯入chip_pkg :: life。
最低限度
只有在本地作用域中找不到新定義時,systemverilog才會從包中引入新定義。這是為什麼呢?如果包中的每個名稱都被立即匯入,則很有可能其中乙個包中的名稱也許與本地範圍內的乙個名稱衝突,例如晶元模組。最好是只引入最少的名稱,而不要太多。
該模組定義了乙個叫life的引數。在你最喜歡的模擬器中執行此**,找出life的意義。如果你是貓的話,假如是9,這會是重要的數字嗎?還是說有更深的東西?
如果模組將data_t型別定義為8chip_pkg顯式獲取life的值?如果在chip_pkg和chop_pkg中都定義了乙個新引數,並且都匯入了該引數,該怎麼辦?會發生什麼?如果我告訴您答案,您將永遠不會記住它。請您自己嘗試,花時間,發現真相。
可直達課程頁面,馬上試聽
往期精彩:
路科發布| 穩中帶漲!25w成晶元校招薪資平均底!2020應屆秋招資料全面分析!
相約今晚8點 2020 ic秋招經驗分享與資料分析
v2pro 2020秋m1 我對你的迷惑和選擇都深以為然
v2pro春季班普遍學撐了,秋季班7月報名你還敢來麼
uvm ral模型:用法和應用
我們準備做第二期線下培訓,依舊認真且嚴肅
如果你突然被裁員了,你的plan b是什麼?
[彩虹糖帶你入門uvm]
理解uvm-1.2到ieee1800.2的變化,掌握這3點就夠
system Verilog 跳轉操作
在verilog中,使用disable宣告來從執行流程中的某一點跳轉到另一點。特別地,disable宣告使執行流程跳轉到標註名字的宣告組末尾,或者乙個任務的末尾。verilog中的disable命令用法有很多,下面是乙個簡單的例子,解釋了disable的作用範圍 1 find first bit s...
System Verilog任務 函式
在system verilog中,begin end是可選的 task mytask1 output logic x,input logic y endtask還可以使用ref型別的引數對變數進行引用,類似於c中的指標,但ref不允許進行陣列引數的傳遞 還可以使用預設引數 增加了return語句 方...
SystemVerilog語言簡介 二
6.使用者定義的型別 verilog不允許使用者定義新的資料型別。systemverilog通過使用typedef提供了一種方法來定義新的資料型別,這一點與c語言類似。使用者定義的型別可以與其它資料型別一樣地使用在宣告當中。例如 typedef unsigned int uint uint a,b ...