平頭哥晶元設計面試題收錄

2021-10-18 12:50:59 字數 2929 閱讀 2748

1、sv基礎

2、桶形移位法(專案相關)

桶型移位器是乙個多輸入、單輸出電路。對於輸入a[31:0],移位器首先會根據b[4:0]的值來確定移多少位,最後將結果c[31:0]輸出。

3、跨時鐘域的問題,包括單bit、多bit、詳細說明握手協議等,為什麼gray碼不會產生毛刺?

單bit訊號打拍的時候需要考慮時鐘頻率,當時鐘週期大於亞穩態的恢復時間,就可以減小亞穩態繼續傳播,因此一位同步器需要考慮時鐘頻率。

非同步fifo使用格雷碼的唯一目的就是「即使在亞穩態進行讀寫指標抽樣也能進行正確的空滿狀態判斷」。在非同步fifo中,採用格雷碼進行技術,相鄰的資料僅僅只有1bit變化,這樣在兩個時鐘域同步的時候僅僅只有1bit產生亞穩態,通過同步後,亞穩態會消除,最壞的情況就是這1bit採錯,但是即使是採錯位址也只是相差1個,這對判斷空滿標誌不會產生影響。如果是採用10進製進行編碼,則相鄰的資料可能有多位同時變化,那麼如果多位同時產生亞穩態而且同時採錯資料,會對暫存器的空滿標誌做出嚴重錯誤的判斷,會丟失資料或者讀出無用的資料,使系統出錯。

時鐘快慢有差別的時候,同步化的格雷碼變化兩次但是取樣一次,根據同步化的值可以發現有兩個bit,這會不會導致多位同步化問題? 答案是不會的,雖然格雷碼呈現出的結果是變化了兩個bit,但是它是在順序變化的,第一次變化穩定後,第二次變化在第一次的基礎上根據同步化後的時鐘上公升沿進行變化,這就不涉及多位變化問題。比如低時鐘域從4變化到6格雷碼那就是從0110----0111----0101。假設高時鐘週期為低時鐘的兩倍,那麼高時鐘採集0110之後,下次再採集0101之時,0111(5)的狀態必然是穩定的,所以你採集的資料要麼是5要麼是6,而不會出現4或者其他的中間資料。

4、加法器的具體實現verilog

//半加器:另個一位輸入實現的,與全加器的區別就是不帶進製加

module half_adder(

input a,

input b,

output sum,

output cout

); assign sum = a ^ b;

assign cout = a & b;

endmodule

//全加器

//進製輸出:ci+1=aibi+aici+bici=aibi+(ai+bi)ci

//和輸出:si=ai^bi^ci

module full_adder(

input a,

input b,

input c,

output sum,

output cout

); wire sum1;

wire cout1,cout2;

half_adder half_adder1(

.a(a),

.b(b),

.sum(sum1),

.cout(cout1)

);half_adder half_adder2(

.a(co),

.b(sum1),

.sum(sum),

.cout(cout2)

);assign cout = cout1 | cout2;

endmodule

5、fpga上怎麼實現浮點的加法乘法運算?

有些fpga中是不能直接對浮點數進行操作的,只能採用定點數進行數值運算。對於fpga而言,參與數**算的數就是16位的整型數,但如果數**算**現小數怎麼辦呢?要知道,fpga對小數是無能為力的,一種解決辦法就是採用定標。數的定標就是將要運算的浮點數擴大很多倍,然後取整,再用這個數進行運算,運算得到的結果再縮小相應的倍數就可以了。在設計中,一定不要忘記小數點。在fpga 中是體現不出來小數點的,小數點的位置只有程式設計師知道。q表示小數點的位置,q15就表示小數點在第15位。

浮點數(x)轉換為定點數(xq): xq=(int)x2^q

定點數(xq)轉換浮點數(x): x= (float)xq2^(-q)

比如,16進製制數2000h,用q0表示就是8192;若用q15表示,則為0.25。

下面介紹q格式運算中q值的確定:

(1)定點加減法:需要轉換成相同q格式才能加減

(2)定點乘法:不同q格式的資料相乘,相當於q值相加

(3)定點除法:不同q格式的資料相除,相當於q值相減

(4)定點左移:相當於q值增加

(5)定點右移:相當於q值減少

比如,q15表示的4000h(浮點數0.5)乘以q15表示的4000h,4000h×4000h=1000 0000h,乘完之後q值變為15+15=30,即結果為0.01b,即為浮點數0.25。

6、verilog的四值邏輯?那麼在乙個選擇器的使用過程中,若選擇訊號是x的時候,輸出是什麼,即if else中的if的條件為x的時候?(0、1、x、z)

(1)

assign c = sel ? a : b;

(2)

always @(sel or a or b) begin

if(sel)

c = a;

else

c = b;

end

if else的邏輯是:只要條件不符合,就走else路。

試想如果上級電路出錯,出現sel = 1』bx的時候,那麼**(2)的c就會走else支路,即c=b。

而雙目運算(? :)的執行結果跟實際電路更接近:連控制端sel都是不定值了,那c毫無疑問地應該是x,除非a=b。

總之,**(1)在綜合結果、資源利用等方面和(2)是完全一致的,但(1)的前仿結果跟後仿、跟實際電路更接近。

7、什麼時候會產生latch,case語句一定會產生latch嗎,if else呢?

阿里平頭哥晶元設計實習一面

第一問是時序問題,常見題目,問電路最高能跑到多少頻率,考察setup和hold,這裡挖了個坑,hold不滿足的時候問了我時鐘能跑到多少。第二問給了一段 讓我畫出波形圖,考察阻塞賦值和非阻塞賦值 logic a initial begin a 0 a 1 1 a 2 0 endlogic a init...

面試題 設計instagram

約束high level db design 詳細設計 擴充套件資訊流設計 使用者可以上傳 分享 關注其他人,亦可以看到自己的和好友的top 功能性 根據名稱搜尋 使用者關注他人 生成和展示資訊流,包含所有關注的人的top 非功能性 5.高可用 6.低時延 資訊流產生時延 200ms 7.ap系統 ...

設計模式面試題

參考 常用的設計模式彙總,超詳細!這個模式本身很簡單而且使用在業務較簡單的情況下。一般用於小專案或者具體產品很少擴充套件的情況 這樣工廠類才不用經常更改 它由三種角色組成 來用類圖來清晰的表示下的它們之間的關係 抽象工廠模式 先來認識下什麼是產品族 位於不同產品等級結構中,功能相關聯的產品組成的家族...