VMM SV 队列使用方法求助
`timescale 1ns/100ps
program test_q();
vmm_data p_put,p_get;
vmm_data arr[$];
initial begin
p_put = new();
p_get = new();
arr = {};
begin
p_put.data_id = 10;
$display("the id= %d @%t",p_put.data_id,$time);
arr.push_back(p_put);
p_get=arr.pop_front();
$display("the id= %d @%t",p_get.data_id,$time);
p_get.data_id = 20;
$display("the id= %d @%t",p_put.data_id,$time);
$display("the id= %d @%t",p_get.data_id,$time);
end
end
结果是这样的:
the id= 10 @ 0
the id= 10 @ 0
the id= 20 @ 0
the id= 20 @ 0
我觉得p_get=arr.pop_front();之后再改变p_get.data_id的值不会影响p_put.data_id的值才对,但是结果是影响了,但是原因不明确,感觉是p_get&p_put
还是指向同一块内存的的样子。求大侠解释一下。
看来大神都下班了
求解释
额,好高级,没这么用过
sv里只是淡化了数据和指针的概念。
在学习时一定要心里知道,哪些是数据,哪些是指针。
类的一切例化都是指针。p_put、p_get和arr都是指针。
p_put = new(); //p_put指向实例1
p_get = new(); //p_get指向实例2
p_put.data_id = 10; //p_put指向实例1,其data_id=10。
$display("the id= %d @%t",p_put.data_id,$time); //输出10
arr.push_back(p_put); //arr[0]指向p_put所指的对象,也就是实例1。
p_get=arr.pop_front(); //p_get指向arr[0]所指的对象,也就是实例1。这时已经没任何指针指向实例2了,它会被注销。由于arr被pop,所以arr[0]指针不再存在。
至此为止,p_put和p_get都指向了实例1。
大神就是牛啊
arr.push_back(p_put); //arr[0]指向p_put所指的对象,也就是实例1
个人一直觉得这个队列里面保存的就是p_put 的数据而不是指针,看来理解错误
