【前端验证】通用型顺序比对的uvm scoreboard组件编写

简介: 【前端验证】通用型顺序比对的uvm scoreboard组件编写

前言

最近在研究uvm环境的仿真结束机制,准备在现有的objection机制基础上补充看门狗操作。而看门狗操作中,scoreboard喂狗是重要的一环,因此这次先实现一下通用型顺序比对的scoreboard组件编写。


scoreboard

在之前的 【python脚本】用于生成简单握手接口与自测环境的gen_uvm_agent脚本 工程中,我针对每一个agent都生成了对应的scb,这实际是没有必要的,绝大多数的transaction都可以共用一套scb,只需要把对应的数据类型传入即可,暂且将其中的顺序比对公用scb命名为prj_scoreboard。

class prj_scoreboard #(type REQ=uvm_sequence_item) extends uvm_scoreboard;
  REQ expect_q[$];
  REQ actual_q[$];
  uvm_blocking_get_port #(REQ)  exp_port;
  uvm_blocking_get_port #(REQ)  act_port;
  static event feed_watchdog;
  extern function new(string name, uvm_component parent = null);
    extern virtual function void build_phase(uvm_phase phase);
    extern virtual task run_phase(uvm_phase phase);
  `uvm_component_param_utils(prj_scoreboard#(REQ))
endclass: prj_scoreboard


prj_scoreboard必然是继承自uvm_scoreboard,不过要做公用的那必然要将内部比对的数据类型作为参数传入,因此使用REQ作为传参类型,内部的queue声明和port声明都以REQ作为数据类型。feed_watchdog是全局可见的event,后续所有例化的prj_scoreboard均触发这一个event就可以了,没有必要在环境中@每一个scb的比对事件,因为所有的scb比对事件均要触发喂狗,因此大家喂一个就可以了。


`uvm_component_param_utils(prj_scoreboard#(REQ))这一行卡了时间(毕竟我自学成才o(╥﹏╥)o),虽然能够确定要使用param型的注册,但是应该如何注册呢,我先后试用了

`uvm_component_utils(prj_scoreboard)
`uvm_component_param_utils(prj_scoreboard#(type REQ=uvm_sequence_item))
`uvm_component_param_utils(prj_scoreboard#(uvm_sequence_item))


然后发现要么编译不过,要么后面create时有问题。然后问了大神应该怎么写,大神一语点醒梦中人:参数型的class传了不同的参数就是完全不同的class,因此注册时要明确当前的参数,而在内部注册时,参数就是REQ,后面声明时REQ传参指向谁那么注册的类就是谁。所以这里的factory注册方式直接就是:

`uvm_component_param_utils(prj_scoreboard#(REQ))


内部的方法,new和build_phase都没有什么多说的,比对行为放在了run_phase中,因为scb是被动型的组件,不需要raise objection,一直工作就可以了。

function prj_scoreboard::new(string name, uvm_component parent = null);
   super.new(name, parent);
endfunction: new
function void prj_scoreboard::build_phase(uvm_phase phase);
   super.build_phase(phase);
   exp_port = new("exp_port", this);
   act_port = new("act_port", this);
endfunction: build_phase
task prj_scoreboard::run_phase(uvm_phase phase);
    super.run_phase(phase);
    fork 
        while(1)begin
        REQ get_expect;
            exp_port.get(get_expect);
            expect_q.push_back(get_expect);
        end
        while(1)begin
      REQ get_actual;
            act_port.get(get_actual);
      actual_q.push_back(get_actual);
    end
    while(1)begin
      REQ get_expect;
      REQ get_actual;
      bit result;
      if(actual_q.size() > 0)begin
        get_actual = actual_q.pop_front();
        -> feed_watchdog;
        if(expect_q.size() > 0) begin
          get_expect = expect_q.pop_front();
          result = get_actual.compare(get_expect);
          if(result) begin 
            `uvm_info("prj_scoreboard", "Compare SUCCESSFULLY", UVM_LOW);
          end
          else begin
            `uvm_error("prj_scoreboard", "Compare FAILED");
            $display("RM:");
            get_expect.print();
            $display("RTL:");
            get_actual.print();
          end
        end
        else begin
          `uvm_error("prj_scoreboard", "Received from DUT, while Expect Queue is empty");
          get_actual.print();
        end
            end
            else begin
                #1;
            end
        end
    join_none
endtask: run_phase


相关文章
|
3月前
|
数据采集 前端开发 JavaScript
《花100块做个摸鱼小网站! 》第四篇—前端应用搭建和完成第一个热搜组件
本文档详细介绍了从零开始搭建一个包含前后端交互的热搜展示项目的全过程。通过本教程,读者不仅能学习到完整的项目开发流程,还能掌握爬虫技术和前后端交互的具体实践。适合有一定编程基础并对项目实战感兴趣的开发者参考。
88 1
|
3月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
152 0
|
22天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
28 1
|
25天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
1月前
|
前端开发 JavaScript
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透
159 1
|
1月前
|
前端开发 JavaScript 开发者
Web组件:一种新的前端开发范式
【10月更文挑战第9天】Web组件:一种新的前端开发范式
41 2
|
1月前
|
前端开发 JavaScript Go
前端开发趋势:从响应式设计到Web组件的探索
【10月更文挑战第1天】前端开发趋势:从响应式设计到Web组件的探索
38 3
|
1月前
|
前端开发 数据安全/隐私保护
angular前端基本页面验证
angular前端基本页面验证
29 1
|
1月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
98 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
2月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架