加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 1、状态模式
    • 2、参考代码
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

设计模式在芯片验证中的应用——状态

08/19 10:50
578
阅读需 9 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1、状态模式

状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。

在RTL中可能存在复杂的有限状态机FSM,在任何一个特定状态中, RTL的行为都不相同, 且可从一个状态切换到另一个状态。不过, 根据当前状态, RTL可能会切换到另外一种状态, 也可能会保持当前状态不变。这些数量有限且预先定义的状态切换规则被称为转移。

为了对RTL FSM进行建模,状态设计模式建议将每个状态的行为抽象成一个类,状态之间的切换相当于就是类对象的切换。主要可包括以下几个组件:

Context:它并不会自行实现所有行为, 而是会保存一个指向表示当前状态的状态对象的引用, 且将所有与状态相关的工作委派给该对象。

State:所有状态类的基类,所有状态类都必须遵循同样的接口, 而且context必须仅通过state提供的接口函数与这些对象进行交互。

Concrete States:会自行实现特定于状态的方法。为了避免多个状态中包含相似代码, 你可以提供一个封装有部分通用行为的中间抽象类。状态对象可存储对于上下文对象的反向引用。状态可以通过该引用从上下文处获取所需信息, 并且能触发状态转移。

下图为状态设计模式在FSM中应用的一个UML类图。

2、参考代码

状态设计模式的参考代码如下:

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
DS18B20-SL+T&R 1 Maxim Integrated Products Serial Switch/Digital Sensor, 12 Bit(s), 0.50Cel, Rectangular, 3 Pin, Through Hole Mount, LEAD FREE, TO-92, 3 PIN
$24.26 查看
AD592CNZ 1 Analog Devices Inc Current Output - Precision IC Temperature Transducer

ECAD模型

下载ECAD模型
$41.4 查看
LM35DT/NOPB 1 Texas Instruments 1C high voltage analog temperature sensor, 10 mV/C 3-TO-220 0 to 100
$2.21 查看

相关推荐

电子产业图谱

分享Arm architecture, AMBA, 芯片验证, 脚本, EDA, Linux等知识。

微信公众号