UVM TLM FIFO 类:高效事务存储与通信机制解析

UVM实战:为什么uvm_tlm_analysis_fifo不用phase机制也能跑?(附源码解析) 本文深入解析了UVM验证环境中uvm_tlm_analysis_fifo的特殊设计,探讨其为何能绕过phase机制运行。通过源码分析,揭示了该组件如何精简继承结构、规避工厂机制,并体现单一职责原则,为TLM通信提供高效解决方案。文章还提供了实战中的最佳实践和性能优化技巧。 阅读详情

1. 从“快递驿站”到“事务队列”:理解 UVM TLM FIFO 的核心价值

如果你刚开始接触 UVM 验证,听到 TLM、FIFO 这些词可能会有点懵。别急,咱们先从一个生活中的例子说起。想象一下你小区里的快递驿站。快递员每天会把很多包裹(事务)送到驿站(FIFO),然后驿站按照包裹到达的先后顺序,通知收件人(验证环境中的其他组件)来取。这个驿站有几个关键特点:它有存放包裹的货架(存储空间),可以告诉你现在有多少包裹(used),货架是不是满了(is_full),或者是不是空的(is_empty)。当驿站搞促销清仓时,它还能一键把所有包裹都处理掉(flush)。UVM TLM FIFO 类,本质上就是验证环境中的这个“快递驿站”,它专门负责在两个独立、异步运行的验证组件之间,安全、有序地暂存和传递“事务”这种数据包。

那么,为什么我们需要这个“驿站”呢?直接让快递员(生产者组件)把包裹送给收件人(消费者组件)不行吗?在实际的芯片验证中,经常遇到生产数据和消费数据速度不匹配的情况。比如,一个总线监视器(monitor)可能每1纳秒就采集到一个数据事务,而负责处理这些数据的记分板(scoreboard)可能需要10纳秒才能完成一次比对。如果没有一个中间缓冲区,要么监视器会被迫等待(拖慢仿真速度),要么记分板会丢失数据(导致验证不完整)。TLM FIFO 就是为了解决这种“生产者-消费者”速度差异而生的通信枢纽。它基于 SystemVerilog 的 TLM(事务级建模)标准,提供了一套标准化的接口,让组件间的通信变得像寄收快递一样简单可靠,大大提升了验证环境的健壮性和可重用性。

2. 深入 uvm_tlm_fifo:你的第一个事务缓冲区

uvm_tlm_fifo 是 UVM 库中最基础、最常用的 FIFO 类。你可以把它理解为一个容量可配置的“标准快递驿站”。它的核心任务就是:通过 put_export 接收事务,按照先进先出的顺序在内部队列中存储,然后通过 get_peek_export 让其他组件按序取走或查看。

2.1 创建与配置:给驿站定规矩

万事开头难,我们先看看怎么把这个“驿站”建起来。在 UVM 中,uvm_tlm_fifo 是一个组件(uvm_component),所以创建它和创建其他组件(如 driver、monitor)类似。

// 在你的验证环境(env)或某个组件中实例化一个 FIFO
class my_env extends uvm_env;
    // 声明 FIFO 句柄,事务类型我们自定义为 my_transaction
    uvm_tlm_fifo #(my_transaction) cmd_fifo;

    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction

    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        // 创建 FIFO,并指定其容量(size)
        // 参数1:实例名,用于调试和报告
        // 参数2:父组件,这里就是 my_env 本身
        // 参数3:FIFO 容量,这里设为 8,意味着最多能存 8 个事务
        cmd_fifo = new("cmd_fifo", this, 8);
    endfunction
endclass

这里有几个关键点需要注意。size 参数决定了 FIFO 的容量上限。如果你设为 0,那就意味着这是一个“无限容量”的驿站(实际上受限于内存),这在某些场景下很有用,但要小心内存溢出。另外,如果你是在一个静态结构(比如直接在一个 SystemVerilog 的 module 里)实例化这个 FIFO,那么 parent 参数需要传 null。但在绝大多数动态构建的 UVM 环境中,像上面这样指定父组件是正确的做法。

2.2 核心方法实战:驿站日常运营指南

驿站建好了,接下来就是日常运营。uvm_tlm_fifo 提供了一组直观的方法来管理其中的事务。我们结合代码看看它们怎么用。

容量与状态查询:这是最常用的操作。假设你的 driver 在发送事务前,想确认一下 FIFO 里有没有数据,或者你的 sequencer 在产生新事务前,想看看 FIFO 是不是快满了。

// 在某个组件(如 driver)的 run_phase 中
task my_driver::run_phase(uvm_phase phase);
    forever begin
        // 等待 FIFO 非空,有数据了才去取
        wait(!cmd_fifo.is_empty());
        // 也可以检查用了多少容量
        `uvm_info("DRV", $sformatf("FIFO当前有 %0d 个事务,容量为 %0d", cmd_fifo.used(), cmd_fifo.size()), UVM_LOW)

        // ... 后续从 get_peek_export 获取事务的操作
    end
endtask

is_full() 方法同样重要。对于生产者(比如 sequencer),如果它不顾一切地往一个已满的 FIFO 里塞数据,默认情况下 put 操作会阻塞,直到 FIFO 有空间。这有时是你期望的流控行为,但有时你可能希望 sequencer 暂停产生新事务。通过检查 is_full(),你可以实现更灵活的控制逻辑。

清空操作:flush() 方法就像驿站的“一键清仓”。在测试用例的开始、结束,或者当发生某些错误需要重置环境状态时,这个功能特别有用。我踩过一个坑:在一次长时间回归测试中,某个测试用例结束后没有清空 FIFO,导致残留的事务被下一个测试用例读到,造成了诡异的误报。所以,养成在测试序列的 pre_body 或 post_body 中清空相关 FIFO 的习惯,是个好实践。

// 在测试序列中
task my_test::reset_environment();
    // 清空环境中的所有 FIFO,确保状态干净
    env.agent.driver.cmd_fifo.flush();
    `uvm_info("TEST", "已清空命令 FIFO", UVM_MEDIUM)
    // 清空后,is_empty() 应返回 1,used() 返回 0
    assert(env.agent.driver.cmd_fifo.is_empty());
endtask

2.3 连接与通信:打通驿站的“收”“发”端口

FIFO 本身不会自动产生或消费事务,它需要和其他组件连接起来。这就是 put_export 和 get_peek_export 这两个端口发挥作用的地方。你可以把它们理解为驿站的“收货窗口”和“取件窗口”。

  • put_export: 这是一个“导出”(export),意味着它提供接口的实现。任何带有 put_port 或 put_export 的组件(生产者),都可以连接到它,从而调用其 put 方法将事务存入 FIFO。
  • get_peek_export: 同样是一个导出,它提供了 get(取走并移除事务)和 peek(查看下一个事务但不移除)两个方法。消费者组件通过它的 get_port 或 get_export 连接到这里来获取数据。

连接通常在验证环境的 connect_phase 中完成。下面是一个典型连接示例:

class my_env extends uvm_env;
    my_sequencer  sqr;
    my_driver     drv;
    my_monitor    mon;
    my_scoreboard scb;
    uvm_tlm_fifo #(my_transaction) cmd_fifo; // sequencer 到 driver
    uvm_tlm_fifo #(my_transaction) mon_fifo; // monitor 到 scoreboard

    function void connect_phase(uvm_phase phase);
        super.connect_phase(phase);
        // 连接1: sequencer 的 seq_item_port 连接到 FIFO 的 put_export
        // sequencer 产生的事务会“放”进 FIFO
        sqr.seq_item_port.connect(cmd_fifo.put_export);

        // 连接2: FIFO 的 get_peek_export 连接到 driver 的 seq_item_export
        // driver 从 FIFO 里“取”事务来执行
        cmd_fifo.get_peek_export.connect(drv.seq_item_export);

        // 连接3: monitor 的 analysis_port 连接到另一个 FIFO 的 put_export
        // monitor 将观察到的事务“写”入 FIFO
        mon.ap.connect(mon_fifo.put_export);

        // 连接4: FIFO 的 get_peek_export 连接到 scoreboard 的 analysis_export
        // scoreboard 从 FIFO 里“取”事务进行比对
        mon_fifo.get_peek_export.connect(scb.analysis_export);
    endfunction
endclass

通过这样的连接,数据流就清晰了:事务从 sequencer 流向 FIFO,再从 FIFO 流向 driver;或者从 monitor 流向 FIFO,再从 FIFO 流向 scoreboard。FIFO 解耦了生产者和消费者的直接依赖,让它们可以按照自己的节奏运行。

3. 进阶之选:uvm_tlm_analysis_fifo 详解

如果说 uvm_tlm_fifo 是标准驿站,那么 uvm_tlm_analysis_fifo 就是一个特殊的“广播中转站”。它继承自 uvm_tlm_fifo,但有两个至关重要的区别,理解了它们,你就能在正确的地方使用正确的工具。

3.1 核心区别:无界容量与 write 接口

第一,uvm_tlm_analysis_fifo 的容量默认是无界的(size=0)。这意味着你不需要在构造时指定 size 参数,它理论上可以接收无限多的事务。这非常适合那些数据流不可预测、或者生产者可能突然爆发式产生数据的场景,比如一个覆盖点收集器,或者一个用于后期调试的日志记录器。你不用担心它被塞满而导致阻塞。

第二,也是更关键的一点,它提供了一个 analysis_export 端口,而不是 put_export。这个端口只实现了一个方法:write()。为什么这很重要?因为 UVM 的 分析端口(analysis port) 体系就是围绕 write() 方法构建的。分析端口支持一对多的广播通信。一个分析端口可以连接到多个分析导出(analysis_export)或 uvm_tlm_analysis_fifo 的 analysis_export。

这意味着,uvm_tlm_analysis_fifo 是天生的“监听者”和“缓冲区”。它最常见的用法就是作为 monitor 的 analysis_port 与后续多个分析消费者(如 scoreboard, coverage collector, reference model)之间的通用适配器和缓冲区。

3.2 典型应用场景:一监多发,有序缓冲

想象一下,你的总线 monitor 监听到一个事务,这个事务需要同时被 scoreboard 用于数据比对,被功能覆盖组用于收集覆盖,还被一个可视化工具用于波形显示。如果让 monitor 直接连接这三个组件,耦合度会很高。更优雅的做法是:

class my_env extends uvm_env;
    my_monitor         mon;
    my_scoreboard      scb;
    my_coverage        cov;
    my_virtual_visualizer vis;

    // 使用 analysis_fifo 作为缓冲区
    uvm_tlm_analysis_fifo #(my_transaction) mon_analysis_fifo;

    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        mon = my_monitor::type_id::create("mon", this);
        scb = my_scoreboard::type_id::create("scb", this);
        cov = my_coverage::type_id::create("cov", this);
        vis = my_virtual_visualizer::type_id::create("vis", this);
        // 注意,创建 analysis_fifo 时不需要指定 size
        mon_analysis_fifo = new("mon_analysis_fifo", this);
    endfunction

    function void connect_phase(uvm_phase phase);
        super.connect_phase(phase);
        // Monitor 的 analysis_port 连接到 analysis_fifo 的 analysis_export
        mon.ap.connect(mon_analysis_fifo.analysis_export);

        // 然后,各个消费者从同一个 analysis_fifo 的 get_peek_export 获取数据
        // 这样它们拿到的是同一个有序的事务流
        mon_analysis_fifo.get_peek_export.connect(scb.analysis_export);
        mon_analysis_fifo.get_peek_export.connect(cov.analysis_export);
        mon_analysis_fifo.get_peek_export.connect(vis.analysis_export);
    endfunction
endclass

这样做的好处非常明显:

  1. 解耦:Monitor 只负责发送,完全不知道后面有多少个消费者。新增或删除一个消费者(比如临时加个日志),完全不需要修改 monitor 的代码。
  2. 缓冲:如果 scoreboard 处理得慢,事务会暂存在 analysis_fifo 里,不会影响 monitor 和 coverage collector 的运行。
  3. 数据一致性:所有消费者从同一个 FIFO 读取,保证了它们处理的事务顺序是完全一致的,这对于需要严格时序比对的场景至关重要。

3.3 方法继承与使用

uvm_tlm_analysis_fifo 继承了 uvm_tlm_fifo 的所有状态查询方法(used, is_empty, is_full)和 flush 方法。所以,你依然可以查询它当前缓冲了多少事务,或者在需要时清空它。不过要注意,由于它的容量是无界的,is_full() 方法几乎总是返回 0,除非系统内存耗尽。

4. 如何选择:uvm_tlm_fifo vs. uvm_tlm_analysis_fifo

看到这里,你可能有点纠结,到底该用哪一个?我根据自己的经验,总结了一个简单的决策流程,你可以参考下面的对比表格,它能帮你快速做出选择。

特性对比uvm_tlm_fifouvm_tlm_analysis_fifo
核心用途点对点、有容量控制的阻塞/非阻塞通信。典型如 sequencer 到 driver 的指令流。一对多、无界容量的广播式数据缓冲。典型如 monitor 到多个分析组件的数据流。
容量有界,构造时通过 size 参数指定。可用于流控。无界,构造时无 size 参数。避免因消费者慢而阻塞生产者。
写入接口put_export (提供 put, try_put, can_put 方法)。analysis_export (仅提供 write 方法)。
读取接口get_peek_export (提供 get, try_get, peek, try_peek 等)。继承自父类,同样是 get_peek_export。
通信模型基于 TLM 1.0 的 put/get 接口,强调握手和传输。基于 UVM 分析端口(analysis_port)的 write 接口,强调广播和通知。
阻塞行为put 在 FIFO 满时会阻塞;get 在 FIFO 空时会阻塞。write 永不阻塞(因为无界)。消费者的 get 在 FIFO 空时会阻塞。
适用场景1. Sequencer-Driver 通信。
2. 需要精确流控的生产者-消费者对。
3. 任何需要固定大小缓冲区的点对点连接。
1. Monitor 到 Scoreboard/Coverage/Reference Model 等。
2. 需要将单一数据源分发给多个消费者的任何地方。
3. 数据生产速率不可预测或消费者处理较慢时。

选择口诀:

  • 当你需要控制流量(防止生产者过快淹没消费者),或者通信是严格的一对一关系时,用 uvm_tlm_fifo。
  • 当你需要广播数据(一个生产者,多个消费者),或者希望生产者绝不因消费者忙而等待时,用 uvm_tlm_analysis_fifo。

在实际项目中,我经常两者混用。比如,一个 monitor 连接一个 uvm_tlm_analysis_fifo 用于广播,而其中一个消费者(比如一个复杂的记分板)内部,可能会再用一个 uvm_tlm_fifo 来管理它自己需要处理的事务队列,以实现内部不同线程间的流量控制。这种分层使用的方式,能让验证环境的通信架构既清晰又高效。

别再混淆了!一文搞懂UVM中analysis端口、FIFO与普通TLM端口的区别与选型 本文深入解析UVM验证环境中analysis端口、FIFO与普通TLM端口的核心区别与选型策略。通过对比表、代码示例和实战场景,详细阐述广播通信、数据缓冲等关键特性,帮助工程师构建高效可靠的验证架构,避免常见连接错误和性能瓶颈。 阅读详情

相关推荐

UVM验证中的TLM通信:深入理解uvm_tlm_analysis_fifo与普通FIFO的区别

本文深入解析了UVM验证环境中uvm_tlm_analysis_fifo与普通uvm_tlm_fifo的核心区别。uvm_tlm_analysis_fifo通过analysis_export支持非阻塞广播写入,适用于Monitor到Scoreboard等一对多数据流场景;而普通FIFO采用阻塞式点对点通信,适用于有缓冲的精确数据传递。正确选择两者对构建高效、健壮的TLM通信架构至关重要。

tech5的博客 956

UVM——TLM通信机制

TBA

zyj0oo0的博客 5268

UVM实战-TLM通信中analysis端口与FIFO的协同设计与性能优化

本文深入探讨了UVM TLM通信中analysis端口与FIFO的协同设计与性能优化。通过分析analysis端口的广播特性和analysis_fifo的缓冲机制,提供了多种连接拓扑和深度调优策略,帮助提升SoC验证效率。文章还包含常见问题排查指南和高级应用技巧,如动态深度调整和多时钟域处理,适用于复杂验证场景。

weixin_30570101的博客 398

UVM寄存器模型与通道机制

摘要:本文介绍UVM验证中的寄存器模型和接口连接机制。寄存器模型通过前门访问(经总线事务转换)和后门访问(直接信号路径映射)两种方式实现DUT寄存器操作。UVM接口连接主要采用三种机制:1)一对一连接(如put_port/get_port);2)一对多广播(analysis_port);3)接口转接(通过tlm_fifo实现不同类型接口的适配)。文中以scoreboard为例说明多对一连接的具体实现,展示了如何通过imp端口处理多个数据流并进行比对验证。这些机制为构建高效可靠的验证环境提供了关键技术支撑。

2301_81405032的博客 1142

别再死记硬背了!用“快递小哥”和“收发室”的故事,5分钟搞懂UVM TLM的Port、Export和IMP

本文通过快递小哥、收发室和公司员工的生动类比,深入浅出地解析了UVM TLM中Port、Export和IMP的核心机制。从角色定位、通信模式到连接规则,结合SystemVerilog代码示例,帮助读者快速掌握TLM通信的底层逻辑与实战技巧,提升验证效率。

weixin_33720956的博客 442

UVM验证实战:从环境搭建到高级调试与覆盖率收集

在芯片验证领域,SystemVerilog与UVM是构建高效验证环境的核心技术。其原理在于通过面向对象与事务级建模,实现验证组件的模块化与可重用性。这项技术的价值在于显著提升验证效率与质量,确保芯片设计的功能正确性。典型应用场景包括复杂SoC的模块级与系统级验证。本文将聚焦于UVM实战中的关键机制,例如通过uvm_config_db实现灵活配置,并深入解析uvm_hdl_force等高级调试函数在错误注入中的应用,同时探讨覆盖率模型的设计策略,为构建健壮的验证环境提供系统化指导。

weixin_34009794的博客 330

uvm的各种口的整理

不同组件之间的通信,在SV中可以通过旗语、信箱及事件来实现。UVM提供了方便的方法。根据不同的属性分为不同的口,在此做个整理理解。

mute_dog的博客 1738

【路科验证002】V2Pro实战指南:从SV到UVM的验证技能跃迁

本文以路科验证V2Pro平台为核心,为芯片验证新手提供从SystemVerilog(SV)入门到UVM实战的清晰路径。文章详解了如何通过平台实验,将SV语法、随机化等基础知识转化为实战能力,并最终在I2C虚拟项目中构建完整的UVM验证环境,实现验证技能的实质性跃迁。

convnet3designer的博客 566

别再死记硬背了!用‘快递收发’的日常场景,5分钟搞懂UVM TLM的put、get和transport

本文通过快递收发的生活场景类比,深入浅出地讲解了UVM TLM通信中的put、get和transport操作。从阻塞式与非阻塞式的区别到端口连接规则,再到TLM_FIFO缓冲机制,帮助读者轻松掌握芯片验证中的关键通信技术。特别适合初学者通过日常经验理解抽象的技术概念。

weixin_33701564的博客 490

IC验证进阶:UVM验证平台构建与核心工具链实战解析

本文深入解析了UVM验证平台的构建与核心工具链实战技巧,涵盖架构设计、组件实现、工具链整合及高级验证方法。通过分层设计、TLM通信、Sequence优化等关键技术,提升IC验证效率与质量,助力工程师快速掌握UVM验证技术。

weixin_30814329的博客 472

LK32T102 单片机 操作GPIO实现流水灯(1)

前言: LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。 LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。...

qq_58676187的博客 3189

(2)UVM 类库地图

UVM类库地图 文章目录UVM类库地图一、前言二、类库地图三、类库地图解析关注作者 一、前言 在SV模块中,验证环境整体的构建,是从底层模块的验证组件搭建到通信和激励生成。这些元素无论是软件对象的创建、访问、修改、配置,还是组件之间的通信都是通过用户自定义的方式来实现的。 UVM验证方法学作为之前所有方法学的融合版本,从自身初衷而言,就是将验证过程中可以重用和标准化的部分都规定在其方法学的类库当中,通过标准化的方式减轻了验证人员构建环境的负担。 在构建验证环境时需要考虑的五大因素是: 1.组件的创建和访问

数字IC小白的日常修炼 808

从FOC到你的无人机:深入浅出讲透Clark/Park变换在无刷电机控制中的核心作用

本文深入解析Clark变换与Park变换在无刷电机控制中的核心作用,揭示其如何将三相交流电转换为旋转坐标系下的直流量,实现无人机电机的高效精准控制。通过STM32硬件加速和工程实践案例,展示这对数学变换如何成为FOC算法的神经中枢,大幅提升系统响应速度和能效表现。

weixin_42628941的博客 169

UVM面试高频考点与实战解析

UVM(Universal Verification Methodology)作为芯片验证领域的事实标准,其核心价值在于提供标准化的验证方法学框架。从技术原理看,UVM基于SystemVerilog构建,采用工厂模式、配置机制和TLM通信等关键技术,实现了验证环境的可重用性和可扩展性。在工程实践中,UVM组件生命周期管理、TLM通信机制和寄存器模型同步策略是验证工程师必须掌握的三大核心技能。特别是在SoC验证场景中,合理的phase调度和TLM接口选择直接影响验证效率。通过分析实际项目中的死锁案例和覆盖率优

weixin_30918633的博客 329

技术前沿:半导体前道检测和量测设备修复技术

半导体前道检测设备是目前除光刻机外,国产渗透率较低的环节之一,近年来我国初步实现国产突破。前道检测相对后道检测环节壁垒更高,国内多家涉及后道测试,涉及前道检测和中道检测相对较少。

VOMMA的博客 4543

双足肌肉骨骼机器人

Clone Alpha的技术突破标志着人类进入生物-机械融合的新纪元,但其影响远超技术范畴。从伦理框架重建(如拉马克进化算法中的知识传递机制)到经济模式革新(如UBI应对机器人失业潮),需全球协作制定前瞻性政策。若放任技术无序扩张,人类社会或将面临“能力断层”与“控制权丧失”的双重危机;反之,若以人类福祉为核心导向,仿生机器人亦可成为弥合残障歧视、提升整体文明层级的钥匙。当下选择,将决定人类究竟是技术的创造者,还是被重构的客体。

百态·数智思维 | 聚焦大数据、量化与未来AI 985

UVM driver与sequencer通信全解析:从TLM端口到实战配置

本文深入解析UVM框架中driver与sequencer的TLM通信机制,重点介绍get_next_item工作流和get/put双向通信模式。通过实战配置技巧和调试方法,帮助验证工程师构建高效的芯片验证环境,提升测试场景到DUT输入激励的转换效率。

weixin_30316097的博客 391

电机FOC控制实战:STM32 CubeMX配置六路互补PWM与死区优化

本文详细介绍了如何使用STM32 CubeMX配置六路互补PWM与死区优化,实现电机FOC控制。通过实战经验分享,包括时钟配置、定时器设置、死区时间计算及优化技巧,帮助开发者避免常见问题,提升电机控制性能。特别适用于STM32G4系列的无刷电机驱动应用。

weixin_29193259的博客 402

uvm_callback机制学习总结

UVM中的Callback机制解析:从原理到实践 摘要: 本文系统解析了UVM验证方法学中的Callback机制。首先介绍了Callback的基本概念,它是一种设计模式,允许在不修改原有代码的情况下动态注入或修改行为。在UVM验证环境中,Callback机制主要实现了四大功能:动态错误注入、组件解耦与重用、测试行为动态定制以及事务级监控。文章详细阐述了纯SystemVerilog和UVM两种环境下的实现方式,重点分析了UVM中的核心类和宏(uvm_callback、uvm_callbacks#(T,CB)、

IC验证及芯片SOC知识分享 578

决策树(分类树、回归树)

决策树 前言:第一篇博客,最近看完决策树,想着归纳一下,也方便自己以后回顾。写的会比较全面一些,可能会有很多不太正确的地方,欢迎大家交流指正 : ) 决策树模型: 决策树模型是运用于分类以及回归的一种树结构。决策树由节点和有向边组成,一般一棵决策树包含一个根节点、若干内部节点和若干叶节点。决策树的决策过程需要从决策树的根节点开始,待测数据与决策树中的特征节点进行比较,并按照比较结果选...

你午睡了吗 9万+

制作3D地形图的方法-使用GlobalMapper和3ds Max软件

打开GlobalMapper软件,在菜单栏中选择“文件”>“打开数据文件”,然后选择相应的高程数据文件。在菜单栏中选择“渲染”>“渲染设置”,根据需要进行设置,如分辨率和输出格式。选择地形对象,点击菜单栏中的“渲染”>“材质编辑器”,然后根据需要调整材质属性,如颜色、纹理和光照等。在菜单栏中选择“工具”>“高程栅格和网格”>“创建地形网格”。在菜单栏中选择“文件”>“导出”>“导出栅格格式”。打开3ds Max软件,在菜单栏中选择“文件”>“导入”,然后选择之前导出的地形数据文件。步骤3:导出地形网格。

JqlScala的博客 1535

从软件架构视角解码 UVM:它到底是什么?能做什么?不能做什么?

UVM 不是软件框架,但软件架构思维能帮我们看清它的抽象意图、识别它的实现妥协、规避它的语义陷阱。当我们用 IoC、Pub-Sub、State Machine 的语言拆解 UVM 时,不是为了强行套用软件范式,而是为了建立可验证、可推导、可复现的验证环境设计纪律。

qq_45869788的博客 408

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

7.26华为OD机试真题 新系统 - 炸弹人的雷区数量 (Java/Py/C/C++/Js/Go)

算法大师! 793

SystemVerilog系统验证:从OOP、断言到UVM的完整方法学

在超大规模集成电路(VLSI)和复杂片上系统(SoC)设计中,验证是确保芯片功能正确性的核心环节。其基本原理是通过模拟真实场景,对设计进行全方位测试,以在流片前发现潜在缺陷。传统基于Verilog的验证方法在应对现代SoC时面临激励生成、结果检查和环境复用三大挑战。SystemVerilog作为工业级验证语言,通过引入面向对象编程(OOP)、约束随机化和断言(SVA)三大核心技术,构建了自动化、可重用的验证方法学。这些技术显著提升了验证效率与覆盖率,是构建UVM等标准化验证框架的基石。本文聚焦于System

keke1314520的博客 349

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

UVMbasic

uvm

weixin_37758706的博客 498

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从队列到mailbox:SystemVerilog线程通信工具选型指南(附性能对比)

本文深入探讨SystemVerilog中mailbox与队列的线程通信机制,对比六大关键差异及性能表现。通过实测数据展示mailbox在多线程竞争下的优势,并提供UVM验证框架中的集成实践与选型策略,帮助开发者优化芯片验证效率。

weixin_30752699的博客 522

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 文本相似度检测工具全解析:从原理到实战应用
下一篇: 动态SLAM中的语义分割与并行计算优化策略
vim8coder
博客等级 码龄1天 0粉丝 1693原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值