IC面試轉

轉自知乎:https://zhuanlan.zhihu.com/p/29642469?utm_source=wechat_session&utm_medium=social&utm_oi=1069668265269334016 ;
https://www.zhihu.com/question/293144503/answer/530170003?utm_source=wechat_session&utm_medium=social&utm_oi=1069668265269334016
進入八月,作爲一名學酥,當找工作這件大事咄咄襲來的時候,坦白講,我是很心虛的。但是該準備的還是得準備。因爲在西安一家外企實習,白天上班,沒有太多時間複習,所以在找工作前夕基本都是下班後就去圖書館自習,然後週末也是,簡直出去嗨的心情都沒有。但複習還是些許盲目的,你永遠不會知道面試官拋出來的會是什麼樣的問題。但經歷了無數的筆試面試之後,發現數字IC的筆試面試還是有很對共通之處和規律可循的。期望我的經驗能讓你少走些彎路,當然不走點彎路是不可能的。

有關筆試準備:

數字IC驗證的筆試往往和數字IC設計做的是同一套筆試題,所以相比有數字設計經驗的同學,做驗證同學的在筆試環節還是有很大劣勢的,但也並不是不可彌補。筆試題一般側重基礎,但基本都跟數字IC設計中最常用的方法和思想有關,最常考的有:

(1)信號的跨時鐘域同步。包括單比特和多比特,對於單比特自然用兩級寄存器同步最爲方便。對於多比特,常考察異步FIFO以及握手方法。要理解亞穩態的概念以及避免亞穩態的方法。

(2)說到亞穩態,就不得不說setup time 和 hold time。一定要掌握兩種時鐘約束和分析時鐘約束的方法。清楚四種路徑(輸入到輸出,輸入到寄存器,寄存器到寄存器,寄存器到輸出),並能找到關鍵路徑。會計算最高的工作頻率。

(3)分析和修復setup time validation(降低時鐘頻率,組合邏輯優化或拆分,提高工作電壓) 和 hold time validation(插入buffer,更難修復)

(4)能用verilog描述常用的電路結構,如:D觸發器,計數器,分頻(奇數倍分頻,偶數倍分頻,小數分頻(如1.5倍)),同步FIFO,異步FIFO,序列檢測器(FSM實現)

(5)用verilog描述給出的代碼或者僞代碼

(6)找出verilog代碼中的錯誤,如信號未進行跨時鐘域同步,無else分支會產生不期望的鎖存器等等。

(7)阻塞,非阻塞賦值

(8)sv基礎,包括@signal觸發和wait(signal)的區別,事件觸發,隊列操作,task同步調度(fork …join,fork …join_any,fork …join_none的用法差異)

(9)掌握一些常用的協議,如I2C(能夠根據提示用verilog實現),SRAM協,AMBA(AHB),AXI

(10)異步復位在使用時應當注意什麼?

異步復位,同步釋放

(11)請畫出異步復位同步釋放的電路結構:

(12) 在驗證環境中,C如何access和dut中寄存器,是如何聯繫的?

Verilog 提供VPI接口,可以將DUT的層次結構開放給外部的C/C++代碼,而systemverilog提供了更好的接口:DPI.

(13)掌握一些常用的低功耗方法,如clock gating(能畫出電路結構圖),瞭解DVFS,多閾值電壓技術,多電壓技術

(14)組合邏輯輸出需經過寄存器過濾毛刺

數字IC驗證面試題:

面試準備:

面試之前充分準備自我介紹,針對外企可以準備一份英文自我介紹,最好能夠用英文介紹自己做過的項目或課題。然後最重要的是充分準備好你簡歷所寫的內容,寫在簡歷上的東西一定是你喫透了的。如果有項目的話最好把項目各方面可能會被問到的問題想到。另外一個容易被忽視的是,好多人對選擇工作城市的理由上準備很不充分,我自己就因爲這個吃了很多虧。要能夠給出很合理且具有說服力的理由讓面試官相信你確實想要去那座城市工作和生活,表現出自己的誠意。不然就會讓面試官懷疑你只是在收割offer.

技術面:如果你有項目經歷的話,面試官最關心的是你對自己做過的項目有沒有喫透。所以面試前的準備就顯得很重要,當然,這是建立在你紮實的項目經歷之上的。當然,有些面試官如果對你的項目經歷不感興趣,他/她可能會問你一些基礎知識。比如我就遇到過不懂驗證的面試官,當場出一兩個基礎題(比如COMS相關,10進制計數器電路結構,只用兩輸入與非門實現兩輸入或門等等)。大多數技術面的時候最後面試官一般會問你還有什麼問題,面試前最好有所準備,準備一些有關職業發展,工作崗位等問題。一般在技術面時不要提及薪資待遇,因爲這是HR負責的部分。

HR面:HR面一般在技術面通過之後,這個時候就可以細緻地瞭解薪資福利等方方面面的問題啦,包括喫,住,行等問題都可以提問。

  1. 先簡單談談你現在在做的工作。

  2. 請談談你在學校的學習和項目。

  3. 請談談你對UVM驗證方法學的理解。

UVM驗證方法學是基於systemverilog語言形成的一個高效的驗證方法。它的主要特點是提高了代碼的複用性,使得驗證人員能通過代碼移植複用修改快速搭建驗證平臺,從而將主要精力放在具體測試用例的編寫上。另一方面,UVM封裝了很多好用的方法,這使得驗證人員不必過多關注底層實現,而且減少了驗證平臺的調試時間。

  1. 請談談UVM組件的關係。

  2. 舉例談談UVM組件中的一些常用方法。

  3. 請談談virtual sequencer與sequencer的區別,以及爲什麼要用virtual sequencer?

如果只有一個驅動端agent,顯然是不需要使用virtual sequencer的。

如果有多個驅動端agent,但是多個激勵之間並無協調關係,virtual sequencer 也並無必要。

如果有多個驅動端agent,而且多個激勵之間存在協調關係,那麼virtual sequencer就很有必要了。這個時候環境中需要包含一個甚至多個virtual sequencer了。

virtual sequence 和virtual sequencer的“virtual”有何含義呢?

Virtual sequencer 有三個屬性:

(1)Virtual sequencer控制其他的sequencer

(2)Virtual sequencer並不和任何driver相連

(3)Virtual sequencer本身並不處理item

並不像正常的sequencer那樣,將sequence item 通過sequencer port傳遞給driver。Virtual sequencer通過一個指向subsequencer目標的句柄來指定sequencer。這裏的subsequencer就是和driver相連接的真實sequencer。所謂的virtual就是指真正的sequence並不是在Virtual sequencer裏產生和傳遞的。一個virtual sequencer可以通過它的subsequencer產生許多種不同類型的tranction。而virtual sequencer的作用就是在協調不同的subsequencer中sequence的執行秩序了。

  1. 爲什麼會有sequence,sequencer,以及driver,爲什麼要分開實現?這樣做有什麼好處?

最初的驗證平臺,只需要driver即可,爲什麼還需要sequence機制?

(1).如果事務在driver裏定義,會產生一個問題。比如事務種類繁多,豈不是每次啓動一個事務,都要修改driver的main_phase代碼部分。

(2).如果定義多個driver,那麼會把UVM樹形結構搞的亂七八糟。所以,要從driver裏剝離事務產生(具體包括事務定義、事務產生的步驟)的代碼部分。driver只負責事務驅動即可。

(3).補充一句,驗證的case_list,是用sequence機制去實現的;並保證了UVM樹形結構的單一性、統一性。使得可維護的能力大大加強。

上述解釋,也是sequence和sequence_item不屬於uvm_componet的原因。case相關的代碼改動,都在sequence和sequence_item裏實現。

  1. 你寫過assertion嗎?assertion分爲哪幾種?簡單描述下assertion的用法。

Systemverilog斷言屬於驗證方法中的一種,斷言(assertions)就是對設計屬性(property行爲)的描述,如果一個屬性不是我們期望的那樣,那麼斷言就會失敗。assertions與verilog相比,verilog是一種過程性語言。它的設計目的是硬件描述,它可以很好的控制時序,但是描述複雜的時序關係,代碼較爲冗長,assertions是一種描述性語言,設計目的爲仿真驗證,可以有很多內嵌的函數來測試特定的時序關係和自動收集覆蓋率數據。

SVA分爲併發斷言和即時斷言兩種。併發斷言是基於時鐘週期的,在時鐘邊沿計算表達式,它可以放在模塊(module),接口(interface),或程序塊(program)的定義中,以關鍵詞“property”來定義,可以在靜態驗證工具和動態驗證工具中使用。即時斷言是基於事件的變化,表達式的計算像verilog中的組合邏輯賦值一樣,是立即被求值的,與時序無關,必須放在過程塊中定義。

併發assertions:

property a2b_p; //描述屬性

@(posedge sclk) $rose(a) |->[2:4] $rose(b);

endproperty

a2b_a: assert property(a2b_p); //assert property SVA的關鍵字表示併發斷言

a2b_c: cover property(a2b_p); //覆蓋語句

  1. 請描述一下你所驗過的模塊的功能。

  2. 你對fifo熟悉嗎?談談如何判斷fifo的空滿狀態?

(1)嚴格的空滿判斷: w_ptrr_ptr且讀寫回環標誌位相同時爲空, w_ptrr_ptr且讀寫回環標誌位不同時爲滿。這在同步fifo中一般沒什麼問題,但是在異步fifo中一般要做悲觀的空滿判斷,以免在fifo空時讀獲fifo滿時寫。

(2)保守的空滿判斷:方向標誌與門限。設定了FIFO容量的75%作爲上限,設定FIFO容量的25%爲下限。當方向標誌超過門限便輸出滿/空標誌,其實這時輸出空滿標誌FIFO並不一定真的空/滿。

  1. fifo有同步的和異步的,它們有什麼區別?

同步fifo讀寫時鐘相同,異步fifo讀寫採用不同的時鐘。

  1. 對於異步fifo,如何處理空滿時的同步問題?還可以採用什麼方法?

讀寫指針轉化爲格雷碼後再進行同步。

  1. 請談談驗證的思想,驗證人員和設計人員思考問題的差異。

驗證永遠是不充分的,永遠是沒有最好的,用一個同事的話說,如果非要給驗證訂一個期限的話,我希望是一萬年。

目前通用的做法是看coverage.

(1).看design spec

(2).瞭解相關協議

(3).編寫test plan及verification spec

(4).搭建驗證平臺

(5).依據testplan創建測試用例testcases

(6).仿真和debug,包括環境和design的bug,花費時間最多。工具是VCS/verdi

debug的手段主要有:查看log,看波形

(7). regression 和覆蓋率

(8). code review

  1. 你們項目中都會考慮哪些coverage?

Line coverage, condition coverage,branch coverage, toggle coverage, statement coverage(FSM)

  1. coverage一般不會直接達到100%,當你發現有condition未cover到的時候你該怎麼做?

編寫定向測試用例(direct case)

16.爲什麼要儘量避免絕對路徑的使用?如何避免?

絕對路徑的使用大大減弱了驗證平臺的可移植性。避免的方法是使用宏和interface.

  1. 如何在driver中使用interface?爲什麼?

由於driver是類,而在類中不允許直接使用interface,所以在類中使用的是virtual interface。然後再top_tb中通過uvm_config_db#(virtual)::set()…的方式將if set到driver 的vif.

  1. 你瞭解UVM的callback機制嗎?

callback機制最大的用處就是提高驗證平臺可重用性。它通過將兩個項目不同的地方使用callback函數來做,而把相同的部分寫成一個完整的env,這樣重用時,只要改變相關的callback函數,env可以實現完全的重用。

此外,callback還用於構建異常的測試用例,通過factory機制的重載也可以實現這一點。

18.OVM和UVM有什麼區別?

UVM = OVM + VMM(RAL)?

OVM沒有寄存器解決方案,也有factory機制,然而cadance推出RGM之後補上了這一短板,但使用RGM需要額外下載,沒有成爲OVM的一部分。OVM現在已經停止更新。

UVM幾乎完全繼承 OVM,同時又採納了synopsysVMM中的RAL寄存器解決方案,同時吸收了VMM的一些優秀的實現方式。又mentor和candence2008年聯合發佈。

19.UVM各component之間是如何組織運行的,是串行的還是並行的?如果串行的,請問是通過什麼機制實現各組件之間的運行調度的?

關於UVM的運行機制,學過UVM的應該都很清楚了,無非是各組件之間的關係,以及Phase機制等等。UVM其實質是軟件,而軟件本質上都是順序運行的,dut硬件是並行運行的。關於各組件之間的運行調度,僅僅從《UVM實戰》這本書上是得不到答案的,時候我有翻看了SV綠皮書,感覺從中找到了答案。測試平臺的調度是通過事件觸發驅動的(如@,

->event)

20.對一個加密模塊和解密模塊進行驗證,如果數據先進行加密緊接着進行解密,如果發現輸入數據與輸出數據相同,能不能說明這兩個加解密模塊功能姐沒有問題?爲什麼?

看到這道題,當時的反應就是應該首先分別對加密模塊進行驗證,如果沒有問題,再一起進行驗證。但是面試官對這個問題貌似並不滿意,問我爲什麼直接驗就不行呢?我當時一下子也說不出原因。

21.在對一個模塊仿真的時候發現:如果輸入是一個地址addr,發現dut的輸出是一個相同的地址addr,但是參考模型的輸出是addr1.請分析可能是什麼問題導致的?你會怎麼去解決?

我首先想到的是,要麼dut設計出錯,要麼參考模型出錯。首先需要根據spec的定義檢查我們的參考模型有沒有問題,如果沒有問題,通過仿真對設計進行debug,找designer確認問題和修復。但是面試官依然不滿意,她最後指出,我有沒有考慮到可能通過配置寄存器讓dut工作在不同模式,是不是dut工作在bypass模式,而參考模型工作在其他模式?當時就得自己怎麼就沒想到呢?有點自慚形穢,可事後細想,發現她的提問方式本身就有問題,提問時沒有給出足夠多的信息和引導,答不上來也是在情理之中。下來和也參加面試的同學討論的時候發現,幾乎所有人都被問到了同樣的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章