在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 291|回复: 6

[求助] sequence中定义了transaction的句柄,为什么不能直接修改句柄中的值呢?

[复制链接]
发表于 2024-11-19 09:52:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
sequence中定义了transaction的句柄,在sequence中直接tr.raddr为什么不能直接修改句柄中的值呢?(注释该语句就能跑,加上就报错)
本意是想在sequence中通过修改tr中的raddr值,让sequence随机不同约束的transaction。


代码如下:
class  transaction1 extends uvm sequence_item;
    int   raddr=0;

    rand bit  Wen;
    rand bit [31:0] Waddr;

    `uvm_object_utils_begin(transaction1)
                  `uvm_field_int(Wen,UVM_ALL_ON)
                  `uvm_field_int(Waddr,UVM_ALL_ON)
     `uvm_object_utils_end

     function new(string name="transaction1");
            super.new(name);
     endfunction

     constraint control_Waddr {
                                                if(raddr==0)Waddr inside {[32'h0:32'hFFFF]};
                                                else if(raddr==1)Waddr inside {[32'hFFFF:32'hFFFF_FFFF]};
                                          }
endclass


class sequence1 extends uvm_sequence #(transaction1);
          transaction    tr;
      `uvm_boject_utils(tr)
  
         function new(string name="tr");
                   super.new(name);
         endfunction

          tr.addr=1;

          virtual task body();
                  `uvm_do(tr)
           endtask
endclass


还望大佬指点迷津,多谢!
 楼主| 发表于 2024-11-19 10:11:48 | 显示全部楼层
不但不能修改transaction中的值,就连打印$display("tr.raddr=%0d",tr.raddr);访问都不行。
请问如何访问才是正确的呢?
发表于 2024-11-19 10:13:38 | 显示全部楼层
Snipaste_2024-11-19_10-12-42.png
1. tr.raddr=1;应该放到body里面去
2. `uvm_do这个宏包括了tr的创建、随机和发送。你如果想在sequence中修改sequence item的值,应使用如下操作(方法不唯一),即tr.raddr=1需要在tr创建之后进行:
`uvm_create(tr)
tr.raddr=1;
tr.randomize();
`uvm_send(tr)
发表于 2024-11-19 10:33:34 | 显示全部楼层
除了楼上说的,你也可以这样写:`uvm_do_with(tr, {tr.addr == 1})
发表于 2024-11-19 10:55:21 | 显示全部楼层


sinva 发表于 2024-11-19 10:33
除了楼上说的,你也可以这样写:`uvm_do_with(tr, {tr.addr == 1})


这个用法很好但是他想控制的是raddr(代码少打了r),不是rand变量
 楼主| 发表于 2024-11-19 11:03:18 | 显示全部楼层


tcz226 发表于 2024-11-19 10:13
1. tr.raddr=1;应该放到body里面去
2. `uvm_do这个宏包括了tr的创建、随机和发送。你如果想在sequence中修 ...


谢谢你,这样写确实可以!
 楼主| 发表于 2024-11-19 11:05:47 | 显示全部楼层


tcz226 发表于 2024-11-19 10:55
这个用法很好但是他想控制的是raddr(代码少打了r),不是rand变量


是的,如果要`uvm_do_with(tr, {tr.addr == 1})这样写,必须在transaction中将int raddr 改为rand类型,虽然不会报错,但是随机会失败,导致直接终止仿真。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-24 12:52 , Processed in 0.019006 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表