设计模式在芯片验证中的应用——策略

server/2024/9/25 10:39:41/

1. 策略模式

策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

在RTL设计中可能包含了复杂的多个访问仲裁逻辑,使用了多种算法来确定访问内存优先级顺序,包括规定优先级、轮询仲裁等等。仲裁器的输入是多个请求者信号,以及选择要使用的仲裁算法的配置。根据选择的类型和请求者信号的值,仲裁器确定具有最高优先级的请求源,并授予它访问内存的权利。如下图所示,仲裁类型可以动态配置,这就是为什么该特性适合使用策略设计模式进行建模。在该模式中,可以在testcase运行中从提供的一系列算法中选择要应用的特定算法。此外,还可以直接为仲裁添加新算法,而无需修改之前代码。值得注意的是,之前讲到的装饰器设计模式也可用于动态更改行为,关键的区别在于,装饰器模式在原功能基础上添加额外的功能,而策略者模式直接更改原先功能。总得来说,策略模式可以让你改变对象的内部结构,装饰器模式允许你更改对象的皮肤。

策略设计模式主要包括以下几个组件:

策略(Strategy):定义了所有具体策略(Concrete Strategies)的通用接口,它声明了一个上下文(Context)用于执行策略的方法。在这个例子中,策略定义了仲裁的接口函数arb_winner()。

具体策略(Concrete Strategies):实现了上下文所用算法的各种不同变体。在这个例子中,对于每个必要的算法,定义了一个具体策略类,提供特定算法的实现。将每个算法包装到一个单独的类中可以提高代码的可读性和可扩展性。

上下文(Context):维护指向具体策略的引用,且仅通过策略接口与该对象进行交流。比如UVM scoreboard组件依赖于Strategy,检查RTL内的仲裁逻辑是否正确实现,那么UVM scoreboard可以被认为是Context。

客户端(Client):会创建一个特定策略对象并将其传递给上下文。上下文则会提供一个设置函数以便客户端在运行时替换相关联的策略。当上下文需要运行算法时,它会在其已连接的策略对象上调用执行方法。上下文并不清楚其所涉及的策略类型与算法的执行方式。本例的客户端是example_application。

下图为策略设计模式在仲裁中应用的UML类图。

策略模式让你能将不同行为抽取到一个独立类层次结构中, 并将原始类组合成同一个, 从而减少重复代码。而且让你能将各种算法的代码、 内部数据和依赖关系与其他代码隔离开来。 不同客户端可通过一个简单接口执行算法, 并能在运行时进行切换。

2. 参考代码

仲裁处理的策略设计模式参考代码如下:

virtual class strategy;pure virtual function int arb_winner(ref bit req_arr[3]);
endclass : strategyclass strategy_low_priority extends strategy;virtual function int arb_winner(ref bit req_arr[3]);for (int i=0; i<3; i++) beginif (req_arr[i] == 1) beginreturn i;endendreturn -1;endfunction : arb_winnerendclass : strategy_low_priorityclass strategy_high_priority extends strategy;virtual function int arb_winner(ref bit req_arr[3]);for (int i=2; i>=0; i++) beginif (req_arr[i] == 1) beginreturn i;endendreturn -1;endfunction : arb_winnerendclass : strategy_high_priorityclass my_context;local strategy m_strategy;function void set_strategy(strategy _m);m_strategy = _m;endfunction : set_strategyfunction int execute_strategy(ref bit req_arr[3]);return m_strategy.arb_winner(req_arr);endfunction : execute_strategyendclass : my_context

模拟测试代码如下:

class example_application;rand bit low_priority;rand bit high_priority;constraint p_cons { low_priority + high_priority >= 1; }function void main();int result;bit req_arrary[3] = '{1'b0, 1'b1, 1'b1};strategy stg;my_context m_ctx = new();`uvm_info("strategy", $psprintf("low_priority:%b, high_priority:%b", low_priority, high_priority), UVM_LOW)$display("The input req0:%b, req1:%b, req2:%b", req_arrary[0], req_arrary[1], req_arrary[2]);if ( low_priority ) beginstg = strategy_low_priority::new();m_ctx.set_strategy(stg);result = m_ctx.execute_strategy(req_arrary);$display("For low priority, the result is: %0d", result);endif ( high_priority ) beginstg = strategy_high_priority::new();m_ctx.set_strategy(stg);result = m_ctx.execute_strategy(req_arrary);$display("For high priority, the result is: %0d", result);endendfunction : mainendclass : example_application

输出仿真日志如下:

 | # [strategy] low_priority:1, high_priority:1| # The input req0:0, req1:1, req2:1| # For low priority, the result is: 1| # For high priority, the result is: 2

从仿真结果可知,low_priority为1,high_priority为1,因此example_application类选取了strategy_low_priority类和strategy_high_priority类两个算法。

在strategy_low_priority类中,输入信号中,req0=0,req1=1,req2=1,req1输入口被选中,因此输出的结果是1。

在strategy_high_priority类中,输入信号中,req0=0,req1=1,req2=1,req2输入口被选中,因此输出的结果是2。


http://www.ppmy.cn/server/8217.html

相关文章

【软考---系统架构设计师】软件架构

目录 1 一、软件架构的概念 二、软件架构风格 &#xff08;1&#xff09;数据流风格​​​​​​​ &#xff08;2&#xff09;调用/返回风格 &#xff08;3&#xff09;独立构件风格 &#xff08;4&#xff09;虚拟机风格 &#xff08;5&#xff09;仓库风格 三、架构…

MongoDB的安装和使用。完成MongoDB的基本的shell命令。

一、MongoDB介绍 MongoDB 是一个是一个基于分布式文件存储的数据库&#xff0c;介于关系数据库和非关系数据库之间&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。他支持的数据结构非常松散&#xff0c;是类似json的bson格式&#xff0c;因此可以存储…

.NET/C#汇总 —— WPF

1.WPF由哪两部分组成? wpf 由两个主要部分 组成:引擎和编程框架。 1 引擎。wpf引擎是基于窗体的应⽤程序 图形 视频 ⾳频和⽂档提供了⼀个单⼀的运⾏时库。重要的是 WPF基于⽮量的呈现引擎使应⽤程序可以灵活地利⽤⾼DPI监视器,⽀持图形的硬件加速。2 框架。WPF框架为媒体 …

每日OJ题_其它背包问题①_力扣474. 一和零(二维费用01背包)

目录 力扣474. 一和零 解析代码 代码优化 力扣474. 一和零 474. 一和零 难度 中等 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&…

Maven的dependencyManagement与dependencies区别

先说结论&#xff1a;Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。 在maven多模块项目的pom文件中&#xff0c;有的小伙伴会发现最外层的pom文件和里面的pom文件有个地方不一样 如下图 父pom 子pom 一般来说是在maven的最外父工程pom文件里&…

【前端面试常问】MVC与MVVM

&#x1f525;【前端面试常问】MVC与MVVM&#x1f4a5;&#xff1a;详尽解读与实战指南 前端开发世界中&#xff0c;架构设计犹如高楼之基&#xff0c;决定着代码的组织层次、模块间交互方式以及项目长远的可维护性和扩展性。本文将全方位剖析两种主流前端架构模式——MVC&…

Leetcode 3122. Minimum Number of Operations to Satisfy Conditions

Leetcode 3122. Minimum Number of Operations to Satisfy Conditions 1. 解题思路2. 代码实现 题目链接&#xff1a;3122. Minimum Number of Operations to Satisfy Conditions 1. 解题思路 这一题就是一个动态规划的思路&#xff0c;我们只需要对每一列取0到9的情况各自进…

探索银行产品秒杀系统的创新之路

随着金融科技的快速发展&#xff0c;银行业也在不断探索创新&#xff0c;以提升客户体验并保持竞争力。其中&#xff0c;银行产品秒杀系统作为一种新型的营销策略&#xff0c;正逐渐受到银行业的关注和应用。本文将深入探讨银行产品秒杀系统的概念、优势以及应用场景&#xff0…