單例模式
單例模式(Singleton)是一種創(chuàng)建型設(shè)計(jì)模式,能夠保證一個(gè)類只有一個(gè)實(shí)例, 并提供一個(gè)訪問(wèn)該實(shí)例的全局節(jié)點(diǎn)。驗(yàn)證環(huán)境配置(configuration)類、超時(shí)(timeout)處理類等可以使用單例實(shí)現(xiàn)。比如說(shuō)驗(yàn)證環(huán)境需要在特定場(chǎng)景中監(jiān)測(cè)特定接口上的超時(shí)事件,環(huán)境的每個(gè)組件都可以依賴超時(shí)處理類來(lái)設(shè)定超時(shí)的時(shí)刻。讓所有組件都使用超時(shí)處理類的相同對(duì)象有助于調(diào)試。
單例模式主要包括以下兩個(gè)組件:
單例類(Singleton class):該類只能創(chuàng)建有限數(shù)量的對(duì)象,通常是一個(gè)對(duì)象。為了實(shí)現(xiàn)這一點(diǎn),類的構(gòu)造函數(shù)被定義為protected。使用靜態(tài)instance()方法訪問(wèn)對(duì)象,該方法在第一次調(diào)用時(shí)執(zhí)行初始化,后面直接返回這個(gè)類的句柄。
客戶端(Client):任何UVM組件都可以使用單例類的instance()方法來(lái)訪問(wèn)類對(duì)象。
下圖為單例設(shè)計(jì)模式在timeout處理中應(yīng)用的UML類圖。
參考代碼
單例設(shè)計(jì)模式用于timeout處理的參考代碼如下:
class timeout;
local static timeout m_inst = null;
protected function new();
endfunction : new
static function timeout get_inst();
if ( m_inst == null )
m_inst = new();
return m_inst;
endfunction : get_inst
task wait_timeout(int unsigned timeout_value);
#(timeout_value*1ns);
endtask : wait_timeout
endclass : timeout
測(cè)試代碼如下:
timeout inst = timeout::get_inst();
fork
begin
`uvm_info("START TIMEOUT COUNT 1", "", UVM_NONE)
inst.wait_timeout(500);
`uvm_info("END TIMEOUT COUNT 1", "", UVM_NONE)
end
begin
`uvm_info("START TIMEOUT COUNT 2", "", UVM_NONE)
inst.wait_timeout(1000);
`uvm_info("END TIMEOUT COUNT 2", "", UVM_NONE)
end
join_none
仿真日志如下:
@ 0.000ns: [START TIMEOUT COUNT 1]
@ 0.000ns: [START TIMEOUT COUNT 2]
@ 500.000ns: [END TIMEOUT COUNT 1]
@?1000.000ns:?[END?TIMEOUT?COUNT?2]
根據(jù)仿真結(jié)果,timeout處理類能夠同時(shí)跟蹤多個(gè)超時(shí)事件,在第一個(gè)超時(shí)(time = 500ns)和第二個(gè)超時(shí)(time = 1000ns)時(shí)發(fā)出超時(shí)信號(hào)。
微信號(hào)|c(diǎn)hip_yes,微信公眾號(hào)|專芯致志er