注:提前批題型一般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
參考代碼:(在July_714老哥基礎上做出小修改)
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
測試數據:2,2,3,5,5,2 ;則結果應為:dout = 3,cnt = 1 。
仿真結果:
注意:一個序列若第一個數為最小值,應注意次小值應比它大(如果只有兩種數,那么次小值也是最大值);另外因為題目沒有dout_vld信號所以一個序列檢測完結果保持等待復位信號或下一個有效信號讀入。
參考資料:樂鑫2022數字IC崗位提前批筆試題
參考資料:FPGA、數字IC系列