亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

SystemVerilog對(duì)象拷貝與參數(shù)化類:驗(yàn)證環(huán)境實(shí)戰(zhàn)陷阱解析

SystemVerilog對(duì)象拷貝與參數(shù)化類:驗(yàn)證環(huán)境實(shí)戰(zhàn)陷阱解析 做驗(yàn)證的兄弟應(yīng)該都撞見過(guò)這種鬼打墻的 bug你在 scoreboard 里比較完數(shù)據(jù)順手改了一下某個(gè) transaction 的字段做 debug結(jié)果下一拍發(fā)現(xiàn) reference model 那邊的同一筆數(shù)據(jù)也變了。代碼邏輯翻來(lái)覆去看了三遍沒有任何人對(duì)參考模型寫過(guò)數(shù)據(jù)。最后實(shí)在沒辦法把兩個(gè)對(duì)象的地址打出來(lái)一看——好家伙根本是同一個(gè)對(duì)象。這就是 SystemVerilogSV對(duì)象拷貝里最經(jīng)典的淺拷貝陷阱你以為是復(fù)制了一份數(shù)據(jù)實(shí)際上只是復(fù)制了一個(gè)句柄兩個(gè)變量牢牢握著同一塊內(nèi)存。再說(shuō)到標(biāo)題里的另一個(gè)主角參數(shù)化的類很多朋友剛接觸 SV 面向?qū)ο缶幊虝r(shí)會(huì)把它當(dāng)成 C 模板的低配版簡(jiǎn)單用class #(type T int)包一層就覺得完事。實(shí)際在驗(yàn)證環(huán)境里對(duì)象拷貝、參數(shù)化類和數(shù)據(jù)類型轉(zhuǎn)換這三件事是纏在一起的參數(shù)化類經(jīng)常接收不同類型的 transaction而不同類型的對(duì)象在發(fā)出去之前往往需要做動(dòng)態(tài)轉(zhuǎn)換轉(zhuǎn)換失敗又可能引出一堆和拷貝相關(guān)的連帶問(wèn)題。這篇文章就把這三件事從原理到實(shí)操捋一遍最后再分享幾個(gè)我在真實(shí)項(xiàng)目里踩過(guò)、填過(guò)、覺得值得記住的坑。1. 改了 A 卻影響了 B對(duì)象拷貝中最常見的句柄共享事故1.1 一個(gè)能完美復(fù)現(xiàn)問(wèn)題的最小用例先把問(wèn)題現(xiàn)場(chǎng)還原出來(lái)。假設(shè)我們有一個(gè)最簡(jiǎn)單的包c(diǎn)lass pkt; int data; int id; endclass然后寫兩行幾乎所有人都寫過(guò)的代碼pkt a; pkt b; a new(); a.data 100; a.id 1; b a; // 你以為復(fù)制了一份 b.data 200; $display(a.data %0d, b.data %0d, a.data, b.data);這段代碼的打印結(jié)果是a.data 200, b.data 200。如果你心里預(yù)期的結(jié)果是a.data 100那你就撞上了 SV 對(duì)象語(yǔ)義里最基礎(chǔ)的一個(gè)特點(diǎn)b a并不會(huì)創(chuàng)建一個(gè)新對(duì)象它只是把a(bǔ)這個(gè)句柄的值復(fù)制給了b兩個(gè)名字指到同一個(gè)對(duì)象上去了。很多從 C 語(yǔ)言或者從 Verilog 的reg、wire思維轉(zhuǎn)過(guò)來(lái)的朋友剛開始非常不適應(yīng)這件事。因?yàn)樵?C 里結(jié)構(gòu)體變量之間可以直接賦值值是整體搬過(guò)去的在 SV 里類變量不是值是引用。你復(fù)制引用不會(huì)復(fù)制對(duì)象就像你抄了一份通訊錄的地址不代表你把那個(gè)人也復(fù)制了一份。1.2 句柄、對(duì)象與內(nèi)存地址先把這個(gè)基礎(chǔ)焊死要徹底理解對(duì)象拷貝必須分清楚三個(gè)概念句柄handle、對(duì)象object和內(nèi)存地址。我們寫pkt a new();干的事情是在仿真器的堆上創(chuàng)建了一個(gè)pkt對(duì)象然后把指向這塊內(nèi)存的門牌號(hào)存進(jìn)變量a。a本身不是對(duì)象a是一個(gè)存放著對(duì)象地址的句柄變量。所以在 SV 里兩個(gè)句柄指向同一個(gè)對(duì)象是非常常見、也非常合法的狀態(tài)這不叫兩個(gè)一樣的對(duì)象而是對(duì)同一對(duì)象的兩個(gè)稱呼。一個(gè)更生活化的類比是對(duì)象是房子句柄是門牌號(hào)。b a只是把門牌號(hào)又抄了一份給你兩個(gè)人還是拿著同一個(gè)門牌號(hào)去找同一棟房子。你在房子 A 里重新裝修拿著另一份門牌號(hào)的 B 過(guò)來(lái)看看到的當(dāng)然也是裝修后的樣子。理解了這一點(diǎn)再看下面這些行為就會(huì)很清晰操作結(jié)果是否創(chuàng)建新對(duì)象b a;b 和 a 指向同一對(duì)象否b new(); b.copy(a);b 是新對(duì)象成員值來(lái)自 a是b a.copy();若實(shí)現(xiàn)了 copy 返回新對(duì)象是b new a;取決于類中是否定義接收 a 的構(gòu)造函數(shù)不一定1.3 從共享到獨(dú)立究竟差在哪知道了b a是共享句柄之后問(wèn)題就變成怎么讓兩個(gè)對(duì)象真正獨(dú)立最常見的偷懶寫法是b new(); b.data a.data; b.id a.id;這個(gè)寫法對(duì)只有兩個(gè)成員的類沒有問(wèn)題但 transaction 的成員通常不止兩三個(gè)。典型的一個(gè)總線事務(wù)對(duì)象可能有十幾個(gè)字段還有定長(zhǎng)數(shù)組、動(dòng)態(tài)數(shù)組、隊(duì)列、事件、其他對(duì)象的句柄甚至還要處理嵌套對(duì)象。你寫幾次b.xxx a.xxx就知道這種純手工逐字段復(fù)制的做法多寫兩個(gè)類之后一定會(huì)漏字段。前面表格里還提到一種寫法是b new a;這里要特別提醒SystemVerilog 不會(huì)像 C 那樣自動(dòng)給你生成一個(gè)以同類對(duì)象為入?yún)⒌目截悩?gòu)造函數(shù)。b new a實(shí)際調(diào)用的是new(a)這個(gè)調(diào)用能不能編譯、語(yǔ)義是否做拷貝完全取決于類里面有沒有顯式定義一個(gè)接收a類型參數(shù)的function new。如果類里沒有定義很多仿真器會(huì)直接報(bào)錯(cuò)或者行為未定義如果定義了那也是你寫的邏輯在起作用而不是語(yǔ)言默認(rèn)幫你拷貝。所以 SV 社區(qū)里最常見的、可移植性最好的拷貝方式是自己實(shí)現(xiàn)一個(gè)copy()方法不要依賴這種語(yǔ)法糖。2. 淺拷貝和深拷貝的本質(zhì)new、copy 與 clone 的分工2.1 默認(rèn)行為解剖為什么 SV 不自動(dòng)給你一個(gè)拷貝構(gòu)造既然標(biāo)準(zhǔn)庫(kù)沒有默認(rèn)拷貝構(gòu)造那我們就得自己把拷貝這件事做對(duì)。在做之前先明確兩個(gè)概念淺拷貝shallow copy和深拷貝deep copy。淺拷貝的定義是新對(duì)象創(chuàng)建出來(lái)后每個(gè)成員變量的值都復(fù)制了一遍。這句話聽起來(lái)很簡(jiǎn)單但有一個(gè)埋伏如果某個(gè)成員本身是另一個(gè)對(duì)象句柄那么復(fù)制這個(gè)句柄的值只是讓新對(duì)象和舊對(duì)象指向同一個(gè)子對(duì)象。舉個(gè)例子class addr_t; int addr; endclass class pkt; int id; addr_t addr; endclass如果我們寫一個(gè)淺拷貝函數(shù)function pkt shallow_copy(); shallow_copy new(); shallow_copy.id this.id; shallow_copy.addr this.addr; // 只復(fù)制了句柄兩個(gè)對(duì)象的 addr 還是同一個(gè) endfunction那么復(fù)制出來(lái)的pkt對(duì)象它的addr成員和原來(lái)的addr成員仍然共享同一個(gè)addr_t對(duì)象。這不一定都是壞事但它一定是你需要明確知道的語(yǔ)義。如果你在復(fù)制后把那邊的addr.addr改了這邊的也會(huì)跟著改。深拷貝則是不僅復(fù)制頂層對(duì)象還要把頂層對(duì)象手里所有的子對(duì)象、數(shù)組元素、隊(duì)列元素等全部遞歸復(fù)制一遍。深拷貝之后新舊對(duì)象之間除了字段值相同再?zèng)]有任何共享內(nèi)存。2.2 自實(shí)現(xiàn) copy 函數(shù)處理基本成員、對(duì)象成員與隊(duì)列成員在 SV 里一個(gè)可復(fù)用的深拷貝函數(shù)通常按下面幾步來(lái)寫。第一步處理所有內(nèi)建值類型成員int、bit、logic、enum、string等。這些直接賦值即可。第二步處理對(duì)象引用成員。對(duì)每個(gè)類成員要么調(diào)用它自己的copy()方法要么new()一個(gè)新的再逐字段賦值。第三步處理動(dòng)態(tài)數(shù)組、隊(duì)列、關(guān)聯(lián)數(shù)組。這一步最容易被漏。因?yàn)?SV 的數(shù)組賦值是比較智能的直接new_array old_array可以復(fù)制整個(gè)數(shù)組內(nèi)容所以不少人以為隊(duì)列也可以直接賦值就完事了。對(duì)動(dòng)態(tài)數(shù)組和隊(duì)列來(lái)說(shuō)直接賦值確實(shí)會(huì)復(fù)制元素但如果元素本身是對(duì)象句柄那復(fù)制的是句柄數(shù)組數(shù)組里的對(duì)象仍然是共享的。想深拷貝數(shù)組對(duì)象得用循環(huán)逐個(gè) deep copy。第四步處理可能存在的自引用和循環(huán)引用。比如類 A 里有一個(gè)A next成員深拷貝時(shí)如果不加判斷會(huì)無(wú)限遞歸下去。簡(jiǎn)單場(chǎng)景可以約定好只深拷貝數(shù)據(jù)對(duì)象不深拷貝連接關(guān)系復(fù)雜場(chǎng)景可以維護(hù)一個(gè)已經(jīng)拷貝過(guò)的舊對(duì)象到新對(duì)象的映射表碰到已拷貝過(guò)的對(duì)象直接返回已有副本。一個(gè)比較完整的手寫深拷貝模板如下class pkt; int id; string name; int payload[$]; addr_t addr; bit has_addr; function pkt copy(); pkt c new(); c.id this.id; c.name this.name; c.payload this.payload; // 隊(duì)列整體復(fù)制元素是 int沒問(wèn)題 if (this.has_addr) begin c.addr new(); c.addr.addr this.addr.addr; end c.has_addr this.has_addr; return c; endfunction function void copy_to(pkt rhs); rhs.id this.id; rhs.name this.name; rhs.payload this.payload; if (this.has_addr) begin if (rhs.addr null) rhs.addr new(); rhs.addr.addr this.addr.addr; end rhs.has_addr this.has_addr; endfunction endclass這里我故意寫了兩個(gè)函數(shù)一個(gè)copy()返回新對(duì)象一個(gè)copy_to(rhs)把內(nèi)容復(fù)制到一個(gè)已存在的對(duì)象。為什么需要兩個(gè)因?yàn)轵?yàn)證環(huán)境里兩種場(chǎng)景都有scoreboard 里希望再搞一個(gè)一樣的對(duì)象存起來(lái)用copy()driver 里希望把已經(jīng)創(chuàng)建好的對(duì)象內(nèi)容更新一下用copy_to()更省內(nèi)存。2.3 UVM 環(huán)境里 copy/clone 的常見約定如果你已經(jīng)在用 UVM很多對(duì)象繼承自u(píng)vm_objectUVM 自己有一套拷貝機(jī)制。核心是兩個(gè) virtual 方法copy和clone。默認(rèn)行為是copy調(diào)用do_copyclone創(chuàng)建新對(duì)象后調(diào)用copy。如果你的類沒有實(shí)現(xiàn)do_copy那么copy什么都不做clone只會(huì)返回一個(gè)空對(duì)象。UVM 的uvm_object_utils宏配合 field automation 時(shí)copy會(huì)按照字段宏定義逐個(gè)復(fù)制。但這里有個(gè)容易忽略的點(diǎn)field automation 對(duì)對(duì)象字段比如uvm_object_field默認(rèn)只復(fù)制句柄也就是淺拷貝。你聲明了uvm_object_utils不代表自動(dòng)深拷貝要深拷貝嵌套對(duì)象必須在do_copy里顯式處理或者約定好被嵌套對(duì)象不可變。我見過(guò)不少團(tuán)隊(duì)在項(xiàng)目手里的 base transaction 里實(shí)現(xiàn)一次完整的深拷貝copy然后所有派生事務(wù)類在重寫do_copy時(shí)先super.do_copy(rhs)再補(bǔ)自己新增的字段。這個(gè)思路簡(jiǎn)單又不容易漏推薦給還沒形成規(guī)范的項(xiàng)目。3. 驗(yàn)證環(huán)境里對(duì)象拷貝的實(shí)戰(zhàn)位置從 driver 到 scoreboard3.1 transaction 對(duì)象在組件間流動(dòng)時(shí)哪些環(huán)節(jié)必須拷貝搞清楚了拷貝的機(jī)制再把它放進(jìn)完整驗(yàn)證環(huán)境的上下文里。一個(gè)典型的約束隨機(jī)驗(yàn)證平臺(tái)里transaction 對(duì)象是這樣流動(dòng)的generator 生成對(duì)象通過(guò) sequencer/driver 轉(zhuǎn)成接口信號(hào)monitor 從接口采樣得到對(duì)象發(fā)給 scoreboard 和 reference model。在這條鏈路上并不是每個(gè)環(huán)節(jié)都要拷貝。需要拷貝的地方通常是這兩類第一類是存檔場(chǎng)景。scoreboard 里經(jīng)常需要一個(gè)期望值隊(duì)列把進(jìn)入 DUT 之前的數(shù)據(jù)包保存起來(lái)等 DUT 輸出再做比對(duì)。如果直接把 generator 的那個(gè)句柄塞進(jìn)隊(duì)列后續(xù) driver 把同一對(duì)象改掉scoreboard 里存的東西也被改了比對(duì)就全面失真。這種場(chǎng)景必須深拷貝一份再入隊(duì)。第二類是并發(fā)處理場(chǎng)景。一個(gè)事務(wù)對(duì)象同時(shí)被多個(gè) component 處理時(shí)如果 A 組件要對(duì)它做標(biāo)記、加字段、改狀態(tài)而 B 組件希望看到原始狀態(tài)那么必須先復(fù)制出一份獨(dú)立對(duì)象給 A 用。不復(fù)制的話A 的修改會(huì)像一個(gè)全局變量一樣毒化所有引用者。不需要拷貝的場(chǎng)景interface 信號(hào)驅(qū)動(dòng)、mailbox 的純傳遞、只讀的數(shù)據(jù)分析。在這些場(chǎng)景里拷貝純屬浪費(fèi)仿真時(shí)間和內(nèi)存。3.2 mailbox 傳輸?shù)目截惻c否一種常見的性能與正確性權(quán)衡mailbox 是 SV 里最常用的線程間通信手段但它傳遞的同樣只是句柄。很多人也有一個(gè)疑問(wèn)把對(duì)象放進(jìn) mailbox要不要先 copy 一份答案取決于接收方是否會(huì)修改對(duì)象。如果接收方拿到對(duì)象后只是讀取并轉(zhuǎn)換成信號(hào)那么不拷貝沒有任何問(wèn)題還更高效。如果接收方拿到后要修改并且發(fā)送方之后還會(huì)用這個(gè)對(duì)象那么不拷貝就有隱患。一個(gè)比較穩(wěn)妥的約定是發(fā)送方一旦把對(duì)象放進(jìn) mailbox就視為所有權(quán)移交。后續(xù)想再保留數(shù)據(jù)發(fā)送方在 put 之前自己先深拷貝留存接收方擁有對(duì)對(duì)象的修改權(quán)。這樣責(zé)任邊界清晰不容易出現(xiàn)兩邊同時(shí)改一個(gè)對(duì)象的競(jìng)爭(zhēng)。一個(gè)額外提醒如果發(fā)送方在循環(huán)中重復(fù)使用同一個(gè)句柄發(fā)數(shù)據(jù)比如forever begin trans new(); // 隨機(jī)化、填充字段 mb.put(trans); end這種情況每次都是新對(duì)象不需要拷貝。但如果是復(fù)用同一個(gè)對(duì)象forever begin // 不重新 new只改改字段再發(fā) trans.data data; mb.put(trans); end接收方拿到的每一個(gè)包實(shí)際上都是同一個(gè)對(duì)象。等下一個(gè)循環(huán)改了data已經(jīng)進(jìn)入 mailbox 的包也會(huì)跟著變。這種 bug 比淺拷貝更隱蔽因?yàn)樗雌饋?lái)是每一包數(shù)據(jù)都一樣而不是某一包被篡改。排查到最后往往要打地址才會(huì)恍然大誤所有包全是一個(gè)地址。3.3 拷貝實(shí)踐中的典型錯(cuò)誤與查驗(yàn)習(xí)慣我在實(shí)際項(xiàng)目里見到的、以及自己犯過(guò)的典型錯(cuò)誤大致有這么幾類第一類定義了copy()但忘記維護(hù)新增字段。類加了一個(gè)新字段copy()沒同步更新導(dǎo)致復(fù)制出來(lái)的對(duì)象某些字段是默認(rèn)值。這個(gè)錯(cuò)誤平時(shí)很難發(fā)現(xiàn)因?yàn)榇蠖鄶?shù)時(shí)候你不比對(duì)每個(gè)字段只有在某個(gè)用例數(shù)據(jù)恰好依賴那個(gè)字段時(shí)才爆發(fā)。應(yīng)對(duì)辦法每次改 transaction 類時(shí)強(qiáng)制看一眼copy/do_copy方法或者干脆在 base 類里加一個(gè)自查方法比較兩個(gè)對(duì)象所有字段是否一致測(cè)試時(shí)點(diǎn)用一下。第二類把淺拷貝當(dāng)深拷貝用。對(duì)象成員、動(dòng)態(tài)數(shù)組里的對(duì)象元素都沒復(fù)制導(dǎo)致所有引用者共享子對(duì)象。尤其 UVM 的 field automation 默認(rèn)淺拷貝這個(gè)坑非常容易踩。寫代碼前先問(wèn)自己一句這個(gè)對(duì)象會(huì)不會(huì)在被復(fù)制之后繼續(xù)被別人改如果會(huì)請(qǐng)確認(rèn)嵌套成員都是深拷貝。第三類拷貝后忘記恢復(fù)隨機(jī)化狀態(tài)。SV 類的randomize()每次調(diào)用都會(huì)重新隨機(jī)如果拷貝函數(shù)內(nèi)部動(dòng)不動(dòng)new()出一個(gè)新對(duì)象把原來(lái)已經(jīng)滿足約束的數(shù)據(jù)覆蓋成隨機(jī)值就會(huì)出現(xiàn)比較不過(guò)但不知道哪里錯(cuò)的詭異問(wèn)題??截惡瘮?shù)要嚴(yán)格只復(fù)制、不隨機(jī)。檢驗(yàn)拷貝是否深的一個(gè)好辦法復(fù)制后把舊對(duì)象里最內(nèi)層的一個(gè)字段改掉看新對(duì)象是否跟著變。寫一個(gè)調(diào)試用的check_independent()函數(shù)在測(cè)試環(huán)境常駐比事后排查省時(shí)間得多。4. 參數(shù)化類把一類多用寫進(jìn)類型系統(tǒng)4.1 參數(shù)化類解決了什么痛點(diǎn)對(duì)比宏定義和基礎(chǔ)類繼承對(duì)象拷貝解決的是內(nèi)容獨(dú)立參數(shù)化類解決的是類型通用。兩者在驗(yàn)證組件復(fù)用里經(jīng)常遇到。假設(shè)你要寫一個(gè)通用的generator它可以產(chǎn)生eth_pkt也可以產(chǎn)生axi_txn還可以產(chǎn)生i2c_seq。不用參數(shù)化的時(shí)候有兩條路一條路是寫一個(gè)以u(píng)vm_object為基類的通用類內(nèi)部保存uvm_object item然后在具體使用點(diǎn)把它$cast成目標(biāo)類型。這條路的問(wèn)題在于類型安全性差$cast失敗要到運(yùn)行期才能發(fā)現(xiàn)而且代碼里到處是類型轉(zhuǎn)換可讀性差。另一條路是用define宏生成整套代碼。宏替換做的代碼生成雖然也能復(fù)制代碼但它繞過(guò)了類型檢查、函數(shù)作用域和調(diào)試器宏展開的錯(cuò)誤信息經(jīng)常把真實(shí)行號(hào)搞沒維護(hù)成本非常高。參數(shù)化類把類型作為參數(shù)傳入相當(dāng)于讓編譯器幫你做類型檢查同時(shí)保留一套代碼的維護(hù)便利性。你用一份generator的實(shí)現(xiàn)就能生成generator#(eth_pkt)、generator#(axi_txn)這些類型特化每個(gè)特化都有自己的類型安全約束。4.2 語(yǔ)法拆解類型參數(shù)、整數(shù)參數(shù)、默認(rèn)值與實(shí)例化參數(shù)化類的語(yǔ)法本身并不復(fù)雜核心是把參數(shù)列表放在類名后面class generator #(type T uvm_object, int MAX_CNT 100); T current_item; int cnt; function new(string name generator); super.new(name); endfunction task run_phase(uvm_phase phase); repeat (MAX_CNT) begin if (!$cast(current_item, create_item())) begin uvm_fatal(CAST, $sformatf(cannot cast to %s, current_item.get_type_name())) end item_port.write(current_item); end endtask // 由子類重寫 virtual function T create_item(); create_item null; endfunction endclass實(shí)例化也沒有特殊之處generator#(eth_pkt) eth_gen; eth_gen generator#(eth_pkt)::type_id::create(eth_gen, this);需要注意幾個(gè)細(xì)節(jié)。第一參數(shù)列表里type T是類型參數(shù)int MAX_CNT 100是值參數(shù)值參數(shù)必須帶默認(rèn)值或者在使用時(shí)顯式給出否則實(shí)例化時(shí)編譯器會(huì)抱怨參數(shù)不夠。第二參數(shù)化類作為基類使用時(shí)子類必須指定參數(shù)不能繼續(xù)留一個(gè)未決定的 Tclass eth_generator extends generator#(eth_pkt); virtual function eth_pkt create_item(); eth_pkt p eth_pkt::type_id::create(p); return p; endfunction endclass第三如果你需要在類外前向聲明一個(gè)參數(shù)化類語(yǔ)法要寫成typedef class generator#(type T);不過(guò)這個(gè)寫法在不同仿真器上支持程度不完全一致如果你的仿真器不支持可以考慮換一種設(shè)計(jì)盡量避免對(duì)參數(shù)化類做前向聲明。4.3 參數(shù)化類中的靜態(tài)成員與常見假象參數(shù)化類一個(gè)容易出問(wèn)題的點(diǎn)是static成員。普通類里static成員是全局唯一的參數(shù)化類里的static成員按 SystemVerilog 標(biāo)準(zhǔn)每個(gè)特化類型各有自己的一份。class typed_pool #(type T); static int pool_count; endclasstyped_pool#(A)::pool_count和typed_pool#(B)::pool_count是兩個(gè)完全獨(dú)立的變量。有些人會(huì)以為只要是 typed_pool 都是同一個(gè)靜態(tài)變量結(jié)果 A 類型累加了一個(gè)計(jì)數(shù)B 類型卻看不到查半天根本原因。這個(gè)行為在不同仿真器上曾經(jīng)也有過(guò)不一致的 bug如果你要大規(guī)模使用參數(shù)化類的靜態(tài)成員建議在項(xiàng)目初期先做一個(gè)最小用例跑一遍目標(biāo)仿真器確認(rèn)行為。還有一個(gè)常見的假象是兩個(gè)不同參數(shù)的特化類不要指望它們之間可以隨意賦值。generator#(eth_pkt)和generator#(axi_txn)是完全不同的類型即使它們的代碼結(jié)構(gòu)一模一樣。如果你想讓它們之間做某種通用操作必須讓它們繼承同一個(gè)非參數(shù)化基類。5. 參數(shù)化類 數(shù)據(jù)類型轉(zhuǎn)換搭建一個(gè)類型安全的通用組件5.1 實(shí)戰(zhàn)需求一個(gè)可以指定事務(wù)類型的通用 generator最典型的組合使用場(chǎng)景是搭建一個(gè)帶約束的通用 generator它只負(fù)責(zé)生成、隨機(jī)化、發(fā)送對(duì)象至于具體生成什么類型的對(duì)象由參數(shù)T決定。比如 UART 項(xiàng)目需要一個(gè)uart_txn生成器SPI 項(xiàng)目需要一個(gè)spi_txn生成器代碼 90% 是重復(fù)的。參數(shù)化類把它縮成一份class gen_t #(type T uvm_sequence_item) extends uvm_sequence #(T); constraint c_default { item.size inside {[1:16]}; } virtual task body(); repeat (10) begin uvm_do(item) end endtask endclass這里面的關(guān)鍵技術(shù)點(diǎn)在于uvm_sequence #(T)的REQ類型已經(jīng)被參數(shù)化為 TUVM 的宏uvm_do(item)會(huì)自動(dòng)對(duì) item 做正確的類型處理。如果不用參數(shù)化類你就得為每個(gè)事務(wù)類型各寫一個(gè)幾乎相同的 sequence 子類或者在基類里寫一個(gè)uvm_sequence_item類型的 item然后再在 body 里到處$cast。對(duì)象拷貝在這里也有一席之地當(dāng)你用uvm_do產(chǎn)生一個(gè) item 時(shí)UVM 內(nèi)部會(huì)調(diào)用 clone 將 item 復(fù)制到 sequencer 的請(qǐng)求隊(duì)列。如果你自己的事務(wù)類沒有實(shí)現(xiàn)正確的 copy/clone那么 sequence 里生成的事務(wù)和 sequencer 實(shí)際收到的可能就是兩個(gè)不同的東西甚至 field 都是默認(rèn)值。所以參數(shù)化組件和拷貝機(jī)制不是兩個(gè)孤立話題它們?cè)谀愕沫h(huán)境里始終是一起工作的。5.2 $cast 與靜態(tài)轉(zhuǎn)換類型轉(zhuǎn)換在參數(shù)化場(chǎng)景下的正確用法參數(shù)化類里的T雖然類型安全但一旦你把T類型的對(duì)象放到一個(gè)更通用的容器里比如uvm_object類型的成員或者uvm_tlm_fifo#(uvm_object)取出來(lái)的時(shí)候仍然要做類型轉(zhuǎn)換。SV 的對(duì)象類型轉(zhuǎn)換有兩種靜態(tài)轉(zhuǎn)換語(yǔ)法dst target_type(src)。對(duì)數(shù)值類型很常用比如把int轉(zhuǎn)成bit[7:0]會(huì)做截?cái)喟裭ogic[15:0]轉(zhuǎn)成int可能做位寬擴(kuò)展。對(duì)對(duì)象類型靜態(tài)轉(zhuǎn)換只是一個(gè)編譯期的斷言它告訴編譯器請(qǐng)認(rèn)為這個(gè)句柄是目標(biāo)類型但運(yùn)行時(shí)如果實(shí)際類型不匹配行為是未定義的通常會(huì)讓仿真崩潰或者返回一個(gè)無(wú)效的句柄。所以對(duì)對(duì)象類型進(jìn)行向下轉(zhuǎn)換時(shí)永遠(yuǎn)優(yōu)先用$cast。$cast有兩種用法一種是函數(shù)形式eth_pkt p; if (!$cast(p, obj)) begin uvm_error(CAST, obj is not eth_pkt) end另一種是void $cast(p, obj);用于你確定類型一定匹配、并且不想檢查返回值的場(chǎng)景。前者用于防御式編程后者用于性能敏感且邏輯已保證安全的場(chǎng)景。在參數(shù)化類里因?yàn)門是編譯期已知的類型你往往可以直接把uvm_object轉(zhuǎn)回Tclass consumer_t #(type T uvm_object) extends uvm_component; uvm_tlm_fifo#(uvm_object) fifo; virtual task run_phase(uvm_phase phase); uvm_object obj; T item; fifo.get(obj); if (!$cast(item, obj)) uvm_fatal(TYPE, $sformatf(expect %s, got %s, $typename(T), obj.get_type_name())) // 安全使用 item endtask endclass$typename(T)是調(diào)試類型不匹配時(shí)的利器編譯期展開成實(shí)際的類型名打印出來(lái)非常直觀。5.3 在這個(gè)組件里如何安全地做對(duì)象分發(fā)再進(jìn)一步參數(shù)化類加上$cast可以寫出很安全的分發(fā)器。比如你有一個(gè)uvm_analysis_port#(uvm_object)不同的 monitor 向里面扔不同類型的對(duì)象下游的參考模型通過(guò)參數(shù)化類只接管自己關(guān)心的類型。我這里有一個(gè)實(shí)際用過(guò)的簡(jiǎn)化版本。先定義一個(gè)參數(shù)化的filter_tclass filter_t #(type T uvm_object) extends uvm_component; T cached; int hit_cnt; int miss_cnt; uvm_component_param_utils(filter_t#(T)) function new(string name, uvm_component parent); super.new(name, parent); endfunction virtual function void write(uvm_object obj); T item; if ($cast(item, obj)) begin cached item; hit_cnt; end else begin miss_cnt; end endfunction virtual function void report_phase(uvm_phase phase); uvm_info(FILTER, $sformatf(hit%0d miss%0d typename%s, hit_cnt, miss_cnt, $typename(T)), UVM_LOW) endfunction endclass把這個(gè)類從uvm_subscriber#(uvm_object)派生出來(lái)每個(gè)組件可以在構(gòu)造函數(shù)里指定自己的 T。類型匹配的進(jìn)來(lái)類型不匹配的直接過(guò)濾。這種模式下對(duì)象從上游傳到下游時(shí)全程只有一個(gè)句柄在流動(dòng)沒有多余拷貝同時(shí)通過(guò)$cast保證了類型安全。關(guān)于這個(gè)組件還有一點(diǎn)值得提醒因?yàn)閒ilter_t#(T)的參數(shù)化UVM 的工廠注冊(cè)宏要用uvm_component_param_utils而不是uvm_component_utils。UVM 1.2 提供uvm_component_param_utils就是為了適配參數(shù)化類如果你用的是老版本 UVM這個(gè)宏可能沒有需要自己手動(dòng)實(shí)現(xiàn)type_id的 create 機(jī)制或者退一步用非參數(shù)化的基類加虛函數(shù)。這也是老項(xiàng)目里參數(shù)化類用得少的一個(gè)客觀原因。5.4 對(duì)象拷貝和數(shù)據(jù)類型轉(zhuǎn)換的聯(lián)動(dòng)一個(gè)我踩過(guò)的假轉(zhuǎn)換坑最后分享一個(gè)把拷貝和類型轉(zhuǎn)換結(jié)合使用時(shí)我實(shí)際踩過(guò)的坑。當(dāng)時(shí)我有一個(gè)base_txn里面定義了一個(gè)uvm_object_utils宏還有一個(gè)copy()方法邏輯看起來(lái)沒問(wèn)題。子類ext_txn繼承它但copy()重寫時(shí)只調(diào)了super.copy(rhs)忘了復(fù)制自己新增的數(shù)組字段。然后在 scoreboard 里我寫了個(gè)通用比較邏輯把期望對(duì)象和實(shí)際對(duì)象都塞進(jìn)一個(gè)uvm_object容器里等到比較時(shí)再$cast回base_txn。因?yàn)閮蓚€(gè)對(duì)象都是ext_txn類型$cast成功了數(shù)據(jù)比對(duì)卻總是失敗。打印出來(lái)一個(gè)字段是對(duì)的另一個(gè)字段是默認(rèn)值。最后定位才發(fā)現(xiàn)不是$cast的問(wèn)題而是copy()漏字段導(dǎo)致期望隊(duì)列里的對(duì)象一開始就是殘缺的。這個(gè)案例給我的教訓(xùn)是類型轉(zhuǎn)換負(fù)責(zé)分揀拷貝負(fù)責(zé)內(nèi)容完整分揀成功不代表內(nèi)容正確。排查問(wèn)題時(shí)要分清階段先確認(rèn)類型對(duì)不對(duì)再確認(rèn)數(shù)據(jù)備份有沒有做全。兩者混在一起排查往往會(huì)浪費(fèi)大量時(shí)間。6. 從對(duì)象拷貝到參數(shù)化類我在項(xiàng)目里用得最順的幾個(gè)技巧把前面幾章的東西收攏一下分享幾個(gè)我在真實(shí)項(xiàng)目里沉淀下來(lái)的、直接能用的技巧和習(xí)慣。這些內(nèi)容不復(fù)雜但確實(shí)能幫你少走彎路。第一個(gè)技巧給所有 base transaction 實(shí)現(xiàn)一個(gè)統(tǒng)一的deep_copy()約定。不管項(xiàng)目里有沒有 UVM我都建議在頂層基類里定義一個(gè)virtual function void deep_copy(input base_txn rhs)子類重寫時(shí)第一句永遠(yuǎn)是super.deep_copy(rhs);后面再?gòu)?fù)制自己的新字段。這樣任何子類對(duì)象都能通過(guò)基類句柄完成深拷貝不需要在每個(gè)場(chǎng)景里做類型分支。第二個(gè)技巧拷貝函數(shù)里統(tǒng)一使用copy_to風(fēng)格即把內(nèi)容填充到已分配的對(duì)象里而不是copy返回新對(duì)象。返回新對(duì)象在語(yǔ)法上更直觀但每次調(diào)用都會(huì)new()在高頻率的 scoreboard 比對(duì)場(chǎng)景里會(huì)產(chǎn)生大量對(duì)象創(chuàng)建和釋放給仿真器 GC 帶來(lái)壓力。copy_to配合對(duì)象池能把內(nèi)存分配次數(shù)降下一大截實(shí)測(cè)在高吞吐場(chǎng)景下仿真速度能有可感知的提升。第三個(gè)技巧參數(shù)化類的類名里盡量帶上類型名比如gen_t#(eth_pkt)在打印日志時(shí)會(huì)顯示gen_t#(eth_pkt)非常利于調(diào)試。如果嫌名字長(zhǎng)可以在實(shí)例化時(shí)用typedef起個(gè)短名typedef gen_t#(eth_pkt) eth_gen_t;這個(gè)短名只在當(dāng)前作用域生效不污染全局命名空間日志里還能看到完整類型信息兩全其美。第四個(gè)技巧多線程共享句柄時(shí)把 SV 的 timeslot 調(diào)度機(jī)制納入考慮。同一個(gè) time slot 內(nèi)fork...join_none啟動(dòng)的線程和主線程看到的對(duì)象狀態(tài)是一致的如果你在子線程里改了對(duì)象字段主線程下一行代碼立刻也能看到。這個(gè)立刻可見其實(shí)經(jīng)常是 copy 漏寫的信號(hào)如果你發(fā)現(xiàn)一個(gè)對(duì)象被多個(gè)線程同時(shí)修改與其依賴仿真器調(diào)度順序不如先檢查是不是某個(gè)地方缺少深拷貝。我見過(guò)不少偶發(fā)性的 compare mismatch最后都是這個(gè)原因。第五個(gè)技巧用$typename()打印真實(shí)類型尤其是在參數(shù)化類的工廠創(chuàng)建和$cast失敗現(xiàn)場(chǎng)。SV 的內(nèi)建$typename()函數(shù)對(duì)參數(shù)化類的輸出比get_type_name()更準(zhǔn)確因?yàn)間et_type_name()在參數(shù)化類里經(jīng)常返回空白或者同一個(gè)名字你沒法區(qū)分究竟是哪個(gè)參數(shù)特化出來(lái)的對(duì)象。結(jié)合前面的 filter 例子我在所有類型轉(zhuǎn)換失敗的地方都會(huì)打一行$typename(obj)對(duì)$typename(T)把實(shí)際類型和期望類型擺在一起看基本一眼定位。這些技巧看著零散但背后的核心思想是一致的面向?qū)ο篁?yàn)證代碼的很多 bug本質(zhì)都是對(duì)象身份和對(duì)象內(nèi)容這兩件事沒分清楚??截惤鉀Q的是內(nèi)容獨(dú)立參數(shù)化解決的是類型通用$cast解決的是類型安全這三者配合好了驗(yàn)證組件可以做到又通用又不容易出錯(cuò)。最后再啰嗦一句SV 的面向?qū)ο髾C(jī)制上手語(yǔ)法一天就夠了但真正用得穩(wěn)一定是在項(xiàng)目里一遍遍踩過(guò)、觀察過(guò)對(duì)象生命周期之后。希望這篇從對(duì)象拷貝講到參數(shù)化類的文章能幫你少踩幾個(gè)我踩過(guò)的坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www.高清无码诱惑一区.com| 中文字幕一区二区三区蜜臀| 无码一区二区精品视频久久久春药| 少妇69中文| 伊人网综合在线视频| 亚洲毛片久久| 国产精品3| 嗯啊不要啊在线| 色狠狠 - 百度| 国产60页| 成人五月天丁香激情综合| 亚洲免费97免费| 2020国产精品| 无码国产精品久久久久| 人人艹亚洲| 亚洲婷婷丁香在线| 玖玖综合网| 亚洲熟妇AV日韩熟妇在线| 91红杏| 激情丁香婷婷| 91人妻超碰| 岛园激情| 欧洲熟妇xxXx欧美老妇裸体| 一牛影视成人片免费| 国产内射爽爽大片| 久一区久久蜜桃| 国产91丝袜 在线播放| 少妇精品久久久八区九区| 亚洲最大黄网| 亚洲一区二区三区麻豆传媒| 国产精品情侣啪啪| 内射日韩大臀美女| 2019AV天堂| 啊啊啊好湿国产一二| 97操操| 丁香色色网| 久久鲁干| 中文字幕在线免费观看视频| 啪啪啪大香蕉| 97色插| 日韩天堂av电影在线观看| 麻豆人妻精品一区二区| 欧美制服另类丝袜| 97一区二区蜜臀| 91色黑人少妇| 亚洲一区亚洲天堂| 天天干1区2区在线| 午夜欧美精品久久久| 91狠狠狠| 大香蕉综合网| 男人的天堂午夜av| 欧美躁死她一区二区| 男人夜色天堂ss| 日韩人妻操B| 色妹子A V| www.99热在线只有精品| 区自美91| 日韩97| 色吧 综合| 天天操人人操狠狠插| 人妻丰满熟妇一区二区三| 中国乱伦一区二区| 一二三区在线| 最新av在线| 人妻人人澡人人爽人人| 亚洲,欧美,综合网| 精品视频一二三中文| 亚洲中文字幕在现观看| 国产一区二区a毛片| 国产麻豆一级精品视频| 图色综合网| 韩国嫰模上门援交视频| 亚洲欧美不卡线| 美国黄片aaa| 国产综合网站在线播放| 东北老女人的激情视频| 密臀在线视频| 麻花豆传媒剧国产MV出差| 高清无码国产亚洲| 久久久中文版| 人妻铁牛TV| 一区二区免费电影久久| 国产高清成人mv在线观看| 欧美视频一| 激情干在线| 精品91摸| 亚洲熟女人妻中文字幕一区二区| 亚洲无码太久| 插入综合网| 美女丝袜激情小说| 欧美成人性爱视频在线播放| 强奸乱亚洲| 婷婷激情一区二区三区俺也去| 91强在线播放| 1级午夜影院费免区| 国产日本久久免费精品| 亚洲drav色图| 在线看的av| 丁香五月婷婷基地| 密臀在线一区尤物| 丁香色色网| 亚洲熟女一区| 国产一区二区成人av在线播放| 青草青草久热| 美女诱惑在线一区| 亚洲欧洲无码bt精品合集| 日本片日本片祼观看网站在线看中文版网页在线看 | 色哟哟AV| 亚洲精美粉嫩嫩泬在线观看| 狠操91,com| 国产精品美女久久久久久网站| 亚洲欧美经典一区二区| 老熟女阿 国产91| 亚洲综合九九| 国产成人五月天丁香花| 色婷婷丁香五月| 91无摭挡| 999岛国大片| 亚洲脚交| 1024香蕉视频| 亚洲春色欧美激情自拍| 和协无码影院| 性色av蜜臀av色欲aV| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 天天谢天天干| 99久久综合| 国产高清精品一区二区三区毛片| 欧美性暴力猛交XXXX| 国产综合日韩伦理| 今日头条成人一区二区三区四虎精品| 日韩强奸av| 嗯阿好爽好紧| 老熟女乱子伦中文字幕一区二区| 四虎在线免费视频| 五月天婷婷影院| 91色拍| 久久这里精品国产99丫e6| 精品国产av一区二区三区四区入口| 99久久久无码| 老熟女乱子伦中文字幕一区二区 | 搞中出久久| 91黑丝操| 97超碰色五月| 中国一级特黄大片护士| 92大香蕉| 精品国产99| 凹凸视频在线观看伊人| 欧美 亚洲 在线| 亚洲夜色在线| 亚洲系列第一页| 天堂亚洲精品| 久久亚洲色图中文字幕| 91neishe| 久久婷婷亚洲| 精品一区二区国产日韩| 天天综合网~91| 爱爱动态120秒| 欧美极品性爱天天射| 亚洲,欧美,综合网| 精品久久久久黄少妇| 日韩欧洲操屄视频| 中国熟妇| 狠狠躁天天躁日日躁97| 天堂九九九九九九九九九| 青草草免费网站av| 天堂综合网| 91麻豆天美国产| 亚洲黄色网址视频| 中字幕人妻一区二区三区| q2午夜理论片夜色av| 国产久久一区二区午夜| 人人操人人摸人| 精品无码一区二区三区色欲| 亚欧美综合| 按摩中文字幕| 99在线免费观看| 无套内射人妻在线播放| 狠狠91| 色婷婷一区二区三区久久午夜成人不| 亭亭丁香激情| 91碰碰碰| 婷婷五月天影院| 91亚洲色人| 久久久精品网站| 国产2.3.4区| 欧美色自拍| 91亚洲青青草原精品1区| 91成人社区| 丁香六月婷| 熟女六十路| 九九九精品成人免费视频小说| 色九色久| 色狠狠一区二区三区香蕉| 激情文学 亚洲图片| 日夜久久久九九九久| 欧美夜夜狠| 久久婷色| 五月天开心网| 99成人| 99热精品在线观看| 99只有精品| 岛国成人av在线播放网址| 丰满人妻一区二区三区四区| 亚洲无码超碰免费| 国产99精品一区二区三区免费| 国产精品com| 久草这里只有精品| 色妇综合网| 深喉吞精| 久久久久久久9999| 激情欧美97| 啪啪啪综合| 91色夜| 91女日逼| 欧美亚洲图片| 97操| 天天弄天天操| 91人妻尻屄视频| 色情乱伦AV| 国偷自 一区二区| 五月天人妻综合| 欧美色蜜桃97| 久久天堂| 无码精品久久久天天影视| 亚欧毛片基地国产毛片基地| 国产一级137片内射麻豆| 素人一区二区三区日韩| 天天看,天天做| 动漫爆乳3D奶水一区在线观看| 日本在线激情一区二区三区| 蜜臀av一区二区三区免费观看| 蜜臀av一区二区三区免费观看| 日韩无码嘿咻黑热久| 一牛影视久久久一区二区三区| 综合激情97 | 亚洲女人91| 中文字幕第2页| 国内偷自视频区视频综合 | 蜜臀AV成人精品蜜臀| 91爰爱欧美| 91日日夜夜| 超碰人妻97| 不卡av免费在线网址| h4610国产人妻| 欧美日韩性爱精品| 亚洲欧美另类少妇精品| 91AV天美在线视频| 国产精品乱码久久久久| 性影在线视频| 强奸少妇AV导航网| 2019亚洲男人天堂| 久久久久精| 亚码人妻| 亚洲日韩国产精品| 久久‘黄片视频| 色婷婷aV一区二区三区麻豆综合| 男人的天堂日韩| 亚洲阿v天堂在线| 国产又粗又长又爽又色| 97久久精品国产| 巨乳特殊服务按摩| 激情深爱五月天| 日韩美女高潮喷水视频| 91精品国产91久久福利| 99精品在线观看| 日日夜夜模| 亚洲精品久久久久久久蜜桃臀| 美女操逼福利视频| 日韩丝袜高跟制服在线观看| 亚洲另类春色| 综合久久婷婷| 人人操人人精品影片| 国产无马在线| 国产欧美伊人| 精品国产乱子伦一区二区三区,精品一| 亚洲黄色视频在线观看视频| 在线 制服丝袜中出 人妻| 熟妇国产免费一区| 日韩簧片免费看| 黄页18禁| 91P0RNY大屁股人妻| 天天爱天天操| 台湾佬大香蕉| 色噜噜狠狠色综合日日| 超碰97人人乐| 欧美成人黄网色网站| 和协影院中文字幕三区| 大香网站| 天天综合网视频91| 9l视频自拍9l九色成人| 夜夜做夜夜爽精品视频| caoni国产亚洲av| 亚洲欧洲日产国产综合网| 国产午夜在线观看| 一区二区视频你懂的| 超碰精品日韩欧美国产| 操逼999| 手机在线视频国内精品| 欧美亚州综合网图片| 亚洲AV成人无码一区二区三区在线观看| 精品176精品2| 福利在线黄片| 精品999一区二区| 理论久久婷婷网 8| 久久av一级av少妇av高潮| 国产精品色哟哟| 国产日逼视频| 亚洲偷拍欧美激情| 无码自拍SM| 久九色| 啊啊啊啊啊啊啊国| 国产精品一区二区 尿失禁| 国产人妻精品一区二区三区秋霞 | av在线资源| 九九九九九精品| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 亚洲日本韩国在线| 国产高清成人免费视频| 日韩国产十八禁| 天天插夜夜操| 夜夜欧美| 超碰97在线 欧美 国产| 久久亚洲AV无码专区首页| 自拍亚洲综合| 五月香婷婷| se吧提供国产乱老熟视频胖女人 | 日韩免费在线观看不卡| 久草精品一区 | 日本五区不卡| 91美女在线精品视频| 操逼大黄片| 日本布卡一区二三区| 亚洲天堂另类小说男人| 国产精品视频一区二区三区八戒| 深夜视频| 欧美在线视频观看一二三四区高清| 一区二区三区视频在线观看免费| 中文一区二区三区影院| 91色综合色| 女色视频社区| 国产一级作爱毛片| 深夜福利黄片| 亚洲欧美97√| 欧美小说区视频区| 天天干天天中出av| 亚洲影视综合网| 天天色综亚洲91污| 伊人久久在线视频观看| 日本色日夜干| avav青青草久久夜| 狠狠亚洲| 久久精品免费| 中文字幕精品一区二区精品| 日本性爱少妇| 亚洲色图欧美色图日韩色图| 亚洲影院成人| 国产精品乱码久久久久久久久| 躁躁日曰躁2020| 蜜臀av在线播放一区二区三区| 欧美αv.com| 久久久久少妇| 97超碰香蕉| 亚洲色性| 一本久久久精品| 亚洲宗合网| 亚洲限制级在线| av中文在线| 色色色色网站| 中文字幕在线高清男人的天堂| 高潮毛片无遮挡高清免费| 91丝袜在线观看| 亚洲少妇综合| 日韩久射综合| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 91新在线欧美| 中文字幕视频2区| 精品久久視頻在线| 五月丁香亭亭| 亚洲色图激情小说| 婷婷三区| AND人妻系列| 97舔舔| 一区二区三区四区色图| 精品超碰中文在线| 啊啊啊com| 中文字幕啊啊啊在线观看视频| 五月香婷婷| 99久久综合网| 日韩国语字幕| 高树玛利亚无码流出| 91天天日| 久久精品人妻一区二区| 超碰97欧美日韩| Julia Annxxxxx| 国内成人圈中文字幕无码视频| 亚洲清纯唯美| 变态另类专区| 国产精品美女| 综合激情二| 亚洲欧洲综合成人av一区| av最新免费中文字幕| 日韩欧美成人性爱在线| 26uuu国产免费观看| 国产99 中文字幕日韩小视频| 婷婷综合五月| 一个人在线看的黄色电影网站| 人妻在线臀日韩| 欧美97视频| 久久久久国产精品人妻aⅴ天堂| 天天影视网色欲色香| rivers-china.com| 久艹日日日| 韩国免费播放一级毛片| 在线观看亚洲专区| 五月丁香影院| 热热色色综合| 激情欧美97| 爱妃国产亚洲视频中文字幕| 全球成人中文在线| 蜜桃精品一区二区三区ww| 美女操逼A A| 日韩欧美国产高清视频| 人妻在线中出视频| 久久有码视频| 亚洲熟女性高潮久久久| 伊人激情| 97精品国产精品免费观看| 九九九999久久久网站| 美国日韩黄片| 激情综合五月婷婷| 国产日韩欧美| 男人女人18禁片免费看网站| 亚洲操人| 久久久免费懂色| 国产一区二区二区按摩精品啪视频| 强奸抽插av| 丁香九月激情啪| 嫩草 人人网精品| av天堂电影网| www久| 足交视频老司机| 又大又大又大又粗爽高潮观看| 国产精品国产自产高清AV| 天天天天操| 呻吟 欧美 日本 中出| 天天射天天操天天干天天吃2018| AV电影在线播放| 欧洲精品一二三在线| 久久久亚洲熟妇熟女| 天天色播亚洲综合网站| 亚洲综合伊人| 免费在线观看国内色片网站网址| 久久久国产精品人妻丝袜| 91人人操| 五月婷婷色| 久久久三区二区一区| 婷婷在线视频在线观看| 大香蕉十区| 日夜伊人网| 九九Av| 亚洲素人综合| 国产成人免费观看在线视频| 伊人伊人LD| 永久免费av无码网站国产app| 免费a在线播放v| 久草免费在线一区二区| 日韩在线观看字幕精品| 97精选久久| 在线岛国新天堂8| 9久久9综合| 亚洲影视综合| 久久超碰久| 偷拍盗拍亚洲色图图片 | 99精品视频在线观看| 国产日韩中文字幕欧美| 尤物一级在线免费观看| 色97欧美| 亚洲天堂中文字幕无码男同| 亚洲成人贴图| 九热大香蕉| 1级黄色夫妻对换性交免费看| 操人妻逼91| 久久亚洲欧美中文字幕国语| 久久人妇| 免费一级毛片在线视频观看| 天天综合网~91| 综合久久中文字幕综合日韩精品| 2017天天操天天日| 日韩精品三区四区| 性暴力欧美猛交在线直播| 九九拍拍精品视频在线播放 | 婷婷性爱| 老司机福利青青草| 91av天美性媒精品视频| 国产探花精品在线| 成人AV在线网站| 又黑又大又粗| 无码 黑人一区二区三区| 久久久久久波多野吉衣高潮| 欧美另类综合久久| 亚洲少妇视频| 91成人在线| 人人射人人操人人摸| 91女日逼| 久久免费精品96| 午夜寂寞欧美| 操逼操2| 天操老女人| 国产亚洲综合欧美一区| 欧美爆乳精品一区二区| 国产亚洲精品美女久久久久久2021| 天天情欲宗合网| 成人资源中文字幕在线观看天天| 密乳AV免费观看| 亚洲色图日韩丝袜制服一区二区五月在线| 人妻AV 中文字幕的| 无码高清操逼| 九久久精| 天天操人人操骚逼网站| 欧美熟妇视频| 亚洲一区二区性爱电影| 综合亚洲欧美精品日韩?v| 五十路熟女,国产欧美精品区一区二区三区| 五月天激情小说网| 国产精品宅男免费| 狠狠色伊人亚洲综合网站色| 人妻激情视频| 日日妻色网| 打av高清| 极品丝袜无码| 五月丁香婷婷综合网| 国产成人精品必看| 九九九九九九视频免费| 四虎884| 欧美 亚洲 另类 综合| 婷婷情色综合网| 亚乱色| 国产精品女生av| 操国产高清| 亚洲丨在线| 欧美日本视频一区| 99蜜桃臀久久久欧美精品网站| 伊人97超碰| 丁香激情五月| 色色亚洲| 久久黄黄| 91neishe| 日本不卡卡一区| 欧美日韩超碰在线| 亚洲欧洲偷拍一区| 91熟女熟妇视频网站| 我爱大香蕉| 插插综合网天天影视网| 91 亚洲情侣偷拍 久久| 精品乱码久久久久| 人妻免费观看| 超碰综合色| 97超碰资源网| 欧美日韩另类字幕中文| 18禁久极品美女久久哦哟呀!| 蜜桃视频一区二区三区在线观看| 日日干日日操五月天伦理视频| 国产欧美美女免费观看视频| 国产高清1234区| 熟妇高潮一区二区免费视频| 亚洲情色1区| 亚洲av热热色| 嗯,啊。舔我逼| 色偷偷人人玩人人舔人人操人人摸人人爽 | 丰满少妇一区二区三区四区观看| 麻豆天美国美国产| 打av高清| 九一国产精品| 精品人妻一区二区三区视频在线| 亚洲熟女综合网| 国产精品人妻无码久久久互動交流 | 国产AAAAAABBBBB| 午夜视频久久久久一区| www.91逼逼.com| 国产美女mm131爽爽爽爽| 欧美黄色片AAAAA| 精品久久視頻在线| 九九英色视频| 影音资源男人日韩| 亚洲精品人体| 操逼免费视频无码国产| 色99视频| 激情露脸爱| 2019亚洲男人天堂| 69精品| 中文字幕奈奈美被公侵犯| 8050无码八戒| 国产日韩精品一区二区三区| 超碰97欧美日韩| 婷婷亚洲综合| 天天做天天爱天天爽AV| 青青草导航在线视频| 91天天看| 亚洲欧美日韩夜夜| 色五月天AV| 欧美激情 亚洲色图| a片在线播放| 国产18精品亚洲精品| 丝袜内射| 91狠狠狠| 岛国网址国产 | 色情五月婷婷| 日本大香蕉| 亚洲欧美清纯| 亚洲一区二区精品福利| 久草视频制服诱惑| 国产夫妻性生活视频| 操逼无码操逼| 丁香六月综合激情| 伊人久久亚洲色欲综合网站| 欧美性爱精品七区| 激情五月综合网| 欧美成人一区二区| 亚洲欧美一区二区网址| 五月丁香网站| 啊啊在线| 日本色色色视频| 色天使大香蕉| 日韩三级伊人| 五月色综合| 人澡逼| 逼操网站| 中文在线久久字幕| 国产主播福利| 九九九九九九九九九九九免费国产| 久久精品一区二区三区蜜桃臀| 精品丝袜无码一区二区三APP| 99∨VTV| 伊人久大| 中文字幕日本久久| 五月天九九日国产精品一区二区三区| 一区不卡在线观看av| 日韩精品三区四区| 一区二区中文| 97色网| 亚洲天堂,男人| 鸥美中出| 黑操B| 色香综合| 久操黄色视频| 天天看天天日天天操| 欧美.亚洲.另类.丝袜.制服.诱惑| 中文字幕1区2区| 日韩免费性爱视频在线观看| 久久久精品九| 亚洲丁香花色| 老熟女综合| 亚洲有码 视频一区| 午夜精品久久99蜜桃的功能章节| 欧美极品女人的天堂| 亚洲色阁| 色鬼在线综合| A 在线网址| 国产风韵犹存熟妇三区| 综合久久中文字幕综合日韩精品 | 久久久com| 精品无吗m| 91原创在线观看| 国产91av在线播放| 超碰欧美在线欧美| 九九色图| 91无码西班牙视频在线| 天天夜夜久久| 91精品人妻电影| 亚洲小说视频| 91天天综合网,天天综合网| 污污汅18禁网站在线永久免费观看| 天天激色| 日本 欧美 亚中文字幕| 三级日本一区二区三区| 91精品免费| 狠狠狠狠狠狠| 乱伦一区二区三区‘| 天天天堂影视日韩亚洲91| 伊人久久婷婷| 韩国手机不卡无码三级视频| 欧美日韩国产色五月综合在线| www.色操逼| 在线视频亚洲无码| 天天插天天操天天摸天天射天天看| 亚洲中文字幕精品久久久久久直播| 久久精品无码专区| 97色色国产视频| 日韩中文字幕二区| 中文?日韩?免费?精品| 97超碰超欧美。| 狠狠 91| 男人a天堂手机在线版| 一本久道久久综合狠狠爱一密臀精 | 亚洲男人天堂视频| 国产suv精品一区二区四| 夜间福利片1000无码| 日本道不卡| 亚欧洲一区二区视频| 无码99| 丁香五月婷婷基地| 女同女同恋久久级三级| 嗯嗯啊啊啊好爽| 亚洲综合九| 小草精彩毛片| 99熟女| 日欧亚洲二三区大片不卡| 亚洲超碰97| 男人天堂导航| 97av,com| 99热精品国产| 久都青青视频| 激情99| 91天堂色男人的天堂| 精品无码一区二区三区| 亚洲日韩电影| 91情色在线| 丰满欧美放荡少妇在线| 欧美激情色婷婷花野真衣一区二区| 操狠狠| 亚洲AV免费在线| 久久精视频美日韩在线视频| 多毛小伙内射老太婆| 欧美Aⅴ| 私人尤物在线精品不卡| 国产精品操| 中国熟妇| 国产精品农村妇女| 激情婷婷丁香网| 2017超碰| 色一区二区三区综合| 精品人妻一区春色| 99色骚| 国产精品天干天干综合网麻豆 | 国产熟妇 码视频户外直播| 亚洲欧美综合图片| 91M一社| 久久超碰天天| 久久成人东京热人妻| AV色五月| 伊人欧美大香蕉视频| 熟女高潮精品一区二区| 9九九国产| 亚洲中文sv| 美女性91| 国产白丝精品在线观看| 翔田千里AV无码秘 三区| 四虎在线观看视频| 亚洲av性爱电影| 久久在线观看免费视频| 女人与公拘交酡2020视频| 欧美Ⅴ性爱| 91精品微拍福利| 无码丰满熟妇一区二区浪潮AV| 精品成人亚洲午夜电影| 日本免费专区| 麻豆这里只有精品| 亚洲丝袜色| 嗯嗯啊啊亚欧精品| 91 亚洲情侣偷拍 久久| 欧美后入式| 成人小电影网站tex| 欧美亚洲情色| 人人贴人人摸| 久久精品性| 一二三四日本视频高清| 曰本精品久久久| 青青草久久| 999久久久九九九九| 亚洲 无码 偷拍| 久久激情亚洲精品无码?V| 爽 好舒服 无码刺激久久| 欧美日韩高潮喷水91| 青春草A| 精品无码一区二区三区| 97AV在线观看| 色欲蜜臀AV| 婷婷在线播放| 色哟哟1区2区| 欧美翘臀视频网站一区二区三区| 蜜乳成人AV| 亚洲精品三| 亚洲色图a| 国产精品日日摸天天碰| 日本人妻中文字幕精品| 再深点灬舒服灬太大了好硬好爽| 亚洲人在线成线成人| 天天干夜夜肏| 成人精品在线免费视频| 性爱1区| 北条麻妃性愛视频| 国产91 丝袜在线播放00-百度| 日韩激情毛片一级久久久| 日本九九九九| 1000午夜黄色| 国产精品久久久啊| 色情五月综合婷婷| 精品人妻一区二区三区夜夜| 97色在线视频| 亚洲色图亚洲无码强奸乱伦| 色盈盈影院| 亚洲成人ab| 日本在线不卡v二区| 国产美脚女优尤物在线观看| 91中出视频| 黑人嘿嘿嘿超爽免费视频| 中文字幕制服欧美久久一区| 精人妻一区二区三区| 欧美少妇性爱网站| 国产SV一线| 国产精品香蕉| 99色色网| 尤物视频新赏网鲜网色诱网| 免费黄色片。| 91色噜噜狠狠| 加勒比伊人| 91 刺激在线| 天天影视综合色| 乱伦Av网| 99热18这里只有精品| 天天爽夜夜爽夜夜爽精| 好湿好紧好爽 视频| 久久久91| 亚洲精品一区中文字幕乱码| 亚洲中字慕不卡| 国人欧美精品一区二区| 91在线/欧洲| 911av网站免费观看| 极品内射| 国产视频一区二区三区在线免费观看 | 98一区二区精品| 怡红院成人视频| 91九色首页| 人妻激情视频| 依人大香蕉| 91岛国动作片| 精品久久青青草| 亚洲色图欧美一区二区不卡| 亚洲欲色9532548967一区| 91宗合网| 99热超碰| 黑人精品XXX一区一二区| wwe 天天干.com| 性暴力欧美猛交在线直播| 久久国产精品,久久国产| 中文字幕日韩专区精品系列| 10000部十八禁看电影| 秋霞一级A片黄色视频| 大香蕉综合久久| 亚洲欧综合另类无码一区| 色悠久久久av| 99久久婷婷| 午夜精品久久久| 一区二区三区 丝袜高跟| 亚洲国产一区二区入口| 欧美,亚洲,日韩,v,天堂,手机在线观看| 久久精品国产亚洲AV成人直播| 久久风骚城市| 99免费在线视频| 国产中出内射一区二区| 亚洲国内精品成人不卡| 欧美色综合影院| 凹凸精品熟女在线观看| 欧美精品双插| 手机看片1025| 久久久久亚洲| julia中文字幕在线观看| 日本一级性爱| 男女性无套 免费九一| 人妻少妇色综合| 人妻熟女av国产网站| 最近二区三区视频大全| 欧美日韩一干二干| 新版天堂中文资源8在线| 久久精品—区二区三区内射| ai欧美亚洲小说| 九九av| 91精品微拍福利| 99热精品在线观看| 欧美色66| 99热18| 91在线超高颜值国产| 成人性交免费视屏| 欧美性爱一区二区三区四区| 欧美日综合| 日韩综合成人免费视频| 国产欧美另类久久久精品课程| 亚州乱码中文字幕综合久久久| 强奸乱伦动态污图免费 | 肥臀熟女福利视频一区二区| 亚洲日韩国产欧美综合v| 清纯唯美亚洲| 人伦四五区| 91成人在线| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴| 久草尤物| 日夜伊人网| 欧美色图片欧美色图| 99九九久久| 操狠狠| 国产18精品亚洲精品| 蜜乳成人AV| 国产精品久久久久久久久久久久久久吹| 和协影院中文字幕三区| 日本一区二区电影网站| 综合色99| 成人性爱全视频观看| 亚洲成人黄色在线观看| 男人的天堂99| 97精品视频在线| 91天美传媒在线观看| 99啪| 天天色综合图片| 簧片免费看视频| 中文字幕中文字幕一区二区| 中文字幕第9页萱萱影音先锋 | 天天综合,91综合永久| 亚洲熟女av日韩熟女| 操逼啊啊啊91| 999亚洲国产视频| 无码直播久久久| 五月亭亭六月丁香| 玖草在线视频| 天天92av| 日韩九九九| 亚洲图片 欧美电影| 一本色道久久综合狠狠操| 亚洲综合性网址| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 国产精品操| 亚洲97精品| 97亚洲在线| 一起草视频在线| 人妻铁牛TV| 国产精品久久久 | 欧美五区| 欧美在线55555| 1204金沙人妻懂旧版免费| 超碰天天久久79| 99www.bibizy香蕉资源国产一区二区三区高清 | 欧洲无码一区二区| 久久这里都是精品| 黄色二级片网站| 丝袜综合| 制服诱惑亚洲一区二区三区在线观看| 97超碰资源网| 国产精品第一页国产大屁股视频免费区i| 2026国产精品视频| 老色鬼成人精品视频下载大在线观看| 久久是精品| 91情色在线| 视频不卡中文字幕| 51国产午夜精品视频| 欧美一区二区日韩三区| 青娱乐亚洲自拍| 激情五月天社区| 美女刺激久久国产欧美| 国产精品肉丝自拍| jiujiujiujingpin| 91综合天天看| 91亚州| 香蕉热人人精品| 777奇米影视777四色| 69人妻精品一区二区绯色| 久久国色天香香蕉| 国产久久一区二区| 欧美色图亚洲色,麻豆| 色欲av国内精品久久久久久| 国产狂喷潮在线精品| 亚洲 一区二区 自拍| 色婷婷综合网| 久久AV无码1区2区3区| 一级黄碟| 91精品老女人| 亚洲免费成人精品电影| 人妻久久久| 999综合色| 亚洲人妻五月丁香婷婷| 欧美亚洲国产91在线| 亚洲AV永久无码一区仙野| 欧美色偷拍| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 国产v亚洲v日韩v欧美v片另类| 日韩图区 偷拍| 亚洲人妻一区二区三区| 殴洲老熟女| 亚洲色阁| 欧美三级中文字幕hd| 啊啊啊用力在线观看| 日韩av电影网站| 九九九精品| 熟妇操花| 欧美日韩国产男人| 91欧美综合| 免费操逼视频下载| 亚洲综合图文| 久久中文字幕在线观看| 乳欲人妻办公室奶水| 青娱乐 成人娱乐在线| 久超碰这里只有精品| 国产操伦| 精品免费1| 久久精品28| 日本人人操人人操| 久久內射| 日韩三级伦理中文字幕| 五月婷婷丁香| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 黄片www视频免费| 97香蕉碰碰人妻国产欧美| 蜜桃色院一区久久| 免费无码婬片AAAA片直播色戒| 五月丁香六月婷| 五十路人妻在线| 飘花国产午夜精品不卡| 欧美大香蕉在线观看| 一区二区影视| 人妻中文在线| 超碰97综合网| 成年人性爱日韩| 综合天天网| 综合国产影视三级| 日日日啊啊啊| 久久产精品一区二区三区电影| 九九热视频在线观看| 日本2020一区二区| 操逼网站视频漫画国产| 久久人妻无码毛片A片麻豆| 精品日韩中文在线| 婷婷香网站| 人人 操人人 操人人| 欧美美女在线高潮999| 国产精品com| 91丝袜美女| 三级日韩一区二区三区| 啊嗯好大视频在线观看| 极品销魂美女一区二区| 精品免费1| 国产乱伦搜索结果91P| 蜜臀亚洲中文| 久久黄片国产一区二区| 91高跟美女在线播放| 亚洲av国产av综合av卡| 欧洲一区二区三区免费| 中文字幕在线观看永久| 伊人伊人LD| 丁香五月综合| 国际精品久久久| 思思热在线观看| 97免费在线| 97干色天堂| 国产特级毛片AAAAAA高潮流水| 欧洲精品网| 国内精品久久久久影院亚洲| 久久久555| 按摩中文字幕| 八戒无码国产午夜福利| 九热超碰| 色色亚洲| 内射老妇BBWX0C0CK| 色综合20p| 日韩中文字幕视频在线观看| 欧美色蜜桃97| 蜜桃久久久久久久| 九九综合久久中文字幕| 999九九九九国产动| 天天干,天天日| 国产操逼网站亚洲一级黄色| 性性久久| 国产成人综合网| 青娱乐国产剧情av一区| 久久久久久波多野吉衣高潮| 日本三级R| 欧美激情激情xxxx欧美专区| 蜜臀久久99精品| 1024日韩| 蜜乳AV免费观看| 97在线亚洲| 欧美少妇一区二区三区| 自拍偷拍 高清无码| 99re欧美| 一区二区视频你懂的| 俺去也婷婷| 国产精品熟女九色九色蜜臀| 东京男人天堂| 大吊色| 婷婷色五月激情| 一级做a爰片久久毛片图片| 97se亚洲| 久久綜合很很很| 五月天婷婷基地| 一区二区三区成人高清视频| 亚洲国产天堂| 97网址97| 欧美色图片91| 五月婷婷性爱| 久久黄色性爱视频| 久久精品一区二区三区四区五区| 大香蕉综合在线| 最新一二三区视频| 无套内射性感少妇视频| 国产女同视频在线播放| 东京热天堂网| 中文字幕av一区二区三区人妻少妇| 男人的天堂在线2| 五月丁香网站| 爱av免费| 亚洲伊人a线观看视频| 男人天堂网址| 97久久超碰日韩精品| 校园春色宗合网| 日韩精品人妻中文字幕有码午| 深爱五月婷婷| 国产精品熟女丝袜一区二区| www.91人妻.com| 小说区 图片区色 综合区| 欧美成人精品一区| 久久久久久免费电影| 久草综合视频| 久久久久久久久久久久黄色| 淫淫总合网| 日韩AV一区二区三区四四| 日韩黄色电影网站| 最新中文字幕在线亚洲| 91在线超高颜值国产| 乱性AV| 精品欧美老熟女一二区| 97色在线视频| 超碰99re| 不卡视频一区蜜桃视频 | 九九色逼| 日本中文字幕在线电影| 亚州AV无码国产精品| 国产精品久久久久久久毛片1| 一级人妻性爱视频| 被操高清无码视频| 天天操女人| 亚洲一区二区 麻豆传媒| 黄片无码在线制服| 亚洲熟妇丝袜在线观看| 激情丁香婷婷| 色综合尤物| 日本理论在线| 717影院理论午夜伦八戒| 免费看久久久性性| 中字乱伦AV| 超碰在线91| 精品一区二区三区蜜桃臀赵总 | 久久久久久久六六| 日韩综合97P| 久久人妻一区二区三区高清| 人人九九精| julia国产在线 | 久久成人午夜精品影院| 18禁的网站在线| 人人射人人操人人摸| 精品国产片亚洲一区| 欧美国产日韩清纯唯美| 婷婷香蕉欧美在线一区二区三区| 台欧久久精品视频|