Systemverilog中物件的複製

2021-08-10 12:08:36 字數 1137 閱讀 1646

class transaciton;

static count = 0;

int id;

statics status;

function new();

status = new();

id = count ++ ;

endfunction

endclass

transaction src,dst;

initial begin

src = new();

dst = new src; // 使用new函式複製

src.status.name = 11; // 改變第二層類中的值

dst.status.name = 22; // 改變目標物件中第二層物件的值

$display("%d",src.status.name); //列印的值是22

end

systemverilog中可以使用new函式複製乙個物件到新的物件,但是這種複製只會複製物件現有的變數,所有自己定義的new函式都不會被複製。也就是說,如果乙個類中使用了另乙個類的控制代碼,並且例項化了這個類的物件,使用new函式複製頂層的類的物件時,第二層的物件的控制代碼會被複製進去。也就是說,如果例項化了兩個頂層物件,對其中乙個物件裡面的物件的屬性進行修改時,同樣會修改另乙個頂層物件中的屬性,因為第二個物件複製第乙個物件的時候會將控制代碼也複製過去,而不會使用自己定義的new函式重新例項化物件,因此在第二個物件中修改屬性時,實際上是通過第乙個物件中控制代碼的位址訪問物件的屬性,因此,雖然只修改了乙個屬性,但是在兩個頂層物件中引用的時候,屬性的值都被改變了。上面的**中就存在這種問題。因此為了防止物件的屬性被意外地修改,可以使用copy函式。

function transaction copy;

copy = new(); // 建立新的變數;

copy.id = id;

copy.status = status.copy(); // statics類也要有自己的copy函式

id = count ++ ; // 每次使用new都要讓count 自增一次

endfunction

建立類的時候最好建立copy函式,讓其它類例項化該類的時候,copy不需要再去修改原有類。

SystemVerilog中的Virtual總結

virtual inte ce 隔離抽象模型 class 和實際訊號 port wire reg 可在 過程中動態控制連線訊號。在class內使用,這樣class的不同例項可連外部不同的inte ce例項。inte ce sbus a bus inte ce logic req,grant logi...

systemverilog中關於事件的那些事

說道systemverilog中的執行緒間通訊,不得不說一下事件 event 事件也就兩種 邊沿阻塞 e 和電平阻塞 wait e.triggered 1.事件通過 操作符來觸發事件,通過 或者wait等待事件的觸發。2.相當於verilog中的邊沿觸發,一定要先於 只在觸發的那一瞬間有效 而tri...

SystemVerilog中的型別向下轉換

寫在前面 1 一直以來對這塊理解都不是那麼清楚,只知道個大概,比如只知道 cast做型別向下轉換。今天好好看了下相關的內容,發現自己之前的理解確實有很大的偏差,今天就好好總結下了。2 難得的六一兒童節,祝各位大齡兒童節日快樂。start 1 物件 物件是類的乙個例項。2 控制代碼 指向物件的指標。要...