FPGA/IC筆試——樂鑫2022提前批


注:提前批題型一般10道選擇、5道填空、兩道問答(RTL代碼)

以下將多次筆試題匯總:

一、選擇
1.以下關於System Verilog的描述,正確的 (D)

A:sv中可以用logic代替Verilog中的wire和reg類型(部分條件下不可代替,如:inout型端口只能用wire

B:sv中,定義成reg的信號會被綜合成觸發器(在組合邏輯中不被綜合為觸發器,如:不完全組合邏輯中reg變量也可以對應為鎖存器

C:sv中的function語言不可被綜合(可以綜合

D:其他都不正確

E:sv是提供給驗證使用的,因此不能被綜合(可被綜合

 

2.UVM層次化結構中,最頂層的部件類型是 (B)

A:uvm_test
B:uvm_root
C:uvm_top
D:uvm_component

【解析】uvm_root是驗證平台中所有UVM components的“隱含”的top-level和phase控制器。用戶不需要直接實例化uvm_root,UVM會自動創建uvm_root單一實例,用戶可以使用全局變量(uvm_pkg范圍內)uvm_top來訪問uvm_root。

 

3.數字信號上采樣時,一般需要添加什么樣的濾波器,完成功能為 (C)

A:高通,抗混疊濾波

B:低通,抗周期延拓

C:低通,抗混疊濾波

D:高通,抗周期延拓

【解析】過采樣技術的低通濾波器要同時完成量化噪聲的濾除和降采樣時抗混疊濾波的功能。

 

4.下列屬於異步總線的是 (C)

A:SPI

B:USB

C:UART

D:IIC
【解析】(1) SPI——同步通信;串行通信;全雙工;主從通信(某一時刻可以出現多個從機,但只能存在一個主機,主機通過片選線來確定要通信的從機)。(2) USB——同步通信;通用串行總線。(3) UART——異步通信;串行通信;全雙工; 對等總線,沒有仲裁機制,所以只能掛載兩個同時收發數據的設備,雙方都可以發送和接收。(4) I2C——同步通信;串行通信;半雙工;主從通信(總線上支持多個主機和多個從機,總線上任何能夠進行發送/接收數據的設備都可以占領總線。當然,任意時間點上只能存在一個主控。多主控,主器件同時爭奪總線控制權時,可仲裁)。

 

5.(B)電路的邏輯功能特點是,任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關。

A:靜態邏輯

B:組合邏輯

C:動態邏輯

D:時序邏輯

【解析】

  • 靜態邏輯電路中靠穩定的輸入信號使MOS晶體管保持導通或截止狀態,從而維持穩定的輸出狀態。輸入信號存在,對應的輸出狀態存在;只要不斷電,輸出信息可以長久保持;
  • 動態邏輯電路中利用電容的存儲效應來保存信息,即使輸入信號不存在,輸出狀態也可以保持,但由於泄漏電流的存在,信息不能長期保持;
  • 時序邏輯電路由存儲電路和組合邏輯電路兩部分組成,任何一個時刻的輸出狀態由當時的輸入信號和電路原來的狀態共同決定。

 

6.在芯片設計流程當中,通常會進行后仿真(post-simulation),關於后仿的作用,以下說法不正確的是 (B)

A:抽檢netlist是否和RTL功能一致

B:抽檢電路中是否出現有害的glitch

C:抽檢時序是否有違規

D:抽檢電路中是否存在亞穩態

 

7.以下關於異步處理正確的是 (C)

A:信號經過兩級觸發器即可完成異步信號的傳遞

B:只要信號傳遞的兩端時鍾頻率不相等,即認為是異步信號

C:異步復位信號需要經過同步處理后再使用是安全的 (異步復位,同步釋放)

D:異步FIFO中使用格雷碼傳遞異步計數器可以保證每一拍傳遞的數據都是准確的

 

8.關於跨時鍾域電路的設計,以下說法正確的是 (D)

A:單bit信號經兩級D觸發器同步后即可進行跨時鍾域傳遞

B:采用單一時鍾的電路不會產生亞穩態 (亞穩態產生原因是建立時間setup或保持時間hold不滿足,單路時鍾也有可能不滿足)

C:異步FIFO的兩個時鍾頻率相同也可以正常工作 (???)

D:跨時鍾域電路當中的亞穩態無法消除 (只要系統中有異步元件,亞穩態就無法避免)

 【解析】幾種方法跨時鍾域處理方法:

  • 打兩拍,兩級觸發器同步——單bit數據跨時鍾域處理,適用於慢時鍾域數據到快時鍾域;
  • 異步雙口RAM(異步FIFO可以實現同樣效果)——多bit數據跨時鍾域處理;
  • 格雷碼轉換;
  • 加握手信號。

9.衡量數字通信系統傳輸質量的指標是 (D)

A:信噪比

B:噪聲功率

C:語音清晰度

D:誤碼率

 【解析】衡量數字通信系統傳輸質量的指標分為兩種:可靠性和有效性指標,有效性主要指標為傳輸速率,可靠性主要指標誤碼率或者說是誤信率

10.以下代碼片段實現的電路功能是 (B、C)

input   [3:0] in; output  [3:0] out; wire    [3:0] a,b; assign a = in<<1; assign b = in>>3; assign out = a|b;

A:對輸入信號in先右移3位,再左移1位

B:對輸入信號in循環左移1位

C:對輸入信號in循環右移3位

D:對輸入信號in先左移1位,再右移3位

11.若要將一異或非門當做反相器使用,則輸入端A,B的連接方式是(B)

A. A和B並聯使用

B. A或B中有一個接“0”

C. A或B中有一個接“1”

D. 不能實現

12.假設一個3bit計數器(計數范圍為0~6)工作在38M時鍾域下,要把此計數器的值傳遞到另一個異步100M時鍾域,以下不正確的是()?

A. 使用異步FIFO

B. 鎖存+握手信號

C. 使用格雷碼

D. 使用DMUX電路

解析:本題答案為C,之所以不能使用格雷碼做同步的原因是計數器的技術范圍在0~6,如果是0-7就可以用了,這樣格雷碼就可以形成閉環(直接使用格雷碼做跨時鍾域需要2^n個連續的計數才可以)。

13. D觸發器:Tsetup=3ns,Thold=1ns,Tck2q=1ns,該D觸發器最大可運行時鍾頻率是

A 1GHZ     B 250MHZ
C 500MHZ   D 200MHZ

解析:Tsetup + Tck2q 是整個路徑上delay,最大頻率和Thold無關,所以就是4ns,答案為B。

二:填空

1.verilog 當中 a=4'b10x1; b=4'b10x1; 那么邏輯表達式 a==b 為(x)a===b為(1);

2.4bit的信號輸入和8bit的信號輸入的乘法器內部計算輸出信號至少需要(12)bit的位寬;

3.通常情況下,芯片工作溫度較(低),工作電壓較(高),速度最快。

4.以下代碼的打印輸出是 (0)

always@(posedge clk) begin a = 0;   //阻塞 a <= 1;  //非阻塞 $display("%0b",a); end

注:%b使用固定寬度顯示,以適應所顯示表達式的最大可能值。 %0b顯示最小寬度,禁止任何前導0或間隔。

5.全部使用組合邏輯實現復數A,B,C的運算|A*(B+C)|^2時, 共需使用()個乘法器與()個加法器

答案:6個乘法器,5個加法器 

6.assign重寫一段代碼。

wire [7:0]in, a, b;
reg [7:0]out;
genvar i;
generate
    for(i=0;i<8;i++)begin:gen_block
        always @(*) begin
            if (in[i]) begin
                out[i] = a[i]^b[i];
            end
            else begin
                if(i==0)
                    out[i]=1'b0;
                else
                    out[i]=in[i-1];
            end
        end
    end
endgenerate

答案:assign out = (in&(a^b))|(~in&{in[6:0],1’b0});

解析: in[i]=1時,a[i]^b[i];In[i]=0時,左移一位,最低位補零。

7.用2048x12的ROM芯片,最多能實現()個輸入 ()個 輸出的組合邏輯的數。

答案:11,12

解析:2048=2^11,2048深度,是11位地址位,2048*12表示11位輸入地址、12位輸出數據(ROM只能輸出)。

8.一個4bits的輸入A,AE= 4’b0, A中從MSB開始出現的第個1的位置表示為B。 e.g.: A= 4’b0111. B= 2’b10 (從MSB開始,第一個1出現在A的bit2)
B[1]= () B[0]= ().

答案:A[3]|(~A[3]&A[2]),A[3]|(!A[3:2]&A[1])

解析: A[3]=1時,B=2’11,B[1]=1,B[0]=1;
A[3]=0,A[2]=1時,B=2’10,B[1]=1,B[0]=0;
A[3]=0,A[2]=0,A[1]=1時,B=2’01,B[1]=0,B[0]=1;
A[3]=0,A[2]=0,A[1]=0,A[0]=1時,B=2’00,B[1]=0,B[0]=0;

B[1]= A[3]|(~A[3]&A[2])
B[0]= A[3]|(!A[3:2]&A[1])

~是按位取反,!是邏輯取反(非0即1)

9.某個SRAM共12根地址線A11~A0,32根數據線D31~D0, 如果要實現1MB的Memory,需要()塊這樣的SRAM?

答案:64

解析:12根地址線,存儲深度為2^12,32根數據線有4 Bytes,即一個SRAM存儲2^14 Bytes,共需 2^20 / 2^14 = 2^6 = 64 塊。

10.已知R1= R2 = R3 = R4 = R5 = R6 = R,下圖從電源兩端向右看去的等效電阻為(2R)。

 解析:菱形聯接求等效電阻比較麻煩點,需要使用到Y/△變換,

根據△-Y的電阻等效變換公式,有:

  Ra=R1R3/(R1+R5+R3)=R/3;

  Rb=R1R5/(R1+R5+R3)=R/3;

  Rc=R3R5/(R1+R5+R3)=R/3。

則菱形等效電阻為 Ra + (Rb+R2) // (Rc+R4) = R;

11.一批IC樣品在測試中發現有setup或者hold時序問題 現取A B. C、D四顆樣品進行測試A降溫后停止工作,則很可能是()問題: B升溫后停止工作,則很可能是()問題; C降壓后停止工作,則很可能是()問題,D升壓后停止工作,則很可能是()問題。

答案:setup,hold,setup,hold

12.DC/DC和LDO的區別是()

DC/DC轉換器一般需要外部電路(電感線圈,二極管,三極管,電容)

DC/DC輸出高效率、功率

DC/DC噪聲較大

LDO具有最低的成本

13.如下電路的邏輯功能為(5)進制計數器

 

解析:這是3級JK觸發器,轉為D觸發器的格式寫出Q0Q1Q2的表達式:

always@(posedge clk) Q0 <=Q2&Q0 | ~Q2&~Q0; 

always@(posedge Q0) Q1 <= ~Q1;

always@(posedge clk) Q2 <= Q0&~Q1&~Q2;

給個初值3'b000,則狀態跳轉:000->011->010->001->100 ->000

三、代碼

題目描述1:使用verilog編寫一根單向導線wire_a仿真模型,此導線的傳輸延遲為5ns,且不會過濾此波形。

`timescale 1ns/10ps module wire_a( input      in,//輸入
    output    out //輸出
); reg out_reg; always@(*) begin out_reg <= #5 in; end

assign out = out_reg; endmodule

題目描述2:使用Verilog/SV撰寫如下功能模塊;求輸入信號序列din在din_vld為高電平的時間段內的次小值和次小值出現的次數。接口信號如下:

module sec_min( input clk,           //時鍾信號
    input rst_n,         //復位信號
    input [9:0] din,     //10bit無符號數
    input din_vld,       //輸入數據有效信號
    output [9:0] dout,   //次小值
    output [8:0] cnt     //次小值出現的次數,溢出時重新計數
); endmodule     

參考代碼:(在老哥基礎上做出小修改)

 1 module sec_min(  2     input   clk,                //時鍾信號
 3     input   rst_n,              //復位信號
 4     input   [9:0]   din,        //10bit無符號數
 5     input   din_vld,            //輸入數據有效信號
 6     output  [9:0]   dout,       //次小值
 7     output  [8:0]   cnt          //次小值出現的次數,溢出時重新計數
 8 );  9 
 10 reg    [9:0] min_data;  11 reg    [9:0] sub_data;  12 reg    [9:0] data_reg;  13 reg    [1:0] data_cnt;  14 reg    [8:0] sub_cnt;  15 reg    [8:0] min_cnt;  16 reg din_vld_r;  17 //寄存一拍
 18 always@(posedge clk or negedge rst_n)begin
 19     if(!rst_n)begin
 20         data_reg <= 'd0;
 21         din_vld_r<= 'd0;
 22     end
 23     else if(din_vld) begin
 24         data_reg <= din;  25         din_vld_r <= din_vld;  26     end
 27     else begin
 28         data_reg<=data_reg;  29         din_vld_r <= din_vld;  30     end
 31 end
 32 
 33 
 34 //計數器,區分第一個數據,第二個數據,和其他的數據
 35 always@(posedge clk or negedge rst_n)begin
 36     if(!rst_n)begin
 37         data_cnt<='d0;
 38     end
 39     else if(din_vld) begin
 40         if(data_cnt<'d3)begin
 41             data_cnt<=data_cnt+1;  42         end
 43         else begin
 44             data_cnt<='d3;
 45         end
 46     end
 47     else begin
 48         data_cnt<='d0;
 49     end
 50 end
 51 
 52 
 53 //分情況討論,第一個數據來的時候,將第一個數據給最小值和次小值;在第二個數據來的時候,分情況討論;在第三個及后面的數據來的時候,分情況討論。
 54 always@(posedge clk or negedge rst_n )begin
 55     if(!rst_n)begin
 56         min_data<='d0;
 57         sub_data<='d0;
 58     end
 59     else if(din_vld_r) begin  //因為din打了一拍,這塊使能也打一拍防止最后一個數漏檢
 60         min_data<=data_reg;  61         sub_data<=data_reg;  62         if(data_cnt=='d1)begin
 63             min_data<=data_reg;  64             sub_data<=data_reg;  65         end
 66         else if(data_cnt=='d2)begin
 67             if(data_reg<min_data)begin
 68                 min_data<=data_reg;  69                 sub_data<=min_data;  70             end
 71             else begin
 72                 min_data<=min_data;  73                 sub_data<=data_reg;  74             end
 75         end
 76         else if(data_cnt=='d3) begin
 77             if(data_reg<min_data)begin
 78                 min_data<=data_reg;  79                 sub_data<=min_data;  80             end
 81             else if(data_reg==min_data)begin
 82                 min_data<=min_data;  83                 sub_data<=sub_data;  84             end
 85             else if(data_reg>min_data && sub_data==min_data)begin    //防止開局數為最小數
 86                 min_data<=min_data;  87                 sub_data<=data_reg;  88             end
 89             else if(data_reg<=sub_data)begin
 90                 min_data<=min_data;  91                 sub_data<=data_reg;  92             end
 93             else begin
 94                 min_data<=min_data;  95                 sub_data<=sub_data;  96             end
 97         end
 98     end
 99     else begin
100         min_data<=min_data; 101         sub_data<=sub_data; 102     end
103 end
104 
105 
106 //根據數據來的順序和數值來進行次小值和最小值出現次數的計算 107 //然后分情況討論,當新值比最小值小的時候,就要將min_cnt賦值給sub_cnt 108 //其他情況比較容易想到,有問題請留言討論
109 always@(posedge clk or negedge rst_n)begin
110     if(!rst_n)begin
111         sub_cnt<='d0;
112         min_cnt<='d0;
113     end
114     else if(din_vld_r) begin
115         if(data_cnt==1)begin
116             sub_cnt<='d0;
117             min_cnt<='d1;
118         end
119         else if(data_cnt==2||data_cnt==3) 120         if(data_reg<min_data)begin
121             sub_cnt<=min_cnt; 122             min_cnt<='d1;
123         end
124         else if (data_reg==min_data)begin
125             sub_cnt<=sub_cnt; 126             min_cnt<=min_cnt+1; 127         end
128         else if(data_reg<sub_data)begin
129             sub_cnt<='d1;
130             min_cnt<=min_cnt; 131         end
132         else if(data_reg==sub_data) begin
133             sub_cnt<=sub_cnt+1; 134             min_cnt<=min_cnt; 135         end
136         else if(data_reg>min_data && sub_data==min_data) begin  
137             sub_cnt<=sub_cnt+1; 138             min_cnt<=min_cnt; 139         end
140         else begin
141             sub_cnt<=sub_cnt; 142             min_cnt<=min_cnt; 143         end
144     end
145     else begin
146         sub_cnt<=sub_cnt; 147         min_cnt<=min_cnt; 148     end
149 end
150 
151 //進行輸出
152 assign    dout=sub_data; 153 assign    cnt=sub_cnt; 154 
155 endmodule

測試文件tb:

 1 `timescale 1ns / 1ps
 2 
 3 module tb_submin;
 4 
 5     // Inputs
 6     reg clk;
 7     reg rst_n;
 8     reg [9:0] din;
 9     reg din_vld;
10 
11     // Outputs
12     wire [9:0] dout;
13     wire [8:0] cnt;
14 
15     // Instantiate the Unit Under Test (UUT)
16     sec_min uut_submin(
17         .clk(clk), 
18         .rst_n(rst_n), 
19         .din(din), 
20         .din_vld(din_vld), 
21         .dout(dout), 
22         .cnt(cnt)
23     );
24 always #5 clk = ~clk; 
25     initial begin
26         // Initialize Inputs
27         clk = 1;
28         rst_n = 0;
29         din = 0;
30         din_vld = 0;
31 
32         // Wait global reset to finish
33         #90;
34         rst_n = 1;
35         //first sequence
36         #10 din_vld = 1;
37             din = 10'd2;
38         #10 din = 10'd2;
39         #10 din = 10'd3;
40         #10 din = 10'd5;
41         #10 din = 10'd5;
42         #10 din = 10'd2;
43         #10 din_vld = 0;
44         //second sequence
45         #100 din_vld = 1;
46             din = 10'd10;
47         #10 din = 10'd10;
48         #10 din = 10'd6;
49         #10 din = 10'd5;
50         #10 din = 10'd5;
51         #10 din = 10'd2;
52         #10 din = 10'd5;
53         #10 din = 10'd2;
54         #10 din_vld = 0;
55         //reset
56         #100 rst_n = 0;
57         #10 rst_n = 1;
58 
59     end
60       
61 endmodule
testbench

 測試數據:2,2,3,5,5,2 ;則結果應為:dout = 3,cnt = 1 。

仿真結果:

 注意:一個序列若第一個數為最小值,應注意次小值應比它大(如果只有兩種數,那么次小值也是最大值);另外因為題目沒有dout_vld信號所以一個序列檢測完結果保持等待復位信號或下一個有效信號讀入。

 

 

參考資料:樂鑫2022數字IC崗位提前批筆試題

參考資料:FPGA、數字IC系列


免責聲明!

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



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