RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UVM設(shè)計(jì)模式:OOP特性、設(shè)計(jì)原則、規(guī)范與單元測試

ruikundianzi ? 來源:IP與SoC設(shè)計(jì) ? 2023-01-05 15:38 ? 次閱讀

懂得“數(shù)據(jù)結(jié)構(gòu)與算法” 寫出高效的代碼,懂得“設(shè)計(jì)模式”寫出高質(zhì)量的代碼。

何為高質(zhì)量的代碼?

下面這些詞匯是我們常用的形容好代碼的詞匯:

靈活性(flexibility)、可擴(kuò)展性(extensibility)、可維護(hù)性(maintainability)、可讀性(readability)、可理解性(understandability)、易修改性(changeability)、可復(fù)用(reusability)、可測試性(testability)、模塊化(modularity)、高內(nèi)聚低耦合(high cohesion loose coupling)、高效(high effciency)、高性能(high performance)、安全性(security)、兼容性(compatibility)、易用性(usability)、整潔(clean)、清晰(clarity)、簡單(simple)、直接(straightforward)、少即是多(less code is more)、文檔詳盡(well-documented)、分層清晰(well-layered)、正確性(correctness、bug free)、健壯性(robustness)、魯棒性(robustness)、可用性(reliability)、可伸縮性(scalability)、穩(wěn)定性(stability)、優(yōu)雅(elegant)、好(good)

如何寫出高質(zhì)量代碼?

  1. 面向?qū)ο?a href="http://hljzzgx.com/v/tag/1315/" target="_blank">編程因?yàn)槠渚哂胸S富的特性(封裝、抽象、繼承、多態(tài)),可以實(shí)現(xiàn)很多復(fù)雜的設(shè)計(jì)思路,是很多設(shè)計(jì)原則、設(shè)計(jì)模式等編碼實(shí)現(xiàn)的基礎(chǔ)。

  2. 設(shè)計(jì)原則是指導(dǎo)我們代碼設(shè)計(jì)的一些經(jīng)驗(yàn)總結(jié),對(duì)于某些場景下,是否應(yīng)該應(yīng)用某種設(shè)計(jì)模式,具有指導(dǎo)意義。

  3. 設(shè)計(jì)模式是針對(duì)軟件開發(fā)中經(jīng)常遇到的一些設(shè)計(jì)問題,總結(jié)出來的一套解決方案或者設(shè)計(jì)思路。應(yīng)用設(shè)計(jì)模式的主要目的是提高代碼的可擴(kuò)展性。

  4. 編程規(guī)范主要解決的是代碼的可讀性問題。

  5. 重構(gòu)作為保持代碼質(zhì)量不下降的有效手段。

面向?qū)ο?/span>

含義

面向?qū)ο缶幊痰挠⑽目s寫是 OOP,全稱是 Object Oriented Programming。對(duì)應(yīng)地,面向?qū)ο缶幊陶Z言的英文縮寫是 OOPL,全稱是 Object Oriented Programming Language。

面向?qū)ο缶幊讨杏袃蓚€(gè)非常重要、非?;A(chǔ)的概念,那就是類(class)和對(duì)象(object)。這兩個(gè)概念最早出現(xiàn)在 1960 年,在 Simula 這種編程語言中第一次使用。而面向?qū)ο缶幊踢@個(gè)概念第一次被使用是在 Smalltalk 這種編程語言中。Smalltalk 被認(rèn)為是第一個(gè)真正意義上的面向?qū)ο缶幊陶Z言。

Systemverilog作為面向?qū)ο蟮恼Z言,相比C++, 更"像“ Java. Java語言并不直接運(yùn)行在真實(shí)機(jī)器上,而是有一個(gè)虛擬機(jī)(即Java Virtual Machine ,JVM)來承載其運(yùn)行,JVM使用C++編寫的,而C++是C的超集。

UML

UML(Unified Model Language),統(tǒng)一建模語言。用畫圖表達(dá)面向?qū)ο蠡蛟O(shè)計(jì)模式的設(shè)計(jì)思路。對(duì)于UML的使用,純軟件人員之間仍存在一些爭議。

示例:

e6ee8d3a-8cc8-11ed-bfe3-dac502259ad0.png

封裝(Encapsulation)

將屬性和方法封裝到到類中,但類中的屬性并不需要全部暴露出去,可以通過加上訪問權(quán)限控制這一語法機(jī)制,限制對(duì)類屬性的訪問,修改。

Java中的權(quán)限修飾符:

private 修飾的函數(shù)或者成員變量,只能在類內(nèi)部使用。

protected 修飾的函數(shù)或者成員變量,可以在類及其子類內(nèi)使用。

public 修飾的函數(shù)或者成員變量,可以被任意訪問。

SV中的訪問權(quán)限控制qualifiers限定符:

local:表示的成員或方法只對(duì)該類的對(duì)象可見,子類以及類外不可見。

protected:表示的成員或方法對(duì)該類以及子類可見,對(duì)類外不可見。

除此之外,我們還常見const, static修飾變量。

const:分為兩種:全局性、instance性的 (const 在run-time階段,而 localparam需要在elaboration-time
被賦值)

全局性const:在聲明時(shí)即賦值,之后不可修改;

instace性const:只使用const進(jìn)行聲明,賦值發(fā)生在new()中

const修飾的變量,不允許被修改,否則編譯器報(bào)錯(cuò)。

為什么const修飾的變量不可以被修改呢?其實(shí)無論SV,C++還是C語言,各種語言的語法不同,但是最終都是通過編譯器編譯后,程序運(yùn)行在系統(tǒng)內(nèi)存里,如果const修飾的變量被編譯器分配到了一個(gè).rodata只讀的內(nèi)存段,那么就可以很好的解釋為什么不可以被修改了。同理,static對(duì)應(yīng)靜態(tài)分配的地址(存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū)),該段地址相對(duì)automatic屬性的地址段,不會(huì)被釋放內(nèi)存,自然可以在整個(gè)仿真過程一直存在。

為了地址對(duì)齊,SV仿真器會(huì)把byte放在32bit的地址空間。

對(duì)于task/function調(diào)用,則對(duì)應(yīng)??臻g,如果使用的是input,output類型的參數(shù),開始調(diào)用時(shí)“input” 變量 copy到棧中,結(jié)束調(diào)用時(shí)“ouput” 變量再pop出棧。所以在task/function中修改變量,修改的結(jié)果對(duì)其他調(diào)用函數(shù)不可見。如果使用SV中的ref,一方面對(duì)于數(shù)據(jù)量較大的數(shù)組,不用copy到??臻g,可以獲得更佳的性能,同時(shí)修改變量的結(jié)果對(duì)外可見。

對(duì)于上述諸多的變量修飾符,從編譯存儲(chǔ)的角度分析,可以加深理解。C語言相對(duì)其他語言O(shè)OP語言,更接近硬件,可以通過objdump –dS a.out 反匯編查看各個(gè)變量的

e705c98c-8cc8-11ed-bfe3-dac502259ad0.png

e71cce52-8cc8-11ed-bfe3-dac502259ad0.png

main 函數(shù)位于.text段,GLOBAL修飾屬于External Linkage

‘A’ 位于 .rodata段

‘Hello World” 也位于.rodata段 hexdump –C a.out可以查看。

程序加載運(yùn)行時(shí), .rodata段和.text段通常合并到一個(gè)Segment中,操作系統(tǒng)將這個(gè)Segment的頁面只讀保護(hù)起來,防止意外的改寫。

.data段中有 ‘a(chǎn)’, ‘b’, ‘d’ , 其中a是GLOBAL全局變量,b被static修飾,為LOCAL,不會(huì)被鏈接器處理。d被static修飾,并位于main函數(shù)中,靜態(tài)分配。

.bss段緊挨著.data段,被0填充,不占內(nèi)存。所以c位于.bss段,未賦值初始化為0. .data 和.bss在加載時(shí)合并到一個(gè)Segment中,這個(gè)Segment是可讀可寫的。

‘e’ 位于函數(shù)內(nèi)部,放在棧上存儲(chǔ), 省略auto修飾

‘f’ 寄存器聲明,保存在CPU寄存器上

參考:Linux C編程一站式學(xué)習(xí) 宋勁杉 19.3 變量的存儲(chǔ)布局

抽象(Abstraction)

OOP中抽象這一特性本身就很“抽象”,如果單單從語法上看,SV在《IEEE Standard for SystemVerilog 1800-2012》才加入了像Java語言那樣支持抽象(面向接口編程)的語法。關(guān)鍵詞是 interface class, implements。

當(dāng)一個(gè)class implements 一個(gè) interface class時(shí),必須override interface class 中的純虛(pure virtual)方法,這也很符合 implements這個(gè)單詞本身的含義。

下面看一個(gè)列子(from IEEE Standard for SystemVerilog 1800-2012 8.26):

e7bf5488-8cc8-11ed-bfe3-dac502259ad0.png

e7ddeb32-8cc8-11ed-bfe3-dac502259ad0.png

e8150bee-8cc8-11ed-bfe3-dac502259ad0.png

兩個(gè)interface class,PutImp, GetImp 分別包含純虛方法put, get的原型。class Fifo 和 class Stack 使用關(guān)鍵詞 implementes來實(shí)現(xiàn)這兩個(gè)interface class中的純虛方法。

class Fifo and class Stack share common behaviors without sharing a common implementation.

classs Fifo 和 class Stack 都有 put, get的操作,但是實(shí)現(xiàn)的具體方式不同(FIFO:先進(jìn)后出,Stack:先進(jìn)先出)。這就體現(xiàn)了“抽象”的含義,interface僅僅暴露出的是common behavirs,調(diào)用人員不需要關(guān)心具體的實(shí)現(xiàn)。

實(shí)際上,如果上升一個(gè)思考層面的話,抽象及其前面講到的封裝都是人類處理復(fù)雜性的有效手段。在面對(duì)復(fù)雜系統(tǒng)的時(shí)候,人腦能承受的信息復(fù)雜程度是有限的,所以我們必須忽略掉一些非關(guān)鍵性的實(shí)現(xiàn)細(xì)節(jié)。而抽象作為一種只關(guān)注功能點(diǎn)不關(guān)注實(shí)現(xiàn)的設(shè)計(jì)思路,正好幫我們的大腦過濾掉許多非必要的信息。

可能因?yàn)閕ntreface class這一語法加入SV較晚,并且EDA工具支持有一定延遲,在UVM源碼中,并沒有使用 interface class這一語法。但抽象僅僅是一個(gè)非常通用的設(shè)計(jì)思想, 比如一個(gè)上報(bào)錯(cuò)誤的function, 命名為report_error()就比命名為report_size_mismatch_error()抽象,具體的錯(cuò)誤類型,不必體現(xiàn)在函數(shù)命名上。( 2016 DVCon US : SystemVerilog Interface Classes - More Useful Than You Thought 涉及 interface classes 在實(shí)際項(xiàng)目中的使用)

在SV沒有加入接口類(intreface class)之前,也有抽象類(virtual class)可以代替抽象的特性。

抽象類不能直接例化,一個(gè)由抽象類擴(kuò)展而來的類只有在所有虛方法都有實(shí)體的時(shí)候才能被例化。抽象類中可以定義非純虛方法,但是接口類不行。

接口類的一些特性,抽象類并不具備。比如一個(gè)類可以實(shí)現(xiàn)多個(gè)接口類,并同時(shí)繼承某一個(gè)類。比如下面這個(gè)用例。

e8383100-8cc8-11ed-bfe3-dac502259ad0.png

extends 和 implements還是有本質(zhì)區(qū)別的,extends繼承,是 is-a的關(guān)系,而implements更像是has-a的關(guān)系。所以SV中加入interface class,使其更接近高級(jí)語言所具備的特性。

抽象類和接口類如何選擇呢?抽象類是is-a的關(guān)系,解決代碼復(fù)用問題,接口類是has-a的關(guān)系,更側(cè)重于解耦,隔離接口和具體的實(shí)現(xiàn),提高代碼的擴(kuò)展性。

基于接口而非實(shí)現(xiàn)編程(Program to an interface, not an implementation),將接口(interface)和實(shí)現(xiàn)(implements)相分離,封裝不穩(wěn)定的實(shí)現(xiàn),暴露穩(wěn)定的接口。

上游系統(tǒng)面向接口而非實(shí)現(xiàn)編程,不依賴不穩(wěn)定的實(shí)現(xiàn)細(xì)節(jié),這樣當(dāng)實(shí)現(xiàn)發(fā)生變化的時(shí)候,上游系統(tǒng)的代碼基本上不需要做改動(dòng),以此來降低耦合性,提高擴(kuò)展性。

UVM驗(yàn)證平臺(tái),已規(guī)定好了hierarchy結(jié)構(gòu)和各component功能,驗(yàn)證工程師只需根據(jù)實(shí)際業(yè)務(wù)“填充”具體內(nèi)容,屬于硬件驗(yàn)證,而純軟件要實(shí)現(xiàn)多交互的復(fù)雜業(yè)務(wù)側(cè)重設(shè)計(jì),所以一般工作中沒有需求用到抽象類和接口類。對(duì)于沒有使用UVM方法學(xué),自己寫Systemverilog搭建的驗(yàn)證平臺(tái), 接口類,抽象類,純虛方法可以建立具有統(tǒng)一觀感的測試平臺(tái),這就使任何一個(gè)工程師都可以讀懂你的代碼并且快速理解其結(jié)構(gòu)。

繼承(Inheritance)

繼承是用來表示類之間的 is-a 關(guān)系,比如狗是一種哺乳動(dòng)物??梢酝ㄟ^extends 關(guān)鍵字來實(shí)現(xiàn)繼承(可以通過繼承+參數(shù)化的類來實(shí)現(xiàn)多繼承的效果,有點(diǎn)非常規(guī)操作,參考SystemVerilog: Reusable Class Features and Safe Initialization of Static Variables。另外interface class也可以實(shí)現(xiàn)多繼承),C++和Python既支持單重繼承,也支持多重繼承。

在構(gòu)造用例時(shí),一般會(huì)創(chuàng)建一個(gè)base_class作為父類,子類extends繼承父類的特性,使用super關(guān)鍵字指示編譯器來顯式的引用父類中定義的數(shù)據(jù)成員和方法。

SV語法規(guī)定父類的new()函數(shù)(構(gòu)造函數(shù)),子類必須顯示調(diào)用,寫出super.new()。如果父類new()函數(shù)有參數(shù),子類也需要傳入?yún)?shù)。不管子類是否重載new()函數(shù),都要顯式調(diào)用父類的構(gòu)造函數(shù)。

在實(shí)際驗(yàn)證工作中,一般不會(huì)出現(xiàn)下述問題,基本繼承2次就足以覆蓋大部分需求了,但是純軟件編程可能會(huì)因?yàn)闃I(yè)務(wù)復(fù)雜,導(dǎo)致繼承過度,采用 “多用組合少用繼承” 是一個(gè)規(guī)避辦法。

繼承的概念很好理解,也很容易使用。不過,過度使用繼承,繼承層次過深過復(fù)雜,就會(huì)導(dǎo)致代碼可讀性、可維護(hù)性變差。為了了解一個(gè)類的功能,我們不僅需要查看這個(gè)類的代碼,還需要按照繼承關(guān)系一層一層地往上查看“父類、父類的父類……”的代碼。還有,子類和父類高度耦合,修改父類的代碼,會(huì)直接影響到子類。

在SV使用中,我們也會(huì)遇到合成和繼承的選擇問題,合成使用了“有”(has-a)的關(guān)系,繼承使用了“是”(is-a)的關(guān)系。

e86281a8-8cc8-11ed-bfe3-dac502259ad0.png

SV構(gòu)建測試平臺(tái)并非標(biāo)準(zhǔn)的軟件開發(fā)項(xiàng)目,除了繼承與合成之外,根據(jù)現(xiàn)實(shí)的場景使用,把所用變量集成在一個(gè)類中,通過條件約束達(dá)到目的。Constraint-driven 的策略更有利于我們的驗(yàn)證工作。

如下示例:(Systemverilog驗(yàn)證 測試平臺(tái)編寫指南 8.4

e8832994-8cc8-11ed-bfe3-dac502259ad0.png

多態(tài)(Polymorphism)

多態(tài)是指,子類可以替換父類,父類句柄可以指向子類的實(shí)例。(子類句柄不可以指向父類的實(shí)例,因?yàn)樽宇愓{(diào)用的方法,父類實(shí)例中或許并不存在)

多態(tài)的例子這里就不再列舉了,建議學(xué)習(xí)《The UVM Primer》,這是一本很好學(xué)習(xí)OOP的書籍,足以應(yīng)對(duì)工作中的絕大部分內(nèi)容。

當(dāng)父類句柄指向子類的實(shí)例時(shí),通過父類句柄調(diào)用方法,如果方法使用virtual修飾,則會(huì)動(dòng)態(tài)的調(diào)用子類的方法(雖然是父類句柄,但是實(shí)例是子類,實(shí)際調(diào)用子類override(重寫or覆蓋)的方法)。如果方法沒有使用virtual修飾,則是靜態(tài)的根據(jù)句柄調(diào)用方法(動(dòng)態(tài):實(shí)例 靜態(tài):句柄)。

父類的task/function已經(jīng)用virtual修飾,子類沒有必要在加上virtual了。

所以多態(tài)的實(shí)現(xiàn)要依賴虛函數(shù)virtual,總結(jié)就是“繼承加方法重寫 ”。

SV語法目前還不支持overload(重載),override指的是重寫,也可以理解成覆蓋,一般不做詳細(xì)區(qū)分。

對(duì)于多態(tài)的底層實(shí)現(xiàn)及virtual, function override,$cast()轉(zhuǎn)化的底層原理,需要深入研究編程語言的編譯原理。檢索并沒有介紹Systemverilog的相關(guān)文章,可以通過學(xué)習(xí)C++或者Jave擴(kuò)充學(xué)習(xí),檢索內(nèi)存模型或者對(duì)象模型獲取相關(guān)知識(shí)。

除了上述“繼承加方法重寫”實(shí)現(xiàn)多態(tài)的方法,Systemverilog也可以采用之前介紹的 interface class實(shí)現(xiàn)多態(tài)。還有一種是利用 duck-typing 語法,SV并不支持,動(dòng)態(tài)語言Python才支持。

實(shí)例如下:

class Logger:
    def record(self):
        print(“I write a log into file.”)
        
class DB:
    def record(self):
        print(“I insert data into db. ”)
        
def test(recorder):
    recorder.record()

def demo():
    logger = Logger()
    db = DB()
    test(logger)
    test(db)

設(shè)計(jì)模式之美 從這段代碼中,我們發(fā)現(xiàn),duck-typing 實(shí)現(xiàn)多態(tài)的方式非常靈活。Logger 和 DB 兩個(gè)類沒有任何關(guān)系,既不是繼承關(guān)系,也不是接口和實(shí)現(xiàn)的關(guān)系,但是只要它們都有定義了 record() 方法,就可以被傳遞到 test() 方法中,在實(shí)際運(yùn)行的時(shí)候,執(zhí)行對(duì)應(yīng)的 record() 方法。

設(shè)計(jì)原則

純軟件設(shè)計(jì)中的設(shè)計(jì)原則,對(duì)于IC的驗(yàn)證和設(shè)計(jì)工作也有指導(dǎo)意義,我們?nèi)粘9ぷ髦械囊恍傲?xí)慣”,可能就是在踐行某一個(gè)設(shè)計(jì)原則。依次列舉如下:

單一職責(zé)原則

一個(gè)類只負(fù)責(zé)一個(gè)功能,避免設(shè)計(jì)大而全的類,避免不相關(guān)的功能耦合,提高內(nèi)聚性。也可以延申到驗(yàn)證的測試用例,每個(gè)用例應(yīng)該對(duì)應(yīng)一個(gè)場景或者功能。

開閉原則

對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。對(duì)于新加的功能,應(yīng)在已有代碼基礎(chǔ)上擴(kuò)展,而非修改已有代碼。所以在最初代碼編寫時(shí),就應(yīng)該充分考慮可擴(kuò)展性,當(dāng)然也不是完全杜絕修改,要把握“粗細(xì)粒度”。對(duì)于已經(jīng)充分驗(yàn)證的rtl模塊,側(cè)重在原來基礎(chǔ)上新加功能,而不是“大修”原來的模塊,容易引入bug, 相應(yīng)的測試用例也可以做到最小修改。

里式替換原則

子類對(duì)象可以替換程序中出現(xiàn)的父類對(duì)象,并保證原來程序的邏輯行為的正確性。這一原則跟多態(tài)比較像,側(cè)重于繼承關(guān)系中子類該如何設(shè)計(jì)。

接口隔離原則

接口的調(diào)用者不應(yīng)該強(qiáng)迫依賴ta不需要的接口。如果B模塊內(nèi)包含B-1,B-2兩個(gè)模塊,A模塊的正常工作依賴于B-1模塊的初始配置,C模塊的正常工作依賴于B-2模塊的初始配置。B模塊的驗(yàn)證人員可以將B模塊的初始配置流程寫到一個(gè)函數(shù)中,這個(gè)函數(shù)供A,C模塊的驗(yàn)證人員調(diào)用,這個(gè)函數(shù)就像API接口一樣,調(diào)用者只負(fù)責(zé)調(diào)用,不用關(guān)心具體實(shí)現(xiàn)。如果B模塊的函數(shù)同時(shí)包含B-1,B-2的初始配置,A模塊的驗(yàn)證人員調(diào)用,雖然不會(huì)影響功能驗(yàn)證,但是B-2模塊與A模塊并無聯(lián)系,恰當(dāng)?shù)淖龇☉?yīng)該是將B-1,B-2模塊的初始配置隔離開來,供使用者按需調(diào)用。

依賴倒置原則

程序要依賴于抽象接口,不要依賴于具體實(shí)現(xiàn)。簡單的說就是要求對(duì)抽象進(jìn)行編程,不要對(duì)實(shí)現(xiàn)進(jìn)行編程,這樣就降低了客戶與實(shí)現(xiàn)模塊間的耦合。高層次的模塊不應(yīng)該依賴于低層次的模塊,他們都應(yīng)該依賴于抽象。和依賴接口編程的含義相近。

KISS、YANGI ,DRY原則

KISS: Keep It Stupid Simple 不要使用同事不懂的技術(shù);不要重復(fù)造輪子,使用現(xiàn)有的方法;不要過度優(yōu)化;

YANGI: You Ain't Gonna Need It 不要過度設(shè)計(jì)

DRT: Don't repeat yourself 減少重復(fù)的代碼。對(duì)于重復(fù)的代碼,思考是否可以通過封裝到函數(shù)中,通過傳參的方式實(shí)現(xiàn)。

迪米特法則

Talk only to your immediate friends and not to strangers,只與你的直接朋友交談,不跟“陌生人”說話。

如果兩個(gè)模塊實(shí)體無須直接通信,那么就不應(yīng)當(dāng)發(fā)生直接的相互調(diào)用,可以通過第三方轉(zhuǎn)發(fā)該調(diào)用。其目的是降低類之間的耦合度,提高模塊的相對(duì)獨(dú)立性。“高內(nèi)聚,松耦合”

規(guī)范與重構(gòu)

代碼風(fēng)格與規(guī)范:Easier UVM Coding Guidelines

代碼測試:SV單元測試方法SVUnit SVUnit Download SVUnit blog

SVUnit采用了一種特別的方式來生成task。一般task負(fù)責(zé)時(shí)序相關(guān)的驅(qū)動(dòng)和采樣,開發(fā)者根據(jù)設(shè)計(jì)文檔中的時(shí)序圖編寫task代碼,但是代碼的準(zhǔn)確性有待驗(yàn)證。SVUnit從另一個(gè)思路出發(fā),直接通過時(shí)序圖,來生成對(duì)應(yīng)task。這樣便保證了task中時(shí)序的準(zhǔn)確性,畢竟時(shí)序圖要是都錯(cuò)了,那只能通過review發(fā)現(xiàn)了。

SVUnit將時(shí)序圖轉(zhuǎn)化成task的方法,是通過編寫wavdrom可識(shí)別的json格式(有固定格式,但是很容易上手,支持網(wǎng)頁,linux, window平臺(tái)。UserGuide). 然后調(diào)用SVUnit中的腳本wavedromSVUnit.py解析json文件,生成時(shí)序圖對(duì)應(yīng)的代碼。SVUnit對(duì)json文件做了額外描述,可以參照 test/wavedrom_0/1下面的json文件深入理解。

示例:

json描述:

{
  "name": "read",
  "signal": [
    {"name": "clk",     "wave": "p|...|."  , "node": ".ab...d"},
    {"name": "psel",    "wave": "0.1...0"   },  
    {"name": "penable", "wave": "0..1..0"   },  
    {"name": "paddr",   "wave": "x.=...x"  , "data": ["addr"] },
    {"name": "pready",  "wave": "0....10"  , "input": "True", "node": "......c"},
    {"name": "prdata",  "wave": "x....=x"  , "output": "True", "data": ["data"] }
  ],  
  "input": [
    {"name": "addr", "type": "logic [7:0]"}
  ],
  "output": [
    {"name": "data", "type": "logic [31:0]"}
  ],  
  "edge": ["a~>b 8,12", "c->d pready==1"],
  config: { hscale: 3 }
}

waverom生成的時(shí)序圖:

e8a5d872-8cc8-11ed-bfe3-dac502259ad0.png

自動(dòng)生成的task:

e8c47e80-8cc8-11ed-bfe3-dac502259ad0.png

這種方式的限制就是僅適用于直接測試用例。

絕大部分驗(yàn)證人員開發(fā)UVC,都是一遍debug DUT, 一遍調(diào)試驗(yàn)證平臺(tái),并不會(huì)專門使用SVUnit對(duì)UVC進(jìn)行驗(yàn)證。但是對(duì)于sv庫的開發(fā),使用SVUnit是一個(gè)很好的選擇。

不過仍建議在monitor, driver開發(fā)初期,同時(shí)RTL還沒有ready的情況下,使用SVUnit將波形轉(zhuǎn)化成直接的時(shí)序激勵(lì),做一些直接用例的測試,及早發(fā)現(xiàn)問題。如果設(shè)計(jì)文檔中的波形也是使用wavedrom繪制的,那么對(duì)于驗(yàn)證人員的工作又省了一步,可以直接拿設(shè)計(jì)人員波形的json文件生成用例。

重構(gòu):隨著項(xiàng)目的推進(jìn),迭代,原來的代碼也會(huì)慢慢變“差”,重構(gòu)可能是一條"挽回“路徑。在項(xiàng)目初期,盡可能地劃分好驗(yàn)證平臺(tái)的組件,目錄,文件調(diào)用,宏定義,腳本等,重構(gòu)的同時(shí)也在引入不確定性。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19167
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40121

原文標(biāo)題:UVM設(shè)計(jì)模式:OOP特性、設(shè)計(jì)原則、規(guī)范與單元測試

文章出處:【微信號(hào):IP與SoC設(shè)計(jì),微信公眾號(hào):IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式系統(tǒng)開發(fā)中的測試方法 嵌入式系統(tǒng)開發(fā)與AI結(jié)合應(yīng)用

    嵌入式系統(tǒng)開發(fā)中的測試方法 嵌入式系統(tǒng)開發(fā)是一個(gè)復(fù)雜的過程,涉及到硬件和軟件的緊密結(jié)合。測試是確保系統(tǒng)可靠性和性能的關(guān)鍵步驟。以下是一些常用的測試方法: 單元測試
    的頭像 發(fā)表于 12-09 10:22 ?310次閱讀

    開發(fā)者必讀!CircleCI?組件測試單元測試全解析

    在軟件開發(fā)中,測試是保證軟件質(zhì)量和可靠性的關(guān)鍵環(huán)節(jié)。作為領(lǐng)先的 CI/CD 平臺(tái),CircleCI 提供了支持自動(dòng)化測試的強(qiáng)大工具。其中,單元測試和組件測試是兩種重要的
    的頭像 發(fā)表于 12-03 09:18 ?194次閱讀

    汽車軟件單元測試的重要性

    測試不充分密切相關(guān),這引發(fā)了社會(huì)各界對(duì)汽車軟件健壯性的重要性進(jìn)行深入思考。本文將探討汽車軟件的測試,尤其是單元測試的重要性,以及WinAMS單元測試工具在這一過程中的關(guān)鍵作用。 一、
    的頭像 發(fā)表于 11-29 10:57 ?153次閱讀

    嚴(yán)格的單元測試造就完美的軟件

    關(guān)鍵系統(tǒng)時(shí),更是對(duì)軟件質(zhì)量提出了極高的要求。而單元測試作為軟件開發(fā)過程中的核心環(huán)節(jié),其重要性不言而喻。 單元測試的作用 單元測試是指對(duì)軟件中的最小可測試
    的頭像 發(fā)表于 11-26 13:22 ?163次閱讀

    嵌入軟件單元/集成測試工具專業(yè)分析

    引言 在現(xiàn)代軟件開發(fā)過程中,單元測試作為確保代碼質(zhì)量的重要環(huán)節(jié),得到了廣泛的關(guān)注和應(yīng)用。隨著嵌入式系統(tǒng)的復(fù)雜性日益增加,對(duì)高效、可靠的單元測試工具的需求也愈加迫切。WinAMS作為一款專為嵌入
    的頭像 發(fā)表于 11-19 16:41 ?219次閱讀

    鴻蒙語言基礎(chǔ)類庫:ohos.application.testRunner TestRunner 測試

    TestRunner模塊提供了框架測試的能力。包括準(zhǔn)備單元測試環(huán)境、運(yùn)行測試用例。
    的頭像 發(fā)表于 07-12 09:32 ?294次閱讀

    單元測試、集成測試自動(dòng)化工具

    CoverageMaster winAMS :?適用于嵌入式目標(biāo)機(jī)代碼的單元測試/集成測試工具 全面支持嵌入式微機(jī)!驗(yàn)證嵌入式C/C++軟件 實(shí)施以模塊為單位的自動(dòng)化單元測試工具 不需要
    的頭像 發(fā)表于 06-26 13:41 ?438次閱讀
    <b class='flag-5'>單元測試</b>、集成<b class='flag-5'>測試</b>自動(dòng)化工具

    接口測試的工具有哪些種類

    單元測試框架 單元測試框架主要用于測試單個(gè)模塊或函數(shù)的功能。雖然它們主要用于開發(fā)階段,但也可以用于接口測試。 1.1 JUnit (Java) JUnit 是 Java 語言的
    的頭像 發(fā)表于 05-30 15:07 ?699次閱讀

    嵌入軟件單元測試工具的作用

    嵌入軟件單元測試工具是現(xiàn)代軟件開發(fā)過程中不可或缺的一環(huán)。它的作用在于幫助開發(fā)人員對(duì)軟件中的各個(gè)單元進(jìn)行測試,以確保其功能的正確性和穩(wěn)定性。單元測試是軟件開發(fā)過程中的一種
    的頭像 發(fā)表于 04-23 15:31 ?428次閱讀
    嵌入軟件<b class='flag-5'>單元測試</b>工具的作用

    LitePoint推出其最新的5G O-RAN無線電單元測試技術(shù)

    無線測試解決方案先進(jìn)供應(yīng)商LitePoint宣布將參加于4月12日在臺(tái)北舉行的2024年D Forum移動(dòng)通信論壇,展示其最新的5G O-RAN無線電單元測試技術(shù)。
    的頭像 發(fā)表于 04-11 15:26 ?497次閱讀

    uvm1.1升級(jí)為uvm1.2 uvm_report_server報(bào)錯(cuò)是何原因?

    ISP算法仿真中,小編會(huì)用reference model調(diào)用DPI接口用C++ 算法實(shí)現(xiàn)pixel算法處理,然后和DUT算法處理輸出的pixel值進(jìn)行比較,比較時(shí)候發(fā)現(xiàn)報(bào)錯(cuò),報(bào)錯(cuò)代碼如下,原因是小編把uvm1.1升級(jí)為uvm1.2了。
    的頭像 發(fā)表于 03-04 14:18 ?801次閱讀
    <b class='flag-5'>uvm</b>1.1升級(jí)為<b class='flag-5'>uvm</b>1.2 <b class='flag-5'>uvm</b>_report_server報(bào)錯(cuò)是何原因?

    單元/集成測試服務(wù)

    單元/集成測試旨在證明被測軟件實(shí)現(xiàn)其單元/架構(gòu)設(shè)計(jì)規(guī)范、證明被測軟件不包含非預(yù)期功能。經(jīng)緯恒潤測試團(tuán)隊(duì)擁有豐富的研發(fā)經(jīng)驗(yàn)、嚴(yán)格的流程管控,依
    的頭像 發(fā)表于 02-29 13:27 ?376次閱讀
    <b class='flag-5'>單元</b>/集成<b class='flag-5'>測試</b>服務(wù)

    UVM手把手教程系列(二)Phase機(jī)制簡單介紹

    UVM中的phase,按照其是否消耗仿真時(shí)間($time打印出的時(shí)間)的特性,可以分成兩大類
    的頭像 發(fā)表于 02-29 09:26 ?1384次閱讀
    <b class='flag-5'>UVM</b>手把手教程系列(二)Phase機(jī)制簡單介紹

    Tessy—嵌入式軟件單元測試/集成測試工具

    搭建測試環(huán)境、執(zhí)行測試、評(píng)估測試結(jié)果并生成測試報(bào)告。目前Tessy被廣泛應(yīng)用在汽車電子客戶中,在V模型開發(fā)中,Tessy主要應(yīng)用在單元測試
    的頭像 發(fā)表于 01-15 14:39 ?816次閱讀
    Tessy—嵌入式軟件<b class='flag-5'>單元測試</b>/集成<b class='flag-5'>測試</b>工具
    RM新时代网站-首页