青岛专业做网站阿里云网站建设优化

张小明 2026/1/7 19:03:56
青岛专业做网站,阿里云网站建设优化,网站建设管理系统免费网站,湖南住房与城乡建设厅网站UVM TLM _decl 宏#xff1a;为多路通信创建专属接收窗口 你好#xff01;今天我们要学习UVM中一个非常实用的技巧#xff1a;uvm_*_imp_decl 宏。这个宏解决了TLM通信中的一个常见问题#xff1a;当一个组件需要同时接收多个来源的数据时#xff0c;如何区分…UVM TLM _decl 宏为多路通信创建专属接收窗口你好今天我们要学习UVM中一个非常实用的技巧uvm_*_imp_decl宏。这个宏解决了TLM通信中的一个常见问题当一个组件需要同时接收多个来源的数据时如何区分它们 一句话理解 _decl 宏uvm_*_imp_decl宏就像为你的组件开多个专属接收窗口普通情况只有一个收件箱所有快递混在一起使用 _decl 宏有多个带标签的收件箱不同来源的快递分开放⚡ 为什么需要这个功能场景邮局分拣中心问题想象一个邮局分拣中心componentB两个发送方北京邮局componentA和上海邮局componentC只有一个接收窗口所有包裹混在一起无法区分来源需求需要知道哪些包裹来自北京哪些来自上海这就是_decl宏要解决的问题 问题展示单一接收窗口的困境先看看不用_decl宏时的问题// 问题代码componentB只有一个put_impclass componentB extends uvm_component;uvm_blocking_put_imp #(simple_packet,componentB)put_imp;taskput(simple_packet pkt);// 问题无法区分pkt来自componentA还是componentCuvm_info(COMPB,收到数据包但不知道是谁发的,UVM_LOW)endtask endclass class my_env extends uvm_env;virtual functionvoidconnect_phase(uvm_phase phase);compA.put_port.connect(compB.put_imp);compC.put_port.connect(compB.put_imp);// 两个都连到同一个impendfunction endclass输出结果混乱[COMPB] 收到数据包但不知道是谁发的 ← 来自A还是C [COMPB] 收到数据包但不知道是谁发的 ← 来自A还是C ...️ 解决方案使用 _decl 宏创建多接收窗口工作原理图解让我们通过一个流程图来理解_decl宏如何创建多个专属接收窗口 代码深度解析第一步宏声明关键步骤// 在componentB类定义之前声明两个不同的imp类uvm_blocking_put_imp_decl(_1)uvm_blocking_put_imp_decl(_2)// 这相当于告诉UVM// 1. 创建一个新类uvm_blocking_put_imp_1// 2. 创建一个新类uvm_blocking_put_imp_2// 3. 这两个类都要求实现put方法但名字分别是put_1和put_2宏的作用机制// 宏展开的简化理解defineuvm_blocking_put_imp_decl(SFX)\ class uvm_blocking_put_impSFX #(type Tint,type IMPint)\ extends uvm_blocking_put_imp #(T,IMP);\ \ virtual task putSFX(T t);\// 这个任务会被调用... \ endtask \ endclass// 当调用 uvm_blocking_put_imp_decl(_1) 时// 1. 创建新类uvm_blocking_put_imp_1// 2. 这个类有一个任务put_1(T t)// 3. 同样的_2会创建put_2(T t)第二步componentB实现多接收窗口class componentB extends uvm_component;uvm_component_utils(componentB)// 1. 声明两个不同的imp端口uvm_blocking_put_imp_1 #(simple_packet,componentB)put_imp1;uvm_blocking_put_imp_2 #(simple_packet,componentB)put_imp2;functionnew(string namecomponentB,uvm_component parentnull);super.new(name,parent);endfunction virtual functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);// 2. 创建两个imp实例put_imp1new(put_imp1,this);put_imp2new(put_imp2,this);endfunction// 3. 实现两个不同的put方法taskput_1(simple_packet pkt);uvm_info(COMPB,来自A的数据通过put_1,UVM_LOW)pkt.print();endtask taskput_2(simple_packet pkt);uvm_info(COMPB,来自C的数据通过put_2,UVM_LOW)pkt.print();endtask endclass第三步发送方保持不变// componentA正常发送数据class componentA extends uvm_component;uvm_blocking_put_port #(simple_packet)put_port;virtual taskrun_phase(uvm_phase phase);simple_packet pktsimple_packet::type_id::create(pkt);pkt.randomize();uvm_info(COMPA,发送数据到B,UVM_LOW)put_port.put(pkt);// 正常发送endtask endclass// componentC同样正常发送class componentC extends uvm_component;uvm_blocking_put_port #(simple_packet)put_port;virtual taskrun_phase(uvm_phase phase);simple_packet pktsimple_packet::type_id::create(pkt);pkt.randomize();uvm_info(COMPC,发送数据到B,UVM_LOW)put_port.put(pkt);// 正常发送endtask endclass关键点发送方完全不需要知道接收方有多个imp它们只管发送。第四步环境中的正确连接class my_env extends uvm_env;componentA compA;componentB compB;componentC compC;virtual functionvoidconnect_phase(uvm_phase phase);// 关键连接A连接到imp1C连接到imp2compA.put_port.connect(compB.put_imp1);// A → put_imp1compC.put_port.connect(compB.put_imp2);// C → put_imp2endfunction endclass 输出结果分析让我们看看使用_decl宏后的清晰输出// 来自componentC的数据通过put_imp2 UVM_INFO 0: uvm_test_top.m_top_env.compC [COMPC] Packet sent to CompB UVM_INFO 0: uvm_test_top.m_top_env.compB [COMPB] Packet received from put_2 ← 明确来自C // 来自componentA的数据通过put_imp1 UVM_INFO 0: uvm_test_top.m_top_env.compA [COMPA] Packet sent to CompB UVM_INFO 0: uvm_test_top.m_top_env.compB [COMPB] Packet received from put_1 ← 明确来自A对比优势场景输出清晰度可维护性扩展性无 _decl 宏❌ 无法区分来源❌ 代码混乱❌ 难以增加新发送方使用 _decl 宏✅ 明确来源✅ 结构清晰✅ 易于扩展 _decl 宏的多种应用场景场景1优先级处理uvm_blocking_put_imp_decl(_high)uvm_blocking_put_imp_decl(_low)class priority_processor extends uvm_component;uvm_blocking_put_imp_high #(packet,priority_processor)high_pri_imp;uvm_blocking_put_imp_low #(packet,priority_processor)low_pri_imp;taskput_high(packet pkt);// 高优先级处理立即处理uvm_info(PROC,高优先级数据立即处理,UVM_HIGH)process_immediately(pkt);endtask taskput_low(packet pkt);// 低优先级处理排队等待uvm_info(PROC,低优先级数据排队等待,UVM_HIGH)low_pri_queue.push_back(pkt);endtask endclass场景2多协议支持uvm_blocking_put_imp_decl(_axi)uvm_blocking_put_imp_decl(_ahb)uvm_blocking_put_imp_decl(_apb)class bus_bridge extends uvm_component;uvm_blocking_put_imp_axi #(axi_transaction,bus_bridge)axi_imp;uvm_blocking_put_imp_ahb #(ahb_transaction,bus_bridge)ahb_imp;uvm_blocking_put_imp_apb #(apb_transaction,bus_bridge)apb_imp;taskput_axi(axi_transaction tr);// 处理AXI协议事务convert_axi_to_internal(tr);endtask taskput_ahb(ahb_transaction tr);// 处理AHB协议事务convert_ahb_to_internal(tr);endtask taskput_apb(apb_transaction tr);// 处理APB协议事务convert_apb_to_internal(tr);endtask endclass场景3多数据流处理uvm_blocking_put_imp_decl(_video)uvm_blocking_put_imp_decl(_audio)uvm_blocking_put_imp_decl(_control)class multimedia_processor extends uvm_component;uvm_blocking_put_imp_video #(video_frame,multimedia_processor)video_imp;uvm_blocking_put_imp_audio #(audio_sample,multimedia_processor)audio_imp;uvm_blocking_put_imp_control#(control_cmd,multimedia_processor)control_imp;taskput_video(video_frame frame);// 处理视频帧process_video_frame(frame);endtask taskput_audio(audio_sample sample);// 处理音频样本process_audio_sample(sample);endtask taskput_control(control_cmd cmd);// 处理控制命令execute_control_command(cmd);endtask endclass⚠️ 使用 _decl 宏的注意事项规则1宏必须在类外部声明// ✅ 正确宏在类定义之前uvm_blocking_put_imp_decl(_1)uvm_blocking_put_imp_decl(_2)class componentB extends uvm_component;// 类定义...endclass// ❌ 错误宏在类内部class componentB extends uvm_component;uvm_blocking_put_imp_decl(_1)// 编译错误// ...endclass规则2类名和方法名后缀必须一致// ✅ 正确类名和方法名后缀一致uvm_blocking_put_imp_decl(_special)// 宏参数_specialclass my_component extends uvm_component;uvm_blocking_put_imp_special #(packet,my_component)imp_special;taskput_special(packet pkt);// 方法名put_special// ...endtask endclass// ❌ 错误后缀不一致uvm_blocking_put_imp_decl(_a)class my_component extends uvm_component;uvm_blocking_put_imp_a #(packet,my_component)imp_a;taskput_b(packet pkt);// 应该是 put_a// ...endtask endclass规则3端口类型必须匹配// ✅ 正确端口类型匹配uvm_blocking_put_imp_decl(_1)class componentB extends uvm_component;// blocking_put_imp_1uvm_blocking_put_imp_1 #(packet,componentB)put_imp1;// 实现 blocking put 任务taskput_1(packet pkt);// 任务不是函数// ...endtask endclass// ❌ 错误非阻塞和阻塞混用uvm_nonblocking_put_imp_decl(_1)// 非阻塞宏class componentB extends uvm_component;uvm_nonblocking_put_imp_1 #(packet,componentB)put_imp1;// 错误应该实现函数而不是任务taskput_1(packet pkt);// ❌ 应该是 function bit put_1(packet pkt)// ...endtask endclass 与其他TLM特性的对比特性_decl 宏SocketAnalysis PortFIFO主要用途多来源区分双向通信广播通信缓冲解耦连接数量多个发送方→1接收方1对11对多1对1带缓冲数据流向单向接收双向单向广播单向缓冲典型场景多协议接口处理器-存储器Monitor广播速度不匹配 实际应用SoC验证平台让我们看一个实际SoC验证平台中的应用// SoC中的中央仲裁器需要处理来自多个主设备的数据uvm_blocking_put_imp_decl(_cpu)uvm_blocking_put_imp_decl(_dma)uvm_blocking_put_imp_decl(_gpu)class central_arbiter extends uvm_component;uvm_component_utils(central_arbiter)// 来自不同主设备的接口uvm_blocking_put_imp_cpu #(bus_request,central_arbiter)cpu_req_imp;uvm_blocking_put_imp_dma #(bus_request,central_arbiter)dma_req_imp;uvm_blocking_put_imp_gpu #(bus_request,central_arbiter)gpu_req_imp;// 内部请求队列bus_request cpu_queue[$];bus_request dma_queue[$];bus_request gpu_queue[$];functionnew(string name,uvm_component parent);super.new(name,parent);endfunction functionvoidbuild_phase(uvm_phase phase);super.build_phase(phase);cpu_req_impnew(cpu_req_imp,this);dma_req_impnew(dma_req_imp,this);gpu_req_impnew(gpu_req_imp,this);endfunction// CPU请求最高优先级taskput_cpu(bus_request req);uvm_info(ARB,收到CPU请求最高优先级,UVM_HIGH)cpu_queue.push_front(req);// 插到队首schedule_arbitration();endtask// DMA请求中等优先级taskput_dma(bus_request req);uvm_info(ARB,收到DMA请求中等优先级,UVM_HIGH)dma_queue.push_back(req);schedule_arbitration();endtask// GPU请求最低优先级taskput_gpu(bus_request req);uvm_info(ARB,收到GPU请求最低优先级,UVM_HIGH)gpu_queue.push_back(req);schedule_arbitration();endtask taskschedule_arbitration();// 仲裁逻辑按优先级处理请求// 1. 先处理CPU队列// 2. 然后DMA队列// 3. 最后GPU队列endtask endclass// 环境连接class soc_env extends uvm_env;cpu_driver cpu;dma_controller dma;gpu_driver gpu;central_arbiter arbiter;virtual functionvoidconnect_phase(uvm_phase phase);cpu.req_port.connect(arbiter.cpu_req_imp);dma.req_port.connect(arbiter.dma_req_imp);gpu.req_port.connect(arbiter.gpu_req_imp);endfunction endclass 使用步骤总结使用 _decl 宏的4个步骤1. 声明宏在类定义前使用 uvm_*_imp_decl(_后缀) 2. 声明端口在类中使用 uvm_*_imp_后缀 声明端口 3. 实现方法实现 put_后缀或 get_后缀、transport_后缀方法 4. 连接端口在环境中将发送方的port连接到对应的imp_后缀各种TLM接口的 _decl 宏TLM接口类型宏名称生成类需要实现的方法阻塞Putuvm_blocking_put_imp_decluvm_blocking_put_imp_后缀task put_后缀(T t)非阻塞Putuvm_nonblocking_put_imp_decluvm_nonblocking_put_imp_后缀function bit put_后缀(T t)阻塞Getuvm_blocking_get_imp_decluvm_blocking_get_imp_后缀task get_后缀(output T t)非阻塞Getuvm_nonblocking_get_imp_decluvm_nonblocking_get_imp_后缀function bit get_后缀(output T t)阻塞Transportuvm_blocking_transport_imp_decluvm_blocking_transport_imp_后缀task transport_后缀(T req, output T rsp) 学习建议动手练习基础练习实现示例中的componentA/B/C观察输出扩展练习增加第三个发送方componentD使用_3后缀高级练习实现一个仲裁器根据来源不同给予不同优先级思考问题如果不使用 _decl 宏还有其他方法区分数据来源吗_decl 宏支持的最大后缀数量有限制吗如何为同一个发送方创建多个不同的接收方法 总结uvm_*_imp_decl宏是解决多对一通信区分来源的利器解决问题让接收方能区分不同发送方的数据使用简单声明宏 → 声明端口 → 实现方法 → 连接扩展灵活支持任意数量的发送方区分类型安全保持TLM接口的类型检查记住核心用法多路通信需区分_decl宏来帮忙声明宏在类外边后缀前后要一致端口方法加后缀连接对应用途明。掌握了_decl宏你就能构建更清晰、更可维护的多对一通信系统现在尝试在你的验证平台中应用这个技巧让组件间的通信更加清晰可控吧
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

建立外贸网站多少钱wordpress搭建教程

Seed-Coder-8B-Base能否辅助编写Istio权限策略? 在现代云原生系统中,服务之间每天要完成成千上万次调用。而这些调用背后的安全控制,早已不是“等出了问题再补”的事后措施,而是决定系统是否能上线的核心前提。Istio 的 Authoriz…

张小明 2025/12/27 13:22:49 网站建设

天津网站建站推广页面设计公司排名前十

ThinkJS文件上传架构设计与性能优化完整指南 【免费下载链接】thinkjs 项目地址: https://gitcode.com/gh_mirrors/thin/thinkjs ThinkJS作为基于Koa 2.x开发的现代化Node.js框架,其文件上传机制采用了先进的异步处理架构和流式数据处理技术,为开…

张小明 2025/12/27 13:20:48 网站建设

网站建设系统服务机构成立做网站的公司

海尔智家集成插件:3步搞定HomeAssistant设备互联的完整指南 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 还在为海尔智能设备无法与其他品牌联动而烦恼吗?智能家居的真正价值在于打破设备壁垒,实现全屋…

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

网站开发 总结报告门户网站开发流程视频

智能量化交易执行框架:5大订单拆分策略深度解析与实战指南 【免费下载链接】gs-quant 用于量化金融的Python工具包。 项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant 在当今高速发展的智能量化交易领域,订单拆分策略已成为提升交易执…

张小明 2025/12/30 9:06:38 网站建设

郑州网站优化软件上海 有哪些做网站的公司

LobeChat能否支持WebSocket?实时通信协议测试 在构建现代AI聊天应用时,一个核心挑战是如何让用户“看见”模型思考的过程——不是等待几秒后突然弹出整段回复,而是像有人打字一样,逐字浮现。这种体验的背后,离不开高效…

张小明 2025/12/31 14:37:56 网站建设

复兴区建设局网站商务网站设计与制作

如何快速掌握xPack OpenOCD:嵌入式调试的终极指南 【免费下载链接】openocd-xpack A binary distribution of OpenOCD 项目地址: https://gitcode.com/gh_mirrors/op/openocd-xpack 想要轻松玩转嵌入式系统调试?xPack OpenOCD就是你的最佳选择&am…

张小明 2026/1/1 23:04:31 网站建设