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

news2024/9/22 19:46:32

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 : strategy


class strategy_low_priority extends strategy;

    virtual function int arb_winner(ref bit req_arr[3]);
        for (int i=0; i<3; i++) begin
            if (req_arr[i] == 1) begin
                return i;
            end
        end
        return -1;
    endfunction : arb_winner

endclass : strategy_low_priority


class strategy_high_priority extends strategy;

    virtual function int arb_winner(ref bit req_arr[3]);
        for (int i=2; i>=0; i++) begin
            if (req_arr[i] == 1) begin
                return i;
            end
        end
        return -1;
    endfunction : arb_winner

endclass : strategy_high_priority

class my_context;

    local strategy m_strategy;

    function void set_strategy(strategy _m);
        m_strategy = _m;
    endfunction : set_strategy

    function int execute_strategy(ref bit req_arr[3]);
        return m_strategy.arb_winner(req_arr);
    endfunction : execute_strategy

endclass : 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 ) begin
            stg = 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);
        end
        if ( high_priority ) begin
            stg = 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);
        end

    endfunction : main

endclass : 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.coloradmin.cn/o/1596641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

plc远程监控系统

随着工业4.0时代的到来&#xff0c;智能制造成为了工业发展的核心驱动力。在这个信息化、网络化的新时代&#xff0c;PLC远程监控系统以其强大的监控与管理能力&#xff0c;正逐渐成为工业自动化领域的明星产品。今天&#xff0c;我们就来聊聊PLC远程监控系统以及HiWoo Cloud平…

网络协议——OSPF(开放式最短路径优先)详解

1.什么是OSPF 开放式最短路径优先OSPF 是一种动态的高度可靠和高度可扩展的路由协议&#xff0c;用于构建大型网络中的动态路由系统 2. OSPF的协议号为&#xff1a;89 3. OSPF的特点: OSPF是链路状态协议使用了区域概念&#xff1a;减少路由选择协议对路由器CPU&#xff0c;…

从零开始学习Linux(1)---基本命令(1)

1.学习准备 我学习Linux是使用xshell远程登录自己的云服务器来进行。 xshell是一个远程终端管理软件&#xff0c;下载官网&#xff1a; https://www.netsarang.com/products/xsh_overview.htm 下载安装的时候选择 "home/school"…

H.265网页无插件播放EasyPlayer.js流媒体播放器常见问题及解答

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 今天我们来汇总下用户常见的几个问题及解答。 1、EasyPlayer.js播放多路H.265视…

「每日跟读」英语常用句型公式 第12篇

「每日跟读」英语常用句型公式 第12篇 1. I’m having a hard time __ing 我现在不太能__&#xff08;遇到困难&#xff09; I’m having a hard time concentrating on my work.&#xff08;我现在不太能集中注意力在我的工作上&#xff09; I’m having a hard time slee…

UE5 把蓝图内的变量和事件暴露给序列使用

在蓝图变量内勾选Expose to Cinematics 事件: 在角色内添加自定义事件 在序列内对着角色的号添加Event,选择Trigger 添加关键帧,然后在关键帧右键添加class,在class下绑定事件

抖音小店新手玩家能做吗?跟着我的步骤做,爆单很简单

大家好&#xff0c;我是电商笨笨熊 抖店新手玩家能做吗&#xff1f; 当然可以。 抖音小店自推出以来已经吸引了无数的新手玩家&#xff0c;且不少玩家从个人走到了团队化。 新手做抖店&#xff0c;最重要的是掌握方法&#xff0c;只要方法对了&#xff0c;方向对了&#xf…

工业物联网网关

在数字化浪潮席卷全球的今天&#xff0c;工业物联网&#xff08;IIoT&#xff09;作为连接物理世界与数字世界的桥梁&#xff0c;正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽&#xff0c;工业物联网网关发挥着至关重要的作用。今天&#xff0c;我们就来深入了解一下工业…

leetcode代码记录(回文数

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#x…

web笔记再整理

前四天笔记在此连接: web前端笔记表单练习题五彩导航栏练习题-CSDN博客https://blog.csdn.net/simply_happy/article/details/136917265?spm1001.2014.3001.5502 # 1.边框弧度​ div {​ width: 300px;​ height: 50px;​ background-color: aqua;​ …

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线&#xff0c;但是一台电脑基本上只有一个接口。因此想要链接更多的电…

RISCV指令集体系简读之RV32I

RV32I 指令格式 用于寄存器-寄存器操作的R类型指令用于短立即数和访存load操作的I型指令用于访存store操作的s型指令用于条件跳转操作的B类型指令用于长立即数的U型指令用于无条件跳转的J型指令 特点&#xff1a; 所有指令都是32bits&#xff0c; 简化了指令解码&#xff1b;…

SuperMap GIS基础产品FAQ集锦(20240415)

一、SuperMap iDesktopX 问题1&#xff1a;请教一下&#xff0c;同一份数据&#xff0c;用idesktop11.0.1、idesktopX11.1.1和idesktopX11.1.1的临时包&#xff0c;做同一分析&#xff0c;得到的结果数据集都不一样&#xff0c;有的是57条&#xff0c;有的是86条&#xff0c;有…

如何在树莓派安装Nginx并实现固定公网域名访问本地静态站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

【C++语言】初步认识面向对象编程类和对象(上)

文章目录 前言一.初步认识面向过程和面向对象编程1.面向过程编程初步认识2.面向对象编程初步认识 二.C类1. 类的引入&#xff1a;2. 类的定义3.类的访问限定符&&封装3.1 访问限定符3.2 封装 4.类的实例化5.如何计算类的大小 总结C语言系列学习目录 前言 面向对象编程 类…

深度探索:Secure Hash Algorithm(SHA)全景解析

title: 深度探索&#xff1a;Secure Hash Algorithm&#xff08;SHA&#xff09;全景解析 date: 2024/4/15 18:33:17 updated: 2024/4/15 18:33:17 tags: SHA安全抗碰撞性算法版本实现细节性能优化发展历史应用案例 密码学中的哈希函数 一、哈希函数的定义 哈希函数是一种数…

车载终端设备主板方案_MTK平台智能后视镜行车记录仪PCBA定制开发

智能后视镜集成了车辆行车记录、倒车影像、AR实景导航、语音助手、ADAS辅助、云电子狗、蓝牙通话、影音娱乐等功能&#xff0c;为驾驶者提供全方位的驾驶辅助体验。 智能后视镜主板解决方案&#xff0c;采用了联发科MT6762八核处理器&#xff0c;拥有主频2.0GHz&#xff0c;采用…

Ubuntu与主机windows共享文件夹

一、创建共享文件夹&#xff1a; 虚拟机->设置->选项->共享文件夹->总是启用->选择本地的共享文件夹&#xff08;如E&#xff1a;\Share&#xff09;->确定。 二、设置挂载&#xff1a; 首先赋予/etc/fstab文件可编辑的权限&#xff1b; sudo chmod 777 /…

Langchain入门到实战-第二弹

Langchain入门到实战 Langchain快速入门官网地址Langchain概述Langchain调用大模型更新计划 Langchain快速入门 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://python.langchain.com/Langchain概述 LangChain是一个…

从旺店通·旗舰奇门到金蝶云星空通过接口配置打通数据

从旺店通旗舰奇门到金蝶云星空通过接口配置打通数据 对接系统旺店通旗舰奇门 慧策&#xff08;原旺店通&#xff09;是一家技术驱动型智能零售服务商&#xff0c;基于云计算PaaS、SaaS模式&#xff0c;以一体化智能零售解决方案&#xff0c;帮助零售企业数字化智能化升级&#…