加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 01、模板模式
    • 02、參考代碼
  • 推薦器件
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

設計模式在芯片驗證中的應用——模板方法

05/28 11:50
1465
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

01、模板模式

模板方法(Template Method)模式是一種行為設計模式, 它在父類中定義了一個功能的框架, 允許子類在不修改結構的情況下重寫功能的特定步驟。也就是模板方法定義了一組有序執(zhí)行的操作,將一些步驟的實現(xiàn)留給子類,同時保持整體功能結構。該技術通常也用于為主要操作提供預處理和后處理的鉤子(hook)。

UVM庫用了很多模板方法,比如uvm_sequence里的pre_body()和post_body()就是body()方法的鉤子,在分別允許用戶在body()執(zhí)行之前和之后做一些其它處理。

模板方法設計模式主要包括以下幾個組件:

抽象類 (Abstract-Class):會聲明完成一個功能所需各個步驟的方法, 以及依次調用它們實際步驟。功能步驟可以被聲明為抽象類型, 也可以提供一些默認實現(xiàn)。另外也可以提供一些放在主要功能步驟之前或之后的可選步驟方法(鉤子),這些方法為子類提供額外的功能擴展點。

具體類 (Concrete-Class):可以重寫所有步驟實現(xiàn), 但不能重寫模板方法自身執(zhí)行各個步驟方法的順序。

我們以UVM中的monitor來舉個模板方法應用的例子,利用模板方法可以擴展monitor主要功能,而且不容易誤破壞monitor主功能。在base monitor組件中定義了非virtual的collect_transactions()模板方法,并提供了空的pre_collect()和post_ collect ()鉤子方法。在繼承的子monitor中,通過實現(xiàn)pre_ collect ()和post_ collect ()的具體內容,來提供了特定項目需求的操作。然后使用UVM factory方法將子monitor的對象去替換base monitor的對象。

下圖為模板方法設計模式在monitor中應用的UML類圖。

02、參考代碼

monitor的模板方法設計模式參考代碼如下:

class base_monitor extends uvm_monitor;
    `uvm_component_utils (base_monitor)    ????function?new(string?name?=?"base_monitor",?uvm_component?parent=null);        super.new(name, parent);    endfunction : new        task collect_transactions();        pre_collect();        collect();        post_collect();    endtask : collect_transactions
    virtual task pre_collect();        `uvm_info("PRE_COLLECT", "EMPTY method", UVM_LOW)    endtask : pre_collect
    task collect();        `uvm_info("COLLECT", "collect begin", UVM_LOW)        `uvm_info("COLLECT", "collect end", UVM_LOW)    endtask : collect
    virtual task post_collect();        `uvm_info("POST_COLLECT", "EMPTY method", UVM_LOW)    endtask : post_collect    endclass?:?base_monitor

模板方法設計模式-具有空鉤子的base monitor

class son_monitor extends base_monitor;
    `uvm_component_utils (son_monitor)    ????function?new(string?name?=?"son_monitor",?uvm_component?parent=null);        super.new(name, parent);    endfunction : new        virtual task pre_collect();        `uvm_info("PRE_COLLECT", "PRE: collect item", UVM_LOW)    endtask : pre_collect        virtual task post_collect();        `uvm_info("POST_COLLECT", "POST: collect item", UVM_LOW)    endtask : post_collect    endclass?:?son_monitor

模板方法設計模式-帶有實現(xiàn)鉤子的son monitor

模擬測試代碼如下:

// Use UVM factory overrde in the uvm_envset_type_override_by_type(base_monitor::get_type(),?son_monitor::get_type(),?'b0);

輸出仿真日志如下:

 | # UVM_INFO  @ 0.000ns: uvm_test_top.env.agent.mon_h [PRE_COLLECT] EMPTY method?|?#?UVM_INFO??@?0.000ns:?uvm_test_top.env.agent.mon_h?[COLLECT]?collect?begin | # UVM_INFO  @ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect end?|?#?UVM_INFO??@?0.000ns:?uvm_test_top.env.agent.mon_h?[POST_COLLECT]?EMPTY?method

模板方法設計模式-帶有空鉤子的base monitor的輸出結果

 | # UVM_INFO  @ 0.000ns: uvm_test_top.env.agent.mon_h [PRE_COLLECT] PRE: collect item?|?#?UVM_INFO??@?0.000ns:?uvm_test_top.env.agent.mon_h?[COLLECT]?collect?begin | # UVM_INFO  @ 0.000ns: uvm_test_top.env.agent.mon_h [COLLECT] collect end?|?#?UVM_INFO??@?0.000ns:?uvm_test_top.env.agent.mon_h?[POST_COLLECT]?POST:?collect?item

模板方法設計模式-帶有實現(xiàn)鉤子的子monitor的輸出結果

輸出仿真文件顯示了模板方法模式的效果。在前者中,消息由具有空pre_collect()和post_collect()鉤子的base monitor生成。在后一種情況下,將使用子monitor的實例,并使用已實現(xiàn)的鉤子,這些鉤子可用于特定于項目的處理,且無需修改base monitor的代碼。子monitor主要的collect()方法繼承自base monitor,因此兩種情況下保持一致。模板方法collect_transactions()確保鉤子會在主函數(shù)collect()之前和之后合適的地方被調用了。

模板方法的通常使用方式就是定義一個基本的抽象類,并且指定哪些抽象方法需要再子類中實現(xiàn)。模板方法的主要缺點就是,如果父類和子類都實現(xiàn)了復雜的功能,調試起來將非常麻煩。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
2-36154-2 1 TE Connectivity PIDG 22-16 22-18 MIL R 10;TAPE

ECAD模型

下載ECAD模型
$0.36 查看
EZADT31AAAJ 1 Panasonic Electronic Components RC Network, RC Low Pass Filter, 0.063W, 100ohm, 12V, 0.000022uF, Surface Mount, 10 Pins, CHIP
暫無數(shù)據(jù) 查看
08-52-0071 1 Molex Wire Terminal, LEAD FREE
$0.06 查看

相關推薦

電子產業(yè)圖譜

分享Arm architecture, AMBA, 芯片驗證, 腳本, EDA, Linux等知識。

微信公眾號