代码编织梦想

目录

3.1 uvm_compoent和uvm_object

1.补一张更为全面的uvm库图

 2.uvm_compoent继承于uvm_object,相对又有什么扩展?

3.uvm_compoent相对uvm_object有什么缺失?(纵然uvm_compoent继承于uvm_object)

3.2 UVM的树形结构

1.为什么uvm_compoent在new()的时候要按参数列表指定第二个参数parent?

3.3 filed automation机制

1.filed automation的引入给driver带来的精简变化

2.关于filed automation要注意的点


3.1 uvm_compoent和uvm_object

1.补一张更为全面的uvm库图

注意uvm_compoent和uvm_object的关系,按继承于uvm_object与否分类该图

 2.uvm_compoent继承于uvm_object,相对又有什么扩展?

1.构造函数new(name,parent),可形成树形结构

2.phase自动执行,对比可以回顾transaction是怎么启动

3.uvm_compoent相对uvm_object有什么缺失?(纵然uvm_compoent继承于uvm_object)

由于其树形结构的特性(new时必须指明parent),无法使用uvm_object中的clone函数

3.2 UVM的树形结构

1.为什么uvm_compoent在new()的时候要按参数列表指定第二个参数parent?

更关键的是让每一个在树形图中的comp,能够找到自己的parent和child(如果有的话)

3.3 filed automation机制

1.filed automation的引入给driver带来的精简变化

实际上这部分应该在2.3.7阐述清楚.

在引入filed automation之前,driver代码:

//非完整代码
task my_driver::main_phase(uvm_phase phase);
   my_transaction tr;
   phase.raise_objection(this);
   vif.data <= 8'b0;
   vif.valid <= 1'b0;
   while(!vif.rst_n)
      @(posedge vif.clk);
   for(int i = 0; i < 2; i++) begin 
      tr = new("tr");
      assert(tr.randomize() with {pload.size == 200;});
      drive_one_pkt(tr);
   end
   repeat(5) @(posedge vif.clk);
   phase.drop_objection(this);
endtask

task my_driver::drive_one_pkt(my_transaction tr);
   bit [47:0] tmp_data;
   bit [7:0] data_q[$]; 
  
   //push dmac to data_q
   tmp_data = tr.dmac;
   for(int i = 0; i < 6; i++) begin
      data_q.push_back(tmp_data[7:0]);
      tmp_data = (tmp_data >> 8);
   end
   //push smac to data_q
   tmp_data = tr.smac;
   for(int i = 0; i < 6; i++) begin
      data_q.push_back(tmp_data[7:0]);
      tmp_data = (tmp_data >> 8);
   end
   //push ether_type to data_q
   tmp_data = tr.ether_type;
   for(int i = 0; i < 2; i++) begin
      data_q.push_back(tmp_data[7:0]);
      tmp_data = (tmp_data >> 8);
   end
   //push payload to data_q
   for(int i = 0; i < tr.pload.size; i++) begin
      data_q.push_back(tr.pload[i]);
   end
   //push crc to data_q
   tmp_data = tr.crc;
   for(int i = 0; i < 4; i++) begin
      data_q.push_back(tmp_data[7:0]);
      tmp_data = (tmp_data >> 8);
   end

   `uvm_info("my_driver", "begin to drive one pkt", UVM_LOW);
   repeat(3) @(posedge vif.clk);

   while(data_q.size() > 0) begin
      @(posedge vif.clk);
      vif.valid <= 1'b1;
      vif.data <= data_q.pop_front(); 
   end

   @(posedge vif.clk);
   vif.valid <= 1'b0;
   `uvm_info("my_driver", "end drive one pkt", UVM_LOW);
endtask

引入之后的driver:

//非完整代码
task my_driver::main_phase(uvm_phase phase);
   my_transaction tr;
   phase.raise_objection(this);
   vif.data <= 8'b0;
   vif.valid <= 1'b0;
   while(!vif.rst_n)
      @(posedge vif.clk);
   for(int i = 0; i < 2; i++) begin 
      tr = new("tr");
      assert(tr.randomize() with {pload.size == 200;});
      drive_one_pkt(tr);
   end
   repeat(5) @(posedge vif.clk);
   phase.drop_objection(this);
endtask

task my_driver::drive_one_pkt(my_transaction tr);
   byte unsigned     data_q[];
   int  data_size;
   
   data_size = tr.pack_bytes(data_q) / 8; 
   `uvm_info("my_driver", "begin to drive one pkt", UVM_LOW);
   repeat(3) @(posedge vif.clk);
   for ( int i = 0; i < data_size; i++ ) begin
      @(posedge vif.clk);
      vif.valid <= 1'b1;
      vif.data <= data_q[i]; 
   end

   @(posedge vif.clk);
   vif.valid <= 1'b0;
   `uvm_info("my_driver", "end drive one pkt", UVM_LOW);
endtask

注意观察drive_one_pkt的实现,繁琐重复的队列方法被pack_bytes替代,替代的前提是在transaction中进行了如下注册:

   `uvm_object_utils_begin(my_transaction)
      `uvm_field_int(dmac, UVM_ALL_ON)
      `uvm_field_int(smac, UVM_ALL_ON)
      `uvm_field_int(ether_type, UVM_ALL_ON)
      `uvm_field_array_int(pload, UVM_ALL_ON)
      `uvm_field_int(crc, UVM_ALL_ON)
   `uvm_object_utils_end

2.关于filed automation要注意的点

1.给各个field注册的顺序决定push各个field进data_q的顺序

2.注册的第二个参数可以决定是否加入数据传输等动作中

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41212895/article/details/120794980

uvm:2.3 为验证平台加入各个组件->2.3.7 加入field-爱代码爱编程

1. 前面的my_print,my_copy,my_compare函数,虽然各自不同,但对于transaction来说,都是类似的。使用UVM中的field_automation机制,可以自动实现这3个函数,不需要我们写,my_transaction: `ifndef MY_TRANSACTION__SV `define MY_TRANSACTION

uvm学习笔记--uvm 基础_wonder_coole的博客-爱代码爱编程

1.UVM component相较与UVM object所具有的两大特性: 在new时候通过指定parent参数来形成一种树形结构。具有phase的自动执行的特点。 2.虽然UVM中有一个uvm_transaction类

UVM phase机制(三)objection机制-爱代码爱编程

在上一篇博客UVM phase机制(二)中,我们有介绍到run_phase以及12个run_time_phase是如何运转起来的,但是留了一个小问题就是objection,想要run必须raise_objection,要想结束run必须drop_objection。下面我们详细分析一下为什么会这样 在运行到run_node的时候,是这样一个执行结构, f

Verilog语法【repeat和task】-爱代码爱编程

目录 1.task2.repeat3.testbench使用举例 1.task 语法格式: task my_task; input a, b; inout c; output d, e; begin . . . // statements that perform the work of the task . . . c = foo1; /

一个简单的UVM验证平台-爱代码爱编程

1. SystemC是基于C++的,用户需要自己管理内存,容易发生内存泄漏[^内存泄漏指的是程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃]。 而SystemVerilog则不存在这个问题,而且与Verilog完全兼容,提供DPI接口,而且本身自带内存管理机制,不用担心内存泄漏问题。还支持

LeetCode每日一题(2020.10.17) 709. 转换成小写字母-爱代码爱编程

LeetCode每日一题(2020.10.17)  最难做的事,就是把容易做的事持之以恒。 今日题目: 709. 转换成小写字母  难度:简单 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。 示例 1: 输入: "Hello" 输出

python byte类型_Python处理Bytes类型的心得-爱代码爱编程

最近在写一个采集PLC信号的程序。 用到了PyQt5的QTcpSocket类,接收到的数据类型为QByteArray。以前是用C++ 与QT写的时候,用得挺熟的,就想当然地用了C++的方法。 后来发现数据处理得不太理想,用type()函数一看, QByteArray 切片后,或者用at()提取的数据类型为python3自带的bytes类型。于是,便

uvm 形式验证_5.小白学uvm验证 - squence机制-爱代码爱编程

在第一节中我们提过,为什么不把 transaction 实例化、随机和驱动全部放入 driver 中完成,我们验证的主要工作量,除了搭建验证环境之外,还有一大工作-拼凑场景case,其中不同场景中 transaction 的发送给数量和组织形式各有差异,我们如果把 transaction 放入driver 中,就需要经常改动 driver ,如果将驱动

uvm学习笔记(不断更新中。。。)-爱代码爱编程

记录uvm学习和使用中的一些所得,与君共学,有异之处烦请指出~ 1.使用sequence。 1) 一般在test的main_phase中启动sequence。在UVM中,objection一般伴随着sequence,通常只在sequence出现的地方才提起和撤销objection。 Example: my_sequence seq; phase.rai

ERROR: 报错分析 phase.raise_objection(this)不能是phase.raise_objection(phase)-爱代码爱编程

task run_phase(uvm_phase phase); a_seq a_seq_h; phase.raise_objection(this); a_seq_h=new(); a_seq_h.start(this); phase.drop_objection(this); //this ok ; (phase)

UVM实战 卷I学习笔记1——简单的UVM验证平台:只有driver-爱代码爱编程

目录 验证平台的组成最简单的验证平台——只有driverUVM如何搭建driver:加入factory机制加入objection机制加入virtual interface 个人《UVM实战卷I》学习随手笔记,此书作者:张强 验证平台的组成 一个验证平台要实现的基本功能: 模拟DUT的各种真实使用情况——给DUT施加各种激励→driver实

UVM实战 卷I学习笔记5——UVM基础(1)uvm_component与uvm_object-爱代码爱编程

目录 uvm_component派生自uvm_object常用的派生自uvm_object的类常用的派生自uvm_component的类与uvm_object相关的宏与uvm_component相关的宏uvm_component的限制uvm_component与uvm_object的二元结构 uvm_component派生自uvm_object

《UVM实战卷Ⅰ》学习笔记 前言-爱代码爱编程

目录 1.为什么要写这个专栏? 2.学习《UVM实战卷Ⅰ》的建议 3.其他说明 1.为什么要写这个专栏? 1.尝试使用费曼学习法(即输出式学习法)消化知识 2.个人认为《UVM实战卷Ⅰ》这本书很适合UVM初学者使用,但是网络上关于此书的相关学习经验较少,有部分直接把书中内容搬上来,个人觉得意义不大,因此本专栏会针对某些点进行梳理,梳理过程中可能

《UVM实战卷Ⅰ》学习笔记 第三章 UVM基础(2)-爱代码爱编程

目录 3.4 UVM中打印信息的管理  3.5 config_db机制 1.路径和层次的区别? 2.关于set和get函数的参数列表 3. uvm_compoent注册field automation机制的理由 4.config机制中的非直线获取是什么?有什么意义? 3.4 UVM中打印信息的管理  本小节主要是讲的信息管理,在后续的调试中

《UVM实战卷Ⅰ》学习笔记 第六章 UVM中的sequence(1)-爱代码爱编程

目录 6.1 sequence 1.完善"为什么sequence/sequencer?"这个的逻辑 2.sequencer的定义如此简单,他有有什么作用? 3.seq的启动和执行 6.2 sequence的仲裁机制 1.sqr挂载多个seq时,发送顺序怎么定义? 2.lock/grab/is_relevant/wait_for_relev

《UVM实战卷Ⅰ》学习笔记 第七章 UVM中的寄存器模型(1)-爱代码爱编程

写在前面:本章可能个人认为是全书最为复杂的一章,也是UVM的提升所在.通过自己的学习,自己有以下几点针对本章的学习建议; 1.如果可能的话,建议先有sv验证reg的经验,这样更能体会UVM的方便之处 2.前边六章内容,要熟悉,第七章不会刻意提及前边的知识点 3.如果第一次看不懂不要勉强,多看几次.另外看的时候一定结合代码,必要的时候看看源代码,有助于

uvm学习笔记-爱代码爱编程

使用UVM的第一条原则:验证平台中所有的组件均应派生自UVM中的类。factory机制:必须用宏 uvm_component_utils,uvm_object_utils, uvm_object_utils_begin …