• 正文
    • 1、狀態(tài)模式
    • 2、參考代碼
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

設(shè)計模式在芯片驗證中的應(yīng)用——狀態(tài)

2024/08/19
1029
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

1、狀態(tài)模式

狀態(tài)模式是一種行為設(shè)計模式, 讓你能在一個對象的內(nèi)部狀態(tài)變化時改變其行為, 使其看上去就像改變了自身所屬的類一樣。

在RTL中可能存在復(fù)雜的有限狀態(tài)機FSM,在任何一個特定狀態(tài)中, RTL的行為都不相同, 且可從一個狀態(tài)切換到另一個狀態(tài)。不過, 根據(jù)當前狀態(tài), RTL可能會切換到另外一種狀態(tài), 也可能會保持當前狀態(tài)不變。這些數(shù)量有限且預(yù)先定義的狀態(tài)切換規(guī)則被稱為轉(zhuǎn)移。

為了對RTL FSM進行建模,狀態(tài)設(shè)計模式建議將每個狀態(tài)的行為抽象成一個類,狀態(tài)之間的切換相當于就是類對象的切換。主要可包括以下幾個組件:

Context:它并不會自行實現(xiàn)所有行為, 而是會保存一個指向表示當前狀態(tài)的狀態(tài)對象的引用, 且將所有與狀態(tài)相關(guān)的工作委派給該對象。

State:所有狀態(tài)類的基類,所有狀態(tài)類都必須遵循同樣的接口, 而且context必須僅通過state提供的接口函數(shù)與這些對象進行交互。

Concrete States:會自行實現(xiàn)特定于狀態(tài)的方法。為了避免多個狀態(tài)中包含相似代碼, 你可以提供一個封裝有部分通用行為的中間抽象類。狀態(tài)對象可存儲對于上下文對象的反向引用。狀態(tài)可以通過該引用從上下文處獲取所需信息, 并且能觸發(fā)狀態(tài)轉(zhuǎn)移。

下圖為狀態(tài)設(shè)計模式在FSM中應(yīng)用的一個UML類圖。

2、參考代碼

狀態(tài)設(shè)計模式的參考代碼如下:

typedef class fsm_context;typedef class concrete_state1;typedef class concrete_state2;
virtual class state;??? pure virtual function int process1(fsm_context cnxt);??? pure virtual function int process2(fsm_context cnxt);endclass : state
class concrete_state1 extends state;??? function int process1(fsm_context cnxt);??????? $display("concrete_state1 : process1");??????? if ( cnxt.change_state ) begin??????????? concrete_state2 state2 = new();??????????? $display("concrete_state1 change to concrete_state2");??????????? cnxt.st = state2;??????? end??? endfunction : process1
??? function int process2(fsm_context cnxt);??????? $display("concrete_state1 : process2");??????? if ( cnxt.change_state ) begin??????????? concrete_state2 state2 = new();??????????? $display("concrete_state1 change to concrete_state2");??????????? cnxt.st = state2;??????? end??? endfunction : process2
endclass : concrete_state1
class concrete_state2 extends state;??? function int process1(fsm_context cnxt);??????? $display("concrete_state2 : process1");??????? if ( cnxt.change_state ) begin??????????? concrete_state1 state1 = new();??????????? $display("concrete_state2 change to concrete_state1");??????????? cnxt.st = state1;??????? end??? endfunction : process1
??? function int process2(fsm_context cnxt);??????? $display("concrete_state2 : process2");??????? if ( cnxt.change_state ) begin??????????? concrete_state1 state1 = new();??????????? $display("concrete_state2 change to concrete_state1");??????????? cnxt.st = state1;??????? end??? endfunction : process2
endclass : concrete_state2


class fsm_context;
??? state st;
??? function bit change_state();??????? return 1; // for simplicity??? endfunction : change_state
??? function void process_req1 (/*interface signals*/);??????? st.process1(this /*, interface signals*/);??? endfunction : process_req1
??? function void process_req2 (/*interface signals*/);??????? st.process2(this /*, interface signals*/);??? endfunction : process_req2
endclass : fsm_context

?模擬測試代碼如下:

fsm_context fsm_st = new();fsm_st.st = concrete_state1::new();fsm_st.process_req1();fsm_st.process_req2();

使用Questasim仿真輸出日志如下:

 | # concrete_state1 : process1?| # concrete_state1 change to concrete_state2?| # concrete_state2 : process2?| # concrete_state2 change to concrete_state1

?

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
MT9P031I12STM-DP 1 onsemi CMOS Image Sensor, 5 MP, 1/3", 2400-JTRAY
$29.54 查看
ACS711KLCTR-25AB-T 1 Allegro MicroSystems LLC Hall Effect Sensor, Rectangular, Surface Mount, ROHS COMPLIANT, MS-012AA, SOIC-8

ECAD模型

下載ECAD模型
$3.27 查看
TLE5309DE1211XUMA1 1 Infineon Technologies AG Analog Circuit,
$10.92 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄