UVM macro有將class裡面的變數打包(pack)成bit或byte stream、解壓(unpack)bit或byte stream填入class的機制。在處理 SPI、I2C 和 RS-232等串行形式的通訊協定時很有用。 有三個主要得打包(pack)和解壓(unpack)的function。
Packing主要有三個function:pack、pack_bytes、pack_ints,pack將此物件以位元連接(bitwise-concatenate)將變數打包到bits、bytes或ints的array裡面。
Unpacking主要有三個function:unpack、unpack_bytes、unpack_ints,unpack從bits、bytes或ints的array把值取出放入object。unpack function的return值是從array中實際unapck的bit的數量。
另外也有do_pack和do_unpack可以客製化自己的pack/unpack function。
下面的例子是將object裡面的變數分別用pack、pack_bytes、pack_ints把資料打包到bits、bytes、ints這三個array中,接下來是用obj2.unpack將bits array的資料填入obj2、用obj2.unpack_bytes將bytes array的資料填入obj2、用obj2.unpack_ints將ints array的資料填入obj2。val1/val2/val3是實際上unpack的bit數量
Example
1 | import uvm_pkg::*; |
Output
1 | # start |
因為pkt資料並沒有變,只是用不同的pack方式把資料打包放入不同的array,pkt2也是用相對應的unpack方式把資料解開放入pkt2對應的變數內,所以pkt2的print結果都是相同的,且val1/val2/val3的值都是0xD(十進位是13),就是addr(4bits)+wdata(4bits)+rdata(4bits)+wr(1bit)的總和。
Using do_pack/do_unpack
和print/copy一樣,pack/unpack一樣可以有do_pack/do_unpack客製化自己的pack/unpack,目前還沒打算練習這個。