0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM设计模式之状态模式介绍

rfdqdzdg 来源:csdn 2023-08-22 09:14 次阅读

软件设计中,FSM(Finite-State Machine)分为3部分:状态(State),事件(Event),动作(Action)。

状态模式(State Pattern)是行为型(Behavioral)设计模式,将软件主机端的行为归类为各个状态,状态之间可以互相转化,每种状态的行为不相同;统一交给一个Context类型的模块负责调度各个状态的跳转;

硬件设计中的FSM,不仅是一种电路的描述工具,而且也是一种思想方法;数字逻辑本质上都可以归一化为FSM;RTL描述FSM可以归类为常用的几种方法,通常采用三段式的描述;

在我们的验证环境中,有时也需要一个组件专门负责FSM的建模;例如验证USB Device DUT时,验证环境需要模拟USB Host的行为;对于USB协议复杂的状态机,使用专门的FSM组件模拟,可以减少组件间的耦合;也可以将FSM组件的状态赋值到virtual interface上,通过波形协助debug;

并不是所有DUT模块中包含FSM,验证环境中就需要对应的FSM建模;RTL的硬件电路是cycle级的时序电路,采用FSM可以很好的描述算法运算;而验证环境都是事务级的基于事件的高级抽象模型,是否需要采用FSM根据验证环境而定;对于简单的设计,不需要模拟FSM;对于复杂的标准协议,VIP中都会采用FSM建模来完成,具有高内聚低耦合的好处。

Simple example

本篇对一个示例,分别使用两种方式来描述:

一个简单的FSM如下,分为4种状态;对于状态的跳转条件,本篇通过uvm_event类型的事件触发,验证环境中的实际情况可以是事件,某一个signal状态,或者if的判断等;不同状态下的Action,仅使用一句display代表,验证环境中的实际情况可以调用某一个task,对signal的驱动,或者调用其他组件的API等;仅做结构上的演示;

abca6fa2-4088-11ee-ac96-dac502259ad0.png

通过randsequence产生激励sequence,遍历状态机跳转条件;

classclient;

state_machineFSM;
uvm_event_poolevents_pool;
uvm_eventto_idle,to_state_a,to_state_b,to_state_c;

functionnew();
events_pool=uvm_event_pool::get_global_pool();
to_idle=events_pool.get("to_idle");
to_state_a=events_pool.get("to_state_a");
to_state_b=events_pool.get("to_state_b");
to_state_c=events_pool.get("to_state_c");
endfunction

taskrand_simulate();
for(inti=0;i<2;i++) begin
      bit FLAG = 0;
      randsequence (stream)

         stream : first second third last;
         first  : state_a;
         second : state_b {FLAG = 1;} | state_c;
         third  : if (FLAG ==1) state_c else state_b;
         last   : state_idle;

         state_idle: {`INTERVALTIME;to_idle.trigger();};
         state_a   : {`INTERVALTIME;to_state_a.trigger();};
         state_b   : {`INTERVALTIME;to_state_b.trigger();};
         state_c   : {`INTERVALTIME;to_state_c.trigger();};

      endsequence
      end
   endtask
 ......
 ......

use task

类state_machine包含四个状态的task;通过request_state_change函数实现状态跳转;每进入一个状态,对应一个线程,当跳出状态时,注意线程需要disable掉;

classstate_machine;

typedefenum{
IDLE,STATE_A,STATE_B,STATE_C
}state_t;

uvm_event_poolevents_pool;
uvm_eventto_idle,to_state_a,to_state_b,to_state_c;

localstate_tcur_state;

externfunctionnew();
externfunctionvoidstart();
externfunctionvoidrequest_state_change(state_tcur_state);
externtaskdo_idle();
externtaskdo_state_a();
externtaskdo_state_b();
externtaskdo_state_c();

endclass

functionstate_machine::new();
events_pool=uvm_event_pool::get_global_pool();
to_idle=events_pool.get("to_idle");
to_state_a=events_pool.get("to_state_a");
to_state_b=events_pool.get("to_state_b");
to_state_c=events_pool.get("to_state_c");
endfunction

functionvoidstate_machine::start();
cur_state=IDLE;
request_state_change(cur_state);
endfunction

functionvoidstate_machine::request_state_change(state_tcur_state);
case(cur_state)
IDLE:begin
fork
begin
$display("Enter%sstate!",cur_state.name());
do_idle();
end
join_none
return;
end
STATE_A:begin
fork
begin
$display("Enter%sstate!",cur_state.name());
do_state_a();
end
join_none
return;
end
STATE_B:begin
fork
begin
$display("Enter%sstate!",cur_state.name());
do_state_b();
end
join_none
return;
end
STATE_C:begin
fork
begin
$display("Enter%sstate!",cur_state.name());
do_state_c();
end
join_none
return;
end
default:begin
$display("Enterunknowstate!");
$finish;
end
endcase
endfunction

taskstate_machine::do_idle();
state_tcur_state;
$display("IDLE:nothingtodo!
");
fork:disable_fork
begin
to_state_a.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_A;
end
join_any
request_state_change(cur_state);
endtask

taskstate_machine::do_state_a();
state_tcur_state;
$display("STATE_A:dosomething!
");
fork:disable_fork
begin
to_state_b.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_B;
end
begin
to_state_c.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_C;
end
join_any
disablefork;
request_state_change(cur_state);
endtask

taskstate_machine::do_state_b();
state_tcur_state;
$display("STATE_B:dosomething!
");
fork:disable_fork
begin
to_state_c.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_C;
end
begin
to_idle.wait_trigger();
//$display("dosomething!
");
cur_state=IDLE;
end
join_any
disablefork;
request_state_change(cur_state);
endtask

taskstate_machine::do_state_c();
state_tcur_state;
$display("STATE_C:dosomething!
");
fork:disable_fork
begin
to_state_b.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_B;
end
begin
to_idle.wait_trigger();
//$display("dosomething!
");
cur_state=IDLE;
end
join_any
disablefork;
request_state_change(cur_state);
endtask

use Sate Pattern

采用状态模式的设计,每个状态继承于virtual class state,实现各自的do_something和request_state_change;state_machine通过宏REGISTER_STATE创建各个state实例;state_machine中forvever执行;状态模式和策略模式的实现类似,都是使用OOP的组合 + 多态实现;

abeb39b2-4088-11ee-ac96-dac502259ad0.png

virtualclassstate;

state_machineFSM;
uvm_event_poolevents_pool;
uvm_eventto_idle,to_state_a,to_state_b,to_state_c;

functionnew();
events_pool=uvm_event_pool::get_global_pool();
to_idle=events_pool.get("to_idle");
to_state_a=events_pool.get("to_state_a");
to_state_b=events_pool.get("to_state_b");
to_state_c=events_pool.get("to_state_c");
endfunction
purevirtualtaskdo_something();
purevirtualtaskrequest_state_change();
endclass

classstate_idleextendsstate;

taskdo_something();
$display("STATE_IDLE:nothingtodo!
");
endtask

taskrequest_state_change();
state_tcur_state;
fork:disable_fork
begin
to_state_a.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_A;
end
join_any
FSM.set_state(cur_state);
endtask
endclass

classstate_aextendsstate;

taskdo_something();
$display("STATE_A:dosomething!
");
endtask

taskrequest_state_change();
state_tcur_state;
fork:disable_fork
begin
to_state_b.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_B;
end
begin
to_state_c.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_C;
end
join_any
disablefork;
FSM.set_state(cur_state);
endtask
endclass

classstate_bextendsstate;

taskdo_something();
$display("STATE_B:dosomething!
");
endtask

taskrequest_state_change();
state_tcur_state;
fork:disable_fork
begin
to_state_c.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_C;
end
begin
to_idle.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_IDLE;
end
join_any
disablefork;
FSM.set_state(cur_state);
endtask
endclass

classstate_cextendsstate;

taskdo_something();
$display("STATE_C:dosomething!
");
endtask

taskrequest_state_change();
state_tcur_state;
fork:disable_fork
begin
to_state_b.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_B;
end
begin
to_idle.wait_trigger();
//$display("dosomething!
");
cur_state=STATE_IDLE;
end
join_any
disablefork;
FSM.set_state(cur_state);
endtask
endclass

classstate_machine;

localstatestate_m;
statestate_pool[state_t];

functionvoidset_state(state_tstate);
$display("Enter%sstate!",state.name());
state_m=state_pool[state];
endfunction


functionvoidfsm_init();
`REGISTER_STATE(IDLE,idle)
`REGISTER_STATE(A,a)
`REGISTER_STATE(B,b)
`REGISTER_STATE(C,c)
this.set_state(STATE_IDLE);
endfunction

taskrun();
fsm_init();
foreverbegin
state_m.do_something();
state_m.request_state_change();
end
endtask
endclass

note

state_machine中还可以加入reset stop函数控制FSM的更多行为;封装更多API供其他模块调用;加入assertion做基于cycle的条件判断;加入covergroup收集功能覆盖率;






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTL
    RTL
    +关注

    关注

    1

    文章

    385

    浏览量

    59657
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    19121
  • 状态机
    +关注

    关注

    2

    文章

    491

    浏览量

    27452
  • fsm
    fsm
    +关注

    关注

    0

    文章

    35

    浏览量

    12804
  • DUT
    DUT
    +关注

    关注

    0

    文章

    189

    浏览量

    12304

原文标题:UVM设计模式 (九) 状态模式、Modelling Finite-State Machines in Testbench

文章出处:【微信号:数字芯片设计工程师,微信公众号:数字芯片设计工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    状态机编程实例-面向对象的状态设计模式

    本编介绍状态机编程的第3种方法——面向对象的状态设计模式,通过C++的继承特性,以及类指针,实现炸弹拆除小游戏中的状态机功能。
    的头像 发表于 06-28 09:04 1381次阅读
    <b class='flag-5'>状态</b>机编程实例-面向对象的<b class='flag-5'>状态</b>设计<b class='flag-5'>模式</b>

    数字IC验证“什么是UVM”“UVM的特点”“UVM提供哪些资源”(2)连载中...

    原文链接:https://zhuanlan.zhihu.com/p/345775995大家好,我是一哥,上章内容主要讲述两个内容,芯片验证以及验证计划。那本章我们主要讲述的内容有介绍什么是uvm
    发表于 01-21 16:00

    数字IC验证“典型的UVM平台结构”(3)连载中...

    的passitage模式,从图中可以看出,每增加一个测试模块,平台中就会增加一个与相对应的agent,因为这些agent在测试单个模块的时候已经完成了,所以这里只需要将它们集成到一个env当中即可,这体现了uvm测试平台的可重
    发表于 01-22 15:32

    基于多模式匹配的状态检测技术

    提出了一种基于多模式匹配的状态检测方案,借助网络处理器PowerPC MPC8572E 的模式匹配模块及其状态规则引擎,能够针对包含多种特征信息的协议,检测出协议所
    发表于 06-22 16:38 21次下载
    基于多<b class='flag-5'>模式</b>匹配的<b class='flag-5'>状态</b>检测技术

    UVMsequence/item见解 sequencer特性及应用(下)

    _SEQ_ARB_WEIGHTED;UVM_SEQ_ARB_RANDOM ;UVM_SEQ_ARB_STRICT_FIFO等。出其中三种需要特别区分外其它的模式可以满足绝大多数的仲裁需求。
    的头像 发表于 02-19 10:14 4761次阅读
    谈<b class='flag-5'>UVM</b><b class='flag-5'>之</b>sequence/item见解 sequencer特性及应用(下)

    C语言设计模式的程序资料合集

    本文档的主要内容详细介绍的是C语言设计模式的程序资料合集包括了:C语言设计模式_继承-多态-封装,C语言设计模式
    发表于 11-16 08:00 4次下载

    嵌入式软件设计设计模式

    文章目录前言1.设计模式适配器模式2.设计模式单例模式3.设计
    发表于 10-21 11:07 9次下载
    嵌入式软件设计<b class='flag-5'>之</b>设计<b class='flag-5'>模式</b>

    状态模式(状态机)

    以前写状态机,比较常用的方式是用 if-else 或 switch-case,高级的一点是函数指针列表。最近,看了一文章《c语言设计模式状态模式(
    发表于 12-16 16:53 8次下载
    <b class='flag-5'>状态</b><b class='flag-5'>模式</b>(<b class='flag-5'>状态</b>机)

    设计模式行为型:状态模式

    状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式
    的头像 发表于 06-07 11:20 564次阅读
    设计<b class='flag-5'>模式</b>行为型:<b class='flag-5'>状态</b><b class='flag-5'>模式</b>

    c语言设计模式--状态模式(状态机)

    状态模式(状态机)是嵌入式开发中最重要、最核心的设计模式之一,毫不夸张的说,是否熟练掌握状态模式
    的头像 发表于 06-14 15:28 1381次阅读
    c语言设计<b class='flag-5'>模式</b>--<b class='flag-5'>状态</b><b class='flag-5'>模式</b>(<b class='flag-5'>状态</b>机)

    CW32 低功耗模式的特性介绍

    CW32系列芯片支持3种工作模式,运行模式、休眠模式以及深度休眠模式,本文以CW32L083为例介绍低功耗
    的头像 发表于 12-30 10:53 1052次阅读
    CW32 低功耗<b class='flag-5'>模式</b>的特性<b class='flag-5'>介绍</b>

    一文详解UVM设计模式

    本篇是对UVM设计模式 ( 二 ) 参数化类、静态变量/方法/类、单例模式UVM_ROOT、工厂模式
    的头像 发表于 08-06 10:38 1562次阅读
    一文详解<b class='flag-5'>UVM</b>设计<b class='flag-5'>模式</b>

    行为型设计模式UVM中的应用

    接下来介绍行为型设计模式UVM中的应用。
    的头像 发表于 08-09 14:01 640次阅读
    行为型设计<b class='flag-5'>模式</b>在<b class='flag-5'>UVM</b>中的应用

    UVM设计模式访问者模式

    Visitor Pattern: 允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。换言之,如果component的数据结构是比较稳定的,但其是易于变化的,那么使用访问者模式是个不错的选择。
    的头像 发表于 08-11 09:28 705次阅读
    <b class='flag-5'>UVM</b>设计<b class='flag-5'>模式</b><b class='flag-5'>之</b>访问者<b class='flag-5'>模式</b>

    迭代模式UVM中的应用有哪些

    行为型设计模式数量较多,上一篇介绍了模板模式和策略模式,下面对迭代模式进行介绍,挖掘其在
    的头像 发表于 08-14 17:15 570次阅读
    迭代<b class='flag-5'>模式</b>在<b class='flag-5'>UVM</b>中的应用有哪些