UVM 实战 2.2.1 代码修改

文章讲述了在UVM实战中遇到的while循环问题,由于rst_n信号初始值为未知,导致while条件不成立。通过添加延迟解决了问题,波形图显示数据发送在rst_n变为1后。文章强调这是timeslot调度问题,给出了相关书籍和链接以供深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

UVM 实战
代码清单2-2
14-15行,while循环不能进入


一、UVM 实战 2.2.1 代码修改

    while(!top_tb.rst_n)
        @(posedge top_tb.clk);

//作者的意图是rst_n跳变为1之前,阻塞住task
实际的仿真,并不能进入while循环。
原因是:rst_n初始值为x,赋值为0的时候,while循环被跳过去了。

经老师傅指导,在while之前加入一个延迟#0

    #0
    while(!top_tb.rst_n)
        @(posedge top_tb.clk);

等待rst_n赋值完成。

二、成功后的波形图

如下图,红色箭头标识处,可以看到rxd在rst_n跳变为1之后发送数据,而不是从0时刻开始咔哧咔哧乱发了。
在这里插入图片描述


总结

这其实是个time slot调度的问题。rst_n 在赋值为0之前,while读到的是 x。
详细原理请参考:
1、绿宝书(SystemVerilog验证, 测试平台编写指南),4.3.5 程序块和时序区域(Timing Region),P76。
2、http://lihuaxi.xjx100.cn/news/1309694.html,详解SystemVerilog中time slot的调度。

### 关于 UVM 实战 示例代码 的下载 为了获取《UVM 实战》一书的示例代码,可以通过以下途径完成: #### 官方资源 官方提供的随书源码可以直接通过书籍附带的信息访问。根据描述,书中提到的 `puvm.tar.gz` 是示例代码的核心部分[^1]。此压缩包包含了所有的示例代码,位于 `src` 文件夹下。 - **下载链接**: 可以通过书籍官网或者指定页面找到下载入口。具体路径为: [https://www.hzcourse.com/oep/resource/access/...](https://www.hzcourse.com/oep/resource/access/L29wZW5yZXNvdXJjZXMvdGVhY2hfcmVzb3VyY2UvZmlsZS8yMDE3LzEwL2IyMDE0OTFmMmUxMjdkNTM2YjhmMjBmNWUzMTRhMjE3Lmd6JGV4YW1wbGVfYW5kX3V2bV9zb3VyY2VfY29kZS50YXIuZ3o=)[^5] #### 博客与第三方分享 除了官方渠道外,许多博主也整理了相关内容并上传至 GitHub 或其他共享平台。例如,在博客中提及的一个 Git 地址提供了完整的 UVM 源码和示例代码集合[^2]: ```plaintext https://github.com/emwzq/example_uvm ``` 在此仓库中,不仅有基础的 UVM 环境搭建指南,还包含如何运行示例代码的具体说明。 --- ### 如何使用示例代码? 一旦成功下载并解压文件后,可以根据以下指导操作: 1. **阅读 README 文档** - 解压后的根目录通常会有一个名为 `README` 或类似的文档,它详细介绍了如何设置环境变量以及修改配置文件(如 `setup.XXX`),以便顺利执行代码2. **调整环境配置** - 修改配置文件时需注意本地安装的 UVM 路径是否正确匹配。对于 CentOS 7 用户而言,这一步尤为重要。 3. **编译与测试** - 使用仿真工具加载项目中的 `.sv` 文件,并按照指引逐步调试各个模块的功能实现情况。 以下是基于 UVM 工厂机制的一段简单代码片段展示[^4]: ```systemverilog class my_driver extends uvm_driver #(my_transaction); `uvm_component_utils(my_driver) function new(string name, uvm_component parent); super.new(name, parent); endfunction : new task run_phase(uvm_phase phase); forever begin seq_item_port.get_next_item(req); // Process the request item here... seq_item_port.item_done(); end endtask : run_phase endclass : my_driver ``` 上述例子展示了驱动器类的设计方式及其生命周期管理逻辑。 --- ### 注意事项 尽管网络上有大量教程帮助初学者构建自己的验证平台,但在实际动手之前仍建议仔细研读原版资料[^3]。只有深刻理解每一段程序背后的原理才能更好地应对复杂场景下的挑战。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值