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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 488|回复: 9

[求助] SV绿皮书有个地方没太看明白

[复制链接]
发表于 2024-9-12 14:56:36 | 显示全部楼层 |阅读模式

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

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

x
为什么5.26不行。它在repaet中先取随机数,再传递出去,为什么说所有被传输的Transaction都有相同的addr值,不应该每次循环都不一样嘛。是只创建一个实例,所以transmit(t)这个任务在运行第一次repeat的时候,哪怕Transaction在变化,transmit也不会运行新的Transaction,直到当前transmit结束,但repeat已经结束。对吗?

p1

p1

p2

p2
发表于 2024-9-12 15:45:41 | 显示全部楼层
注意这句话:“如果transmit的线程需要耗费几个周期完成发送,就有可能出现这种错误”。如果transmit这么写,是否更容易理解:(线程的介绍在第7章)
task transmit(Transaction t);
    总线.data <= t.data;
    fork
        begin
            等待4个时钟周期;
            总线.addr <= t.addr;
        end
    join_none
endtask
发表于 2024-9-12 15:52:33 | 显示全部楼层
因为new的过程本质上是重新分配新的内存空间过程,来让不同的对象的实例化后的调用过程可以互相独立。。。
5.26例子里的错误是generator循环多次生成和发送transaction激励过程中,有且只有一次的new过程,那么这个generator发送的激励在整个验证环境中调用这个Transaction的过程,都是使用同一段内存空间,所以,不管它$random()多少次,所有的打印信息都只是打印同一段内存空间的打印,只是不同时间轴上进行了不同的random变化——那么,他们在环境中不同task和组件中会互相影响——而你的driver/generator一般是需要一定时钟周期来完成单个transaction的发送的,连续发送多个transaction的时候,它的发送过程跟你randomized的过程不同步的,这会导致你的generator来来去去只发送同一个transaction,只是被多次随机化了而已。
类比一下,我们希望激励的生成是同一颗枪管中多颗互相独立的随机子弹,而不是同一颗枪管中只有一颗子弹发射到一半绕回来再次发射,来来去去只发送一颗子弹——且这子弹还有可能因为绕回来的过程变形了。。。
发表于 2024-9-12 15:56:11 | 显示全部楼层
5.14.1中第一段说明了,“当你调用方法的时候,传递的是对象的句柄而非对象本身”。所以例5.26只能接收到n个相同的句柄,相同的句柄当然有相同的地址。
 楼主| 发表于 2024-9-12 21:49:00 | 显示全部楼层


G7ngko 发表于 2024-9-12 15:56
5.14.1中第一段说明了,“当你调用方法的时候,传递的是对象的句柄而非对象本身”。所以例5.26只能接收到n ...


但是5.27中不是也只有一个句柄t嘛?
 楼主| 发表于 2024-9-12 21:51:20 | 显示全部楼层


tcz226 发表于 2024-9-12 15:45
注意这句话:“如果transmit的线程需要耗费几个周期完成发送,就有可能出现这种错误”。如果transmit这么写 ...


就是transmit的线程中addr一直是一开始的,但是同时repeat线程中ADDR会一直变,但是变得ADDR不会被传递进transmit的线程中,对吗
发表于 2024-9-13 09:18:09 | 显示全部楼层


A1eksib_ 发表于 2024-9-12 21:49
但是5.27中不是也只有一个句柄t嘛?


5.27中new被重复调用了n次,每次调用new都会生成一个新的句柄,此时t = new让t指向了刚刚生成的Transaction,下一次repeat的时候又指向了另一个生成的Transaction。
发表于 2024-9-13 09:22:28 | 显示全部楼层


A1eksib_ 发表于 2024-9-12 21:51
就是transmit的线程中addr一直是一开始的,但是同时repeat线程中ADDR会一直变,但是变得ADDR不会被传递进 ...


不对。
我举个例子,n=10即重复10次,编号为0~9,每个Transaction的addr也是对应的0~9。我们等待10个Transaction全部发送完之后再去检测他们地址,5.26的写法你会得到10个相同的Transaction,其addr都是9;5.27你会得到10个不同的Transaction,addr从0~9。
 楼主| 发表于 2024-9-13 09:23:18 | 显示全部楼层


qsh123_123 发表于 2024-9-12 15:52
因为new的过程本质上是重新分配新的内存空间过程,来让不同的对象的实例化后的调用过程可以互相独立。。。
...


明白了,感谢回答!
 楼主| 发表于 2024-9-13 09:46:22 | 显示全部楼层


G7ngko 发表于 2024-9-13 09:22
不对。
我举个例子,n=10即重复10次,编号为0~9,每个Transaction的addr也是对应的0~9。我们等待10个Tran ...


理解了,感谢解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-8 22:39 , Processed in 0.023356 second(s), 6 queries , Gzip On, Redis On.

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