前言
由於最近開始找數字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
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
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