四川路桥建设股份有限公司网站生产管理软件哪家好

张小明 2025/12/30 7:34:08
四川路桥建设股份有限公司网站,生产管理软件哪家好,seo平台是什么意思,wordpress网站主修改密码UVM TLM 非阻塞Put端口#xff1a;敲门询问式通信 你好#xff01;今天我们要学习UVM中非阻塞TLM通信。这是一种先敲门#xff0c;再进入的通信方式#xff0c;发送方不会傻等#xff0c;而是先询问接收方是否准备好#xff0c;再决定是否发送数…UVM TLM 非阻塞Put端口敲门询问式通信你好今天我们要学习UVM中非阻塞TLM通信。这是一种先敲门再进入的通信方式发送方不会傻等而是先询问接收方是否准备好再决定是否发送数据。 一句话理解非阻塞Put非阻塞Put就像拜访朋友的礼貌方式阻塞Put直接去朋友家敲门后一直等到开门可能等很久非阻塞Put先打电话问在家吗得到肯定回答再过去⚡ 为什么需要非阻塞通信场景对比快递员送货想象两种送货方式阻塞方式普通Put快递员到你门口一直敲门直到你开门取件非阻塞方式非阻塞Put快递员先打电话问现在方便吗不方便就晚点再打非阻塞通信的优势不浪费时间发送方不会被无限期阻塞灵活调度发送方可以做其他事情资源高效避免无意义的等待 阻塞 vs 非阻塞对比图解先通过一个流程图理解两种方式的根本区别 核心概念三个关键方法非阻塞Put提供了三种与接收方交互的方式方法类型作用类比try_put()函数尝试发送立即返回成功/失败敲门问能进来吗can_put()函数仅查询是否准备好不发送打电话问在家吗put()任务阻塞发送等待完成直接进门等主人 完整代码深度解析第一步定义数据包类class Packet extends uvm_object;rand bit[7:0]addr;// 地址字段rand bit[7:0]data;// 数据字段uvm_object_utils_begin(Packet)uvm_field_int(addr,UVM_ALL_ON)uvm_field_int(data,UVM_ALL_ON)uvm_object_utils_end functionnew(string namePacket);super.new(name);endfunction endclass注意非阻塞通信使用函数function所以数据包在发送后不能被修改因为函数立即返回可能数据包还在传输中。第二步发送方实现componentA版本1基础try_put示例1class componentA extends uvm_component;uvm_component_utils(componentA)// 1. 声明非阻塞put端口uvm_nonblocking_put_port #(Packet)m_put_port;intm_num_tx2;// 发送次数functionnew(string namecomponentA,uvm_component parentnull);super.new(name,parent);endfunction virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);// 2. 创建端口实例m_put_portnew(m_put_port,this);endfunction virtual taskrun_phase(uvm_phase phase);phase.raise_objection(this);repeat(m_num_tx)begin bit success;Packet pktPacket::type_id::create(pkt);assert(pkt.randomize());uvm_info(COMPA,尝试发送数据包,UVM_LOW)pkt.print();// 3. 关键尝试发送非阻塞successm_put_port.try_put(pkt);if(success)uvm_info(COMPA,发送成功,UVM_MEDIUM)elseuvm_info(COMPA,发送失败,UVM_MEDIUM)end phase.drop_objection(this);endtask endclass关键点try_put()是函数不是任务立即返回1成功或0失败发送方不会被阻塞版本2循环try_put模拟阻塞示例2virtual taskrun_phase(uvm_phase phase);phase.raise_objection(this);repeat(m_num_tx)begin bit success;Packet pktPacket::type_id::create(pkt);assert(pkt.randomize());uvm_info(COMPA,尝试发送数据包,UVM_LOW)pkt.print();// 循环尝试直到成功dobegin successm_put_port.try_put(pkt);if(success)uvm_info(COMPA,发送成功,UVM_MEDIUM)elsebegin uvm_info(COMPA,发送失败1ns后重试,UVM_MEDIUM)#1;// 等待1ns后重试end endwhile(!success);// 直到成功才退出循环end phase.drop_objection(this);endtask这种模式实现了非阻塞API的阻塞行为发送方主动等待但不是被接收方阻塞可以控制重试间隔如#1更加灵活可以添加超时机制版本3使用can_put查询示例3virtual taskrun_phase(uvm_phase phase);phase.raise_objection(this);repeat(m_num_tx)begin bit ready;Packet pktPacket::type_id::create(pkt);assert(pkt.randomize());uvm_info(COMPA,准备发送数据包,UVM_LOW)pkt.print();// 先查询接收方是否就绪uvm_info(COMPA,等待接收方就绪...,UVM_MEDIUM)dobegin readym_put_port.can_put();// 仅查询不发送endwhile(!ready);// 等待直到就绪uvm_info(COMPA,接收方已就绪开始发送,UVM_MEDIUM)// 确认就绪后发送这时应该100%成功m_put_port.try_put(pkt);end phase.drop_objection(this);endtaskcan_put的优势纯粹的查询不改变状态可以在发送前做其他准备工作适用于复杂的发送逻辑第三步接收方实现componentB接收方需要实现两个函数try_put()和can_put()版本1总是就绪示例1class componentB extends uvm_component;uvm_component_utils(componentB)// 声明非阻塞put实现端口uvm_nonblocking_put_imp #(Packet,componentB)m_put_imp;functionnew(string namecomponentB,uvm_component parentnull);super.new(name,parent);endfunction virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);m_put_impnew(m_put_imp,this);endfunction// 实现try_put接收数据virtual function bittry_put(Packet pkt);uvm_info(COMPB,收到数据包,UVM_LOW)pkt.print();return1;// 总是成功endfunction// 实现can_put查询是否就绪virtual function bitcan_put();// 总是就绪return1;endfunction endclass版本2模拟随机就绪示例2// try_put实现随机决定是否接收virtual function bittry_put(Packet pkt);bit ready;std::randomize(ready);// 随机生成0或1if(ready)begin uvm_info(COMPB,接收数据包,UVM_LOW)pkt.print();return1;// 成功endelsebegin uvm_info(COMPB,忙碌中无法接收,UVM_LOW)return0;// 失败end endfunction版本3独立的can_put逻辑示例3virtual function bittry_put(Packet pkt);// 收到数据包uvm_info(COMPB,接收数据包,UVM_LOW)pkt.print();return1;endfunction virtual function bitcan_put();// 随机返回是否就绪与实际try_put解耦return$urandom_range(0,1);endfunction重要区别can_put()只查询状态不改变状态try_put()尝试改变状态接收数据第四步环境连接class my_test extends uvm_test;uvm_component_utils(my_test)componentA compA;componentB compB;functionnew(string namemy_test,uvm_component parentnull);super.new(name,parent);endfunction virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);compAcomponentA::type_id::create(compA,this);compBcomponentB::type_id::create(compB,this);compA.m_num_tx2;// 配置发送次数endfunction virtual functionvoidconnect_phase(uvm_phase phase);// 连接非阻塞端口compA.m_put_port.connect(compB.m_put_imp);endfunction endclass 三种模式输出对比分析模式1基础try_put总是成功0: [COMPA] 尝试发送数据包 0: [COMPB] 收到数据包 ← 立即接收 0: [COMPA] 发送成功 ← 立即返回成功特点发送立即完成类似阻塞put但没有等待。模式2循环try_put随机成功0: [COMPA] 尝试发送数据包 0: [COMPA] 发送失败1ns后重试 ← 第一次失败 1: [COMPB] 收到数据包 ← 1ns后成功 1: [COMPA] 发送成功 ← 循环结束特点模拟真实场景接收方可能忙碌。模式3can_put查询0: [COMPA] 准备发送数据包 0: [COMPA] 等待接收方就绪... ← 开始查询 0: [COMPA] 接收方已就绪开始发送 ← can_put返回1 0: [COMPB] 收到数据包 ← 发送成功特点确保发送时接收方100%就绪。 实际应用场景场景1总线仲裁器class bus_arbiter extends uvm_component;uvm_nonblocking_put_imp #(bus_transaction,bus_arbiter)put_imp;bit busy0;// 当前是否忙碌virtual function bitcan_put();return!busy;// 不忙碌时返回1endfunction virtual function bittry_put(bus_transaction tr);if(busy)return0;// 忙碌则拒绝busy1;// 标记为忙碌fork beginprocess_transaction(tr);// 处理事务busy0;// 处理完成标记为空闲end join_nonereturn1;// 接收成功endfunction endclass场景2带缓冲的接收器class buffered_receiver extends uvm_component;uvm_nonblocking_put_imp #(packet,buffered_receiver)put_imp;packet buffer[$];intmax_buffer_size10;virtual function bitcan_put();// 缓冲区未满时才能接收return(buffer.size()max_buffer_size);endfunction virtual function bittry_put(packet pkt);if(buffer.size()max_buffer_size)return0;// 缓冲区满拒绝buffer.push_back(pkt);// 存入缓冲区return1;endfunction// 后台处理线程virtual taskrun_phase(uvm_phase phase);forever beginwait(buffer.size()0);process_packet(buffer.pop_front());#10;// 模拟处理时间end endtask endclass场景3多优先级发送class priority_sender extends uvm_component;uvm_nonblocking_put_port #(packet)high_pri_port;uvm_nonblocking_put_port #(packet)low_pri_port;virtual taskrun_phase(uvm_phase phase);forever begin packet pktget_next_packet();if(pkt.priorityHIGH)begin// 高优先级尝试发送失败则等待while(!high_pri_port.try_put(pkt))#1;endelsebegin// 低优先级尝试发送失败则丢弃if(!low_pri_port.try_put(pkt))uvm_warning(LOW_PRI,低优先级包被丢弃)end end endtask endclass⚠️ 注意事项和最佳实践1. 函数 vs 任务// ❌ 错误非阻塞接口实现任务 virtual task try_put(packet pkt); // 应该是function // ✅ 正确非阻塞接口实现函数 virtual function bit try_put(packet pkt);2. 返回值处理// 必须处理返回值bit successport.try_put(pkt);if(!success)begin// 处理失败情况重试、记录、丢弃等handle_failure(pkt);end3. can_put与try_put的竞态条件// 潜在问题查询后状态可能改变bit readyport.can_put();// 返回1就绪// 在这期间其他线程可能占用接收方bit successport.try_put(pkt);// 可能失败// 解决方案循环尝试dobeginif(port.can_put())begin successport.try_put(pkt);endif(!success)#1;// 等待后重试endwhile(!success);4. 超时机制virtual function bittry_put_with_timeout(packet pkt,inttimeout_ns);realtime start_time$realtime;while($realtime-start_timetimeout_ns)beginif(m_put_port.try_put(pkt))return1;// 成功#1;// 等待1ns后重试end uvm_warning(TIMEOUT,发送超时)return0;// 超时失败endfunction 阻塞 vs 非阻塞完整对比特性阻塞Put非阻塞Put接口类型uvm_blocking_put_portuvm_nonblocking_put_port实现类型uvm_blocking_put_impuvm_nonblocking_put_imp方法类型任务task函数function阻塞性发送方被阻塞发送方立即返回主要方法put()try_put(),can_put()返回值无1成功/0失败适用场景简单同步复杂异步、性能敏感典型应用顺序数据流总线通信、多线程 实战练习建议练习1基础非阻塞通信实现基础非阻塞put示例1观察立即返回的特性对比阻塞put的时间消耗练习2模拟真实场景让接收方随机忙碌示例2实现发送方的重试机制添加重试次数限制练习3高级应用实现带缓冲的接收器添加优先级机制实现超时和错误处理练习4性能对比// 测试代码比较阻塞和非阻塞的性能virtual taskperformance_test();realtime start_time;intiterations1000;// 测试阻塞putstart_time$realtime;for(inti0;iiterations;i)blocking_port.put(pkt);// 可能被阻塞realtime blocking_time$realtime-start_time;// 测试非阻塞put循环尝试start_time$realtime;for(inti0;iiterations;i)beginwhile(!nonblocking_port.try_put(pkt))#1;// 忙等待end realtime nonblocking_time$realtime-start_time;uvm_info(PERF,$sformatf(阻塞: %0t ns, 非阻塞: %0t ns,blocking_time,nonblocking_time),UVM_LOW)endtask 设计模式推荐模式1生产者-消费者带流控class producer extends uvm_component;uvm_nonblocking_put_port #(data)put_port;virtual taskrun_phase(uvm_phase phase);forever begin data itemgenerate_data();// 使用can_put避免忙等待if(put_port.can_put())begin put_port.try_put(item);endelsebegin// 接收方忙碌做其他工作do_something_else();#10;// 等待一段时间end end endtask endclass模式2带超时的发送class timeout_sender extends uvm_component;uvm_nonblocking_put_port #(packet)put_port;virtual function bitsend_with_timeout(packet pkt,intmax_retries);for(inti0;imax_retries;i)beginif(put_port.try_put(pkt))return1;// 成功#10;// 等待后重试end// 重试次数用尽uvm_error(SEND_FAIL,发送失败)return0;endfunction endclass模式3批量发送优化class batch_sender extends uvm_component;uvm_nonblocking_put_port #(packet)put_port;virtual tasksend_batch(packet batch[$]);foreach(batch[i])begin// 尝试发送失败则等待并重试while(!put_port.try_put(batch[i]))begin// 接收方忙碌可以// 1. 发送其他数据// 2. 等待固定时间// 3. 调整发送策略if(ibatch.size()-1)begin// 尝试发送下一个包i;endelsebegin #10;// 等待后重试当前包end end end endtask endclass 总结非阻塞TLM Put是礼貌、高效、灵活的通信方式立即返回发送方不会被无限期阻塞状态感知通过返回值知道发送结果灵活控制可以重试、等待、放弃或做其他事情性能友好避免无意义的等待时间记住核心区别阻塞put用任务发送方会等待非阻塞用函数立即知成败try_put尝试发can_put查状态灵活又高效复杂场景爱。掌握了非阻塞Put你就能构建响应更快、资源利用率更高的验证平台现在尝试在你的测试中用非阻塞通信替换一些阻塞调用体验性能提升吧
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做博客网站要什么技术代理服务器在哪里找

第一章:为什么99%的人预约失败?Open-AutoGLM自动调度机制大揭秘在高并发资源预约场景中,大多数用户始终无法成功抢占名额,背后并非网络或手速问题,而是对系统调度机制的误解。Open-AutoGLM 作为新一代智能调度引擎&…

张小明 2025/12/30 7:34:07 网站建设

工商网站查询企业信息查询官网做电影网站失败了

如何快速掌握Vanna AI数据库查询:企业级私有化部署完整指南 【免费下载链接】vanna 人工智能驱动的数据库查询 。使用RAG实现准确的文本到SQL的转换 。 项目地址: https://gitcode.com/GitHub_Trending/va/vanna 在当今数据驱动的商业环境中,企业…

张小明 2025/12/30 7:33:33 网站建设

自己买空间让网络公司做网站好吗2020长沙马拉松线上赛

Windows 10 使用指南:从基础操作到个性化设置 1. Windows 10 用户环境概述 Windows 10 无论是从 Windows 7 还是 Windows 8.1 升级而来,日常操作都会有所不同。虽然基本操作如启动程序、排列窗口、切换任务、搜索文件、配置通知、与云交互以及与人沟通等方式相同,但完成任…

张小明 2025/12/30 7:32:59 网站建设

郑州门户网站建设惠州网站建设 翻译

SUSE Linux Enterprise Server 10 安全:iptables 与网络地址转换详解 1. 熟悉基本 iptables 语法 有一个练习旨在让你熟悉 iptables 语法,并展示一些 iptables 规则的效果,你可以在练习册中找到这个练习。 2. 理解 iptables 高级特性 在定义简单的静态数据包过滤器时,之…

张小明 2025/12/30 7:31:51 网站建设

双浩建设网站微信crm系统软件

5大实战锦囊:zsxq-spider大规模知识星球导出避坑指南 【免费下载链接】zsxq-spider 爬取知识星球内容,并制作 PDF 电子书。 项目地址: https://gitcode.com/gh_mirrors/zs/zsxq-spider 想要高效导出知识星球的宝贵内容?zsxq-spider开源…

张小明 2025/12/30 7:31:17 网站建设

网站活动专题页面汽车网络营销分析报告

分布式网络与NT4迁移至Samba - 3的深度解析 1. 分布式网络中的身份管理与Samba配置 随着组织的不断发展,控制点的数量也随之增加。在大型分布式组织中,身份管理系统必须具备从多个位置进行更新的能力,并且所做的更改应能在合理的时间内(通常是几分钟而非几天)投入使用。…

张小明 2025/12/30 7:30:44 网站建设