數字IC筆試題-芯源


前言

      由於最近開始找數字IC的工作,所以准備多練筆試題,下面貼上芯源筆試題,來源微信公眾號<數字IC打工人>

參考資源:

1. mu_guang_

 2.  李銳博恩

3. 長弓的堅持

 4. https://yunyaniu.blog.csdn.net/

筆試題

1、Please code the divider by 3 with Verilog(50% duty cycle).用Verilog設計一個3分頻器,要求50%占空比。

 

 1 module div_clk (
 2 input           wire          clk,
 3 input            wire          rst_n,
 4 output          wire          div_clk
 5 
 6 );
 7 
 8 parameter  DIV = 3;
 9 
10 reg             [31:0]          pos_cnt;
11 wire             pos_clk;
12 reg             [31:0]           neg_cnt;
13 wire             neg_clk;
14 
15 //上升沿分頻
16 always@(posedge clk or negedge rst_n)begin
17 if(!rst_n)begin
18   pos_cnt <= 'd0;
19 end
20 else if(pos_cnt==DIV-1)begin
21  pos_cnt<= 'd0;
22 end
23 else begin
24 pos_cnt<= pos_cnt+1'd1;
25 end
26 
27 end
28 
29 assign pos_clk =(pos_cnt<DIV/2)? 0: 1;
30 //下降沿分頻
31 always@(negedge clk or negedge rst_n)begin
32 if(!rst_n)begin
33   neg_cnt <= 'd0;
34 end
35 else if(neg_cnt==DIV-1)begin
36  neg_cnt<= 'd0;
37 end
38 else begin
39 neg_cnt<= neg_cnt+1'd1;
40 end
41 
42 end
43 
44 assign neg_clk =(neg_cnt<DIV/2)? 0: 1;
45 
46 //奇偶判斷后,輸出分頻時鍾
47 
48 assign div_clk = (DIV[0]==1)?(pos_clk&neg_clk) : pos_clk;
49 
50 endmodule
DIV

 

2、Please describe the digital P&R flow.請簡述數字后端P&R流程。

后端設計流程:
  1、可測性設計——DFT
Design ForTest,可測性設計。芯片內部往往都自帶測試電路,DFT的目的就是在設計的時候就考慮將來的測試。DFT的常見方法就是,在設計中插入掃描鏈,將非掃描單元(如寄存器)變為掃描單元。關於DFT,有些書上有詳細介紹,對照圖片就好理解一點。

DFT工具:Synopsys的DFT Compiler

   2、布局規划(FloorPlan)
布局規划就是放置芯片的宏單元模塊,在總體上確定各種功能電路的擺放位置,如IP模塊,RAM,I/O引腳等等。布局規划能直接影響芯片最終的面積。

工具為Synopsys的Astro。

  3、時鍾樹綜合——CTS
Clock Tree Synthesis,時鍾樹綜合,簡單點說就是時鍾的布線。

由於時鍾信號在數字芯片的全局指揮作用,它的分布應該是對稱式的連到各個寄存器單元,從而使時鍾從同一個時鍾源到達各個寄存器時,時鍾延遲差異最小。這也是為什么時鍾信號需要單獨布線的原因。

CTS工具,Synopsys Physical Compiler。

  4、布線(Place & Route)
這里的布線就是普通信號布線了,包括各種標准單元(基本邏輯門電路)之間的走線。比如我們平常聽到的0.13um工藝,或者說90nm工藝,實際上就是這里金屬布線可以達到的最小寬度,從微觀上看就是MOS管的溝道長度。

工具Synopsys的Astro

  5、寄生參數提取
由於導線本身存在的電阻,相鄰導線之間的互感,耦合電容在芯片內部會產生信號噪聲,串擾和反射。這些效應會產生信號完整性問題,導致信號電壓波動和變化,如果嚴重就會導致信號失真錯誤。提取寄生參數進行再次的分析驗證,分析信號完整性問題是非常重要的。

工具Synopsys的Star-RCXT

  6、版圖物理驗證
對完成布線的物理版圖進行功能和時序上的驗證,驗證項目很多,

如LVS(Layout Vs Schematic)驗證,簡單說,就是版圖與邏輯綜合后的門級電路圖的對比驗證;

DRC(Design Rule Checking):設計規則檢查,檢查連線間距,連線寬度等是否滿足工藝要求;

ERC(Electrical Rule Checking):電氣規則檢查,檢查短路和開路等電氣規則違例;等等。

工具為Synopsys的Hercules

3、Please use a MUX and INV to implement aXOR.如何用一個2選一的MUX和一個INV實現異或。

 verilog實現:

 1 module xor_rill
 2  3 input a,
 4 input b,
 5  
 6 output z
 7 );
 8  
 9 assign z = a?(~b):b;
10  
11 endmodule

電路結構圖如下:

 

4、What are recovery and removal times?請描述recovery時間和removal時間的概念。

恢復時間:Recovery time

撤銷復位時,恢復到非復位狀態的電平必須在時鍾有效沿來臨之前的一段時間到來,才能保證有效的恢復到非復位狀態,此段時間為Recovery time。類似於同步時鍾的setup time

 

如圖所示,rst_n為0表示復位,clk上升沿觸發,rst_n從0到1上升沿與時鍾上升沿之間的時間差必須不小於Recovery time才能保證寄存器恢復到正常狀態。

我的理解,恢復時間為,撤銷復位時,到下一個有效時鍾上升沿的時間,如上圖。

去除時間:Removal time

復位時,在時鍾沿來臨之后復位信號還需要保持的時間是去除時間,類似於同步時鍾的 hold time。

 如圖所示,rst_n為0表示復位,clk上升沿觸發,rst_n保持為0經過clk上升沿后仍需要保持一段時間,才能保證寄存器有效復位。

5、The clock cycle is T, the clock toregister output delay is Tco, setup and hold time of a register are Tsetup andThold, what's the Tdelay constrain?

時鍾周期為T,時鍾到寄存器輸出延時Tco,寄存器建立時間Tsetup,寄存器保持時間Thold。請描述邏輯延時Tdelay的建立和保持時間要求(不考慮時鍾延時)。

  

6、What's the difference between a LATCH anda DFF?請描述LATCH和DFF的概念和區別?

 

 7、What's the difference between asynchronous and an asynchronous circuit?同步電路和異步電路的區別是什么?

同步電路:存儲電路中所有觸發器的時鍾輸入端都接同一個時鍾脈沖源,因而所有觸發器的狀態的變化都與所加的時鍾脈沖信號同步。

異步電路:電路中沒有統一的時鍾,有些觸發器的時鍾輸入端與時鍾脈沖源相連,只有這些觸發器的狀態與時鍾同步,而其他的觸發器狀態變化不與時鍾脈沖同步。

 

8、What is IR-drop, in which area will beeasy to have IR-drop problem ?什么是IR-drop,在那些地方容易出IR-drop問題?

IR壓降是指出現在集成電路中電源和地網絡上電壓下降或升高的一種現象。

從電源布線的角度講,那些遠離電源端的地方,電源布線少的地方,容易出現ir-drop的問題。

從swtiching activity的角度講,toggle rate高並且celldensiy高的地方IRdrop大,所以切記不要為了balance clock tree,把一堆clock buffer擺在一起。

9、How do you synchronize an asynchronousinput?異步信號如何進行同步?

 

方法:

1.采用兩級觸發器,減少可能出現的亞穩態影響;

2.異步FIFO和DPRAM;

3.握手協議,有效使能后,確認;

10、Please draw the state machine transmissiondiagram of the array detection 10010,code with Verilogand build the testbench and testcase to get 100% fsm coverage.畫出可以檢測10010序列的狀態圖,並用Verilog實現,搭建測試平台並寫出可以達到100%狀態機覆蓋率的testcase。

 狀態圖如下

 序列檢測,就是將一個指定序列從一個碼流中識別出來,如10010從考慮碼流為110010010000100101....,注意點,我的理解,即從IDEL狀態開始未到最后一個狀態,即未能連續檢測到10010時,前面四個狀態,都是直接順序圈,看連續1個,2個,3個,4個能否出現我們預置的4個狀態(S1,S2,S3,S4);在S5特別注意,此時再輸入就為6個序列,輸入X為1,類似地順序全,連續1個,2個,3個,4個,5個,只能出現1,即狀態S1,其他不符合,而輸入0,則連續圈三個,出現100,符合狀態S3。

  1 module SEQDET_FSM(
  2 
  3     // INPUTS
  4 
  5         Clk,        // posedge active
  6 
  7         rst_n,      // negedge active
  8 
  9         x,          // sequence input
 10 
 11     // OUTPUTS       
 12 
 13         y           // detection "10010"
 14 
 15     );
 16 
 17    
 18 
 19     // Number of states = 6
 20 
 21     parameter Idle    = 4'b0000;
 22 
 23     parameter State_1 = 4'b0001; // 1
 24 
 25     parameter State_2 = 4'b0010; // 10
 26 
 27     parameter State_3 = 4'b0011; // 100
 28 
 29     parameter State_4 = 4'b0100; // 1001
 30 
 31     parameter State_5 = 4'b0101; // 10010
 32 
 33    
 34 
 35     input              Clk;
 36 
 37     input              rst_n;
 38 
 39     input              x;
 40 
 41    
 42 
 43     output             y;
 44 
 45  
 46 
 47     reg                y;
 48 
 49     reg     [3:0]      State_current;
 50 
 51     reg     [3:0]      State_next;
 52 
 53    
 54 
 55     // Synchronous timing always module, describing state transition
 56 
 57     always@(posedge Clk or negedge rst_n)
 58 
 59     begin
 60 
 61         if(!rst_n)
 62 
 63             State_current <= Idle;
 64 
 65         else
 66 
 67             State_current <= State_next;
 68 
 69     end
 70 
 71    
 72 
 73     // Combinational logic always module, judging state transition
 74 
 75     always@(State_current or x)
 76 
 77     begin
 78 
 79         case(State_current)
 80 
 81             Idle:
 82 
 83             begin
 84 
 85                 if(x)
 86 
 87                     State_next = State_1;       // detect 1
 88 
 89                 else
 90 
 91                     State_next = State_current;
 92 
 93             end
 94 
 95             State_1:
 96 
 97             begin
 98 
 99                 if(!x)
100 
101                     State_next = State_2;       // detect 10
102 
103                 else
104 
105                     State_next = State_1;       // detect 1
106 
107             end
108 
109             State_2:
110 
111             begin
112 
113                 if(!x)
114 
115                     State_next = State_3;       // detect 100
116 
117                 else
118 
119                     State_next = State_1;       // detect 1
120 
121             end
122 
123             State_3:
124 
125             begin
126 
127                 if(x)
128 
129                     State_next = State_4;       // detect 1001
130 
131                 else
132 
133                     State_next = Idle;          // detect 0
134 
135             end
136 
137             State_4:
138 
139             begin
140 
141                 if(!x)
142 
143                     State_next = State_5;       // detect 10010
144 
145                 else
146 
147                     State_next = State_1;       // detect 1
148 
149             end
150 
151             State_5:
152 
153             begin
154 
155                 if(x)
156 
157                     State_next = State_1;       // detect 1
158 
159                 else
160 
161                     State_next = State_3;       // detect 100
162 
163             end
164 
165             default:State_next = Idle;
166 
167         endcase
168 
169     end
170 
171     // next_state output
172 
173     always@(posedge Clk or negedge rst_n)
174 
175     begin
176 
177         if(!rst_n)
178 
179             y <= 1'b0; // reset
180 
181         else begin
182 
183             case(State_next)
184 
185                 Idle:
186 
187                     y <= 1'b0;                       
188 
189                 State_1:
190 
191                     y <= 1'b0;  
192 
193                 State_2:
194 
195                     y <= 1'b0;   
196 
197                 State_3:
198 
199                     y <= 1'b0;               
200 
201                 State_4:
202 
203                     y <= 1'b0;   
204 
205                 State_5:
206 
207                     y <= 1'b1;              // detect 10010           
208 
209                 default:
210 
211                     y <= 1'b0;
212 
213             endcase
214 
215         end
216 
217     end
218 
219 //https://www.bilibili.com/read/cv10936528 出處:bilibili
10010

 

 

11、What are gate-level simulations? You havea device that can be programmed via an 12C interface. What type of tests do yourecommend to run for gate level only?什么是門級仿真(后仿)?如果你有一個設備通過12C接口配置,有哪些針對門級仿真的測試用例?

 

 

12、Please constrain the timing of clock andinput signal in the waveform, both are input pins for a chip. 請對下圖中的輸入時鍾和輸入數據進行時序約束。

 

 

13、There is an X present in my gate-levelsimulation due to a timing violation. How do you identify the source of it andthe type of violation? 如果在后仿中波形中出現了X,如何去定位,且可能是什么問題?

 

14、Please describe the ECO flow(includingpre-mask ECO and post-mask ECO).請描述ECO流程,包括pre-mask和post-mask ECO。

 ECO有兩種,pre-mask ECO和post-mask ECO,它的分界線就是base later tape out之前和之后。pre-mask ECO的流程是

1)后端寫出網表,給前端

2)前端修改這個網表(一般不再做綜合),可以使用任何標准單元(只要不是dont_use),交給后端

3)后端讀入ECO網表,和ECO之前的place和route

4)ECO place&route,STA, DRC/LVS

post-mask ECO流程,假設你不想動base layer

1)后端寫出網表,給前端

2)前端修改這個網表(一般不再做綜合),只能使用spare cell或者像gate array一樣的ECO cell

3)后端讀入ECO網表,和ECO之前的place 和route

4)如果使用spare cell,不用ECO place;如果用ECO cell,要將ECO cell放在以前帶gate array功能的fill cell的位置上,再按照指定的layer做ECO route。

 

15、What are various techniques to resolverouting congestion?如何解決routing congestion問題?

 1. Change the power strap metal to a higher layer so that it does not impact cell placement.
2. Change the location of the power strap routes to avoid the congested area.

提示:
1) routing congestion發生在后端,前端一般不太考慮這個問題,需要后端自己去想辦法解決,但是解決的辦法不只在后端,也有一些方法需要前端的配合
2) 阻塞有多種情形,要分別討論,沒有一個統一的解決辦法。

答案:
1)阻塞在RAM(macro)之間:可能RAM之間的距離沒有計算正確,可以加大RAM之間的間距;扭轉RAM的方向,使得RAM的IO pin朝向更容易走線的那邊;如果是多個RAM共用地址或者數據線,盡量把RAM的地址數據pin對齊

2)阻塞出現在RAM和幫助單元交界的地方:在RAM周圍加一條halo(keepout);把RAM放在四周,盡量把中間留下的空間變成方形;在有阻塞的地方加一些由小的placement blockage組成的矩陣

3)阻塞出現在標准單元的某一塊:也可以加一些由小的placement blockage組成的矩陣;module/instance padding;利用placement guide減少那塊地方的標准單元個數;scan chain reordering也會改善一些阻塞;定義density上限;使用congestion driven的placement,並且要求place之后做congestion優化;在綜合是禁止使用那些pin太多太密集的標准單元(多半是那些復 雜的組合邏輯單元);請前端使用RAM代替觸發器矩陣;請前端修改算法

4)應該盡量減少power route占有的資源,謹慎選擇power mesh使用的金屬層,VIA的大小等。在detail route完成之后,你如果已經試了各種解決signal congestion的方法,還有少量DRC無法解決時,可以考慮切掉部分power mesh

16、Please describe the rtl with INV, AND, OR andDFF. 請用與、或、非門和寄存器畫出代碼所描述的電路。

always@(posedgeclk or negedge rst_n)

begin

if(!rst_n)

begin

cnt<= 2'd0;

end

else if(cnt_en)

begin

if(ina)

cnt <= cnt+2'd1;

end

else

begin

cnt <=2'd0;

end

end

17、What are the different sources of powerconsumption? Please describe different techniques used to reduce powerconsumption.芯片的功耗分為哪種類型,請描述降低功耗的方式。

 CMOS電路功耗主要由動態功耗和靜態功耗組成,動態功耗又分為開關功耗、短路功耗兩部分.

RTL級
1.並行結構:並行結構一定程度可以減低某一區域的頻率,從而可能降低功耗。
2.流水結構:“路徑長度縮短為原始路徑長度的1 /M。這樣,一個時鍾周期內充/放電電容變為C/M。如果在加入流水線之后,時鍾速度不變,則在一個周期內,只需要對C/M進行充/放電,而不是原來對C進行充/放電。因此,在相同的速度要求下,可以采用較低的電源電壓來驅動系統。”
3.優化編碼:通過數據編碼來降低開關活動,例如用格雷碼取代二進制。
4.操作數隔離:“操作數隔離的原理就是:如果在某一段時間內,數據通路的輸出是無用的,則將它的輸入置成個固定值,這樣,數據通路部分沒有翻轉,功耗就會降低。”

4.2 門級電路
1.門控時鍾技術: 芯片工作時,很大一部分功耗是由於時鍾網絡的翻轉消耗的,控技術基本原理就是通過關閉芯片上暫時用不到的功能和它的時鍾,從而實現節省電流消耗的目的,門控時鍾對翻轉功耗和內部功耗的抑制作用最強,是低功耗設計中的一種最有效的方法。
2.多電壓供電
3.多閾值電壓
根據多閾值電壓單元的特點,為了滿足時序的要求,關鍵路徑中使用低閾值電壓的單元(low Vt cells),以減少單元門的延遲,改善路徑的時序。而為了減少靜態功耗,在非關鍵路徑中使用高閾值電壓的單元(high Vt cells),以降低靜態功耗。因此,使用多閾值電壓的工藝庫,我們可以設計出低靜態功耗和高性能的設計。
4.動態電壓調節
5.動態頻率調節
————————————————

原文鏈接:https://blog.csdn.net/mu_guang_/article/details/115719673


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM