中國科學院大學數字集成電路作業開源——第1-3章
0、說明
開源內容為中國科學院大學《高等數字集成電路分析與設計》課程的個人作業答案,此開源僅供學習交流,禁止未經作者同意的轉載或抄襲。此外作業中可能有一些不嚴謹甚至出錯的地方,歡迎各位讀者在評論區中指出,一些有疑問的地方也歡迎討論。
所有代碼均已上傳gitee
https://gitee.com/sasasatori/ucas_digital_intergrated_circuit.git
1、基礎概念問題
1.1請簡要描述集成電路設計過程中,抽象分層的常規做法?抽象分層對集成電路設計所帶來的意義何在?
答:抽象分層的常規做法一般會通過抽象和分層思想,將整個集成電路設計分作系統層級、模塊層級、門電路層級、電路層級、器件層級共五個層級。
抽象分層對集成電路設計帶來的意義包括:
-
提高集成電路的設計效率,使得單個設計人員可以更快速的完成更大規模的電路設計,設計者可以更多聚焦到特定邊界下的極致任務高效優化
-
實現了整個產業鏈從系統到器件的層次化、精細化的任務分工,不同的設計層級有不同的公司鑽研,促進了產業的飛速發展
-
整個產業可以充分借助高性能機器、EDA工具實現按規則的優化迭代
-
抽象分層思想一定程度上避免了整個設計在架構和實現上的缺陷,關心對象屬性的縮小,往往可以研究出問題某一方面的本質規律和問題
1.1請簡要描述為何典型的超大規模集成電路,通常是采用CMOS工藝為基礎進行的設計,而不是采用基於其他工藝為基礎進行VLSI設計?
答:因為CMOS工藝相比其他工藝具備結構簡單,集成度高,耗散功率小的優點。結構簡單意味着電路制備更容易,成本更低、集成度高意味着電路面積可以減小,電路頻率可以提高、耗散功率小意味着大規模電路的能量損失相對少。
1.2 請簡要描述ASIC/FPGA前端設計流程?簡要描述Top-Down設計流程的意義及挑戰?
答:ASIC前端設計流程: RTL級代碼----功能仿真----邏輯綜合----等價性檢查,形式驗證----靜態時序分析
FPGA設計流程:RTL級代碼----功能仿真-----邏輯綜合-----門級仿真-----布局布線----時序仿真----版級驗證與仿真
Top-Down設計流程的意義:可以優化設計流程、提高設計效率,並確保工程設計整體的關聯性
Top-Down的挑戰:需要制定清楚各個流程間的邊界條件;需要在特定邊界條件的約束下完成對特定任務的高效收斂設計
1.3 請簡要描述在CMOS電路設計過程中,如何避免或降低寄生電感引起的同步開關噪聲(SSN)所導致的電路性能不穩定?
答:1. 減小信號的電源和地平面的阻抗
\2. 減小電源和地的回路電感
\3. 合理分配芯片的信號、電源和地引腳的數量比值
\4. 在芯片電源和地引腳附件添加合理的去耦電容
1.4 請分析針對CMOS反相器電路設計優化,在輸出驅動一定的前提下,通過哪些技術手段可提高CMOS反相器的驅動能力?
答:可以通過增大反相器尺寸來提高其驅動能力,尺寸即CMOS反相器中的CMOS與NMOS的寬長比。
由於大尺寸的反相器其輸入電容也會增大,造成前一級電路驅動反相器的時間增加,可以通過錐形反相器鏈的方式,通過逐級增加尺寸的級聯反相器鏈平衡驅動能力和延時。
1.5 請結合所在課題組研究課題方向,對如何學好本課程內容並結合課程內容更好的開展研發工作進行簡要論述。
答:本課題組主要研究存算一體與神經網絡加速方向,需要進行芯片設計和流片,其中存算一體神經網絡芯片的行列控制、時序產生等均需要數字集成電路設計的知識。為了更好地學習本課程的內容,需要結合課堂內容與課題組項目的實際需求,深入理解設計方法學,並吸收一些課題組過去的工程經驗,結合課程內容加深理解。
1.6 請簡要描述基於VerilogHDL語言對VLSI/FPGA設計帶來的意義?
答:VerilogHDL語言使得VLSI/FPGA設計變為可以通過語言描述的方式進行;
通過VerilogHDL可以對電路進行不同層級的建模(系統級、算法級、RTL級、門級、開關級),更容易的通過分層抽象的思想完成Top-Down的設計流程
1.7 請簡要描述基於VerilogHDL語言完成的可綜合電路與不可綜合電路的特點?
答:可綜合電路:可以通過綜合工具轉化為門級網表的RTL級電路;不可綜合電路:無法通過綜合工具轉化為門級網表的RTL級電路
可綜合電路:保證可綜合性,包括:
(1) 不使用initial
(2) 不使用延時語句
(3) 不使用循環次數不確定的循環語句,如forever,while等
(4) 不使用用戶自定義原語
(5) 盡量使用同步方式設計電路
(6) 除非是關鍵路徑的設計,一般不采用調用門級元件進行描述設計的方法,采用行為語句進行設計
(7) 用always塊描述組合邏輯,在敏感信號列表中列出所有的輸入輸出信號
(8) 所有的內部寄存器應能夠被復位,使用FPGA實現設計時盡量使用器件的全局復位端作為系統總的復位
(9) 對時序邏輯的描述和建模盡量使用非阻塞賦值方式,對組合邏輯建模可以使用阻塞賦值也可以使用非阻塞賦值,但在同一個過程塊中,避免同時使用阻塞和非阻塞賦值
(10)不在一個以上的always塊中對同一個變量賦值,對同一個賦值對象不能既使用阻塞賦值又使用非阻塞賦值
(11)在if或case語句中對所有條件分支明確賦值,避免變量被推導成鎖存器
(12)避免混合使用上升沿和下降沿觸發
(13)同一個變量的賦值不能受多個時鍾控制,不能受兩種不同的時鍾條件(或不同的時鍾沿)控制
(14)避免在case語句的分支項中使用x值或z值
不可綜合電路:使用了不可綜合的語句或違反了綜合規則等,包括:
(1) 使用initial,events,force,release,fork,join等不可綜合的語法
(2) 使用real,time等不可綜合的數據類型
(3) 對reg數據類型進行assign或deassign
(4) 使用非門級原語
(5) UDP和table
(6) 敏感列表中同時帶有posedge和negedge的信號,如always@(posedge clk or negedge clk)
(7) 同一個reg變量被多個always塊驅動
(8) 延時語句
(9) 與x值或z值的比較
1.8 請簡要描述阻塞描述語句與非阻塞描述語句的各自適用電路與使用注意事項?
答:阻塞描述語句:適用於組合邏輯電路結構的設計,在描述組合邏輯的always塊中使用阻塞賦值,會將電路綜合成組合邏輯的電路結構
非阻塞描述語句:適用於時序邏輯電路結構的設計,在描述時序邏輯的always塊中使用非阻塞賦值,會將電路綜合成時序邏輯的電路結構
阻塞賦值語句計算RHS后更新LHS,此時不允許別的賦值語句的執行。非阻塞計算RHS到更新LHS的期間,其他的Verilog語句也能同時計算RHS和更新LHS。
注意事項:
(1) 時序電路建模時,用非阻塞賦值
(2) 鎖存器電路建模時,用非阻塞賦值
(3) 用always塊建立組合邏輯模型時,用阻塞賦值
(4) 在同一個always塊中簡歷時序和組合邏輯電路時,用非阻塞賦值
(5) 在通過一個always塊中不要既用非阻塞賦值又用阻塞賦值
(6) 不要在一個以上的always塊中為同一個變量賦值
(7) 用$strobe系統任務來顯示用非阻塞賦值的變量值
(8) 在賦值時不要使用#0延遲
1.9 請簡要分析全同步電路與異步電路在常規VLSI電路設計過程中的設計應用注意事項與考慮思路?
答:(1) 全同步電路中所有觸發器共用一個觸發信號源,異步電路所有觸發器不共用觸發信號源
(2) 全同步電路所有的觸發器狀態同時刷新,信號延遲時間短,但結構復雜。異步電路結構簡單,但觸發器刷新不同步,信號延遲可能會累積導致狀態異常
(3) 同步電路可以有效避免毛刺的影響,提高設計可靠性,並可以簡化靜態時序分析過程,便於驗證時序性能
(4) 異步電路設計時必須要考慮跨時鍾域可能會導致的亞穩態問題
1.10 請簡要分析Latch與D-Flip-Flop電路在常規VLSI電路設計過程中的設計應用注意事項與考慮思路?
答:(1) Latch為電平敏感電路,D-Flip-Flop為邊沿敏感電路
(2) Latch由電平觸發,非同步控制,在使能信號有效時Latch相當於通路,使能信號無效時Latch保持輸出狀態,D-Flip-Flop由時鍾沿觸發,同步控制
(3) Latch容易產生毛刺,D-Flip-Flop不易產生毛刺
(4) Latch消耗的門資源少於D-Flip-Flop
(5) Latch使得靜態時序分析變得極為復雜
一般設計時應避免產生Latch,由於Latch不能夠過濾毛刺,會對時序造成很大的危害。
2 基於VerilogHDL進行邏輯電路設計
2.1向量前導1檢測器
設計一個組合邏輯電路,檢測輸入32位0/1向量中從高到低第一個1出現的位置,如果向量為全0則輸出32。例如:
輸入00011000 10000000 00000000 00000000,輸出3;
輸入00000000 11111111 00000000 00000000,輸出8;
輸入00000000 00000000 00000000 00001010,輸出28.
模塊輸入輸出功能定義:
名稱 | 方向 | 位寬 | 描述 |
---|---|---|---|
data_in | I | 32 | 輸入0/1向量 |
pos_out | O | 6 | 前導1出現位置,取值范圍0 ~ 32 |
設計要求:
Verilog實現代碼可綜合,邏輯延遲越小越好,給出仿真結果。
module Leading_1_Vector_Detector (
input [31:0] data_in,
output reg [5:0] pos_out
);
integer i;
always @(data_in) begin
for(i = 0; i < 32 ; i = i+1) begin
if (data_in[i]) pos_out = i;
else pos_out = pos_out;
end
if(data_in) pos_out = 6'd31 - pos_out;
else pos_out = 6'd32;
end
endmodule
module testbench ();
reg [31:0] data_in;
wire [5:0] pos_out;
initial begin
data_in = 32'b00011000_10000000_00000000_00000000;
#10
data_in = 32'b00000000_11111111_00000000_00000000;
#10
data_in = 32'b00000000_00000000_00000000_00001010;
#10
data_in = 32'b00000000_00000000_00000000_00000000;
end
Leading_1_Vector_Detector U_L1VD(
.data_in(data_in),
.pos_out(pos_out)
);
endmodule
2.2序列檢測器
設計一個序列檢測同步時序邏輯電路,要實現的功能如下:
當已有輸入碼流出現序列111000或101110時輸出檢測信號為1,否則輸出為0。在時序上檢測到完整序列的下一個時鍾周期輸出檢測結果。輸入信號有效為1時表示當前輸入有效,否則表示無效。之前輸入依舊計入序列中並不清零,即允許序列重疊檢測。例如:
輸入碼流(設輸入數據均有效)和輸出檢測為
[I] 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 0
[O] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1
模塊輸入輸出功能定義:
名稱 | 方向 | 位寬 | 描述 |
---|---|---|---|
clk | I | 1 | 系統時鍾 |
rst_n | I | 1 | 異步復位,低電平有效 |
din_vld | I | 1 | 輸入數據有效指示 |
din | I | 1 | 輸入數據 |
result | O | 1 | 輸出檢測結果 |
設計要求:
Verilog實現代碼可綜合,面積越小越好,給出仿真結果。
module Sequenial_Detector (
input clk,
input rst_n,
input din_vld,
input din,
output result
);
reg [5:0] seq;
assign result = ((seq == 6'b111000) || (seq == 6'b101110)) ? 1'b1 : 1'b0;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
seq <= 0;
end
else if (!din_vld) begin
seq <= seq;
end
else begin
seq <= {seq[4:0],din};
end
end
endmodule
module testbench ();
reg clk;
reg rst_n;
reg din_vld;
reg din;
wire result;
Sequenial_Detector U_SD(
.clk(clk),
.rst_n(rst_n),
.din_vld(din_vld),
.din(din),
.result(result)
);
always #10 clk = ~clk;
initial begin
rst_n = 1'b0;
clk = 1'b0;
din_vld = 1'b0;
#10
rst_n = 1'b1;
din_vld = 1'b1;
end
integer i;
reg mem[17:0];
initial $readmemb("input.txt",mem);
always @(posedge clk or negedge rst_n) begin
if(!rst_n == 1) begin
i = 0;
din <= 0;
end
else begin
din <= mem[i];
i = i + 1;
end
end
endmodule
2.3二進制轉BCD碼邏輯
設計一個8位無符號二進制數(取值范圍0 ~ 255)到10位BCD碼的轉換組合邏輯電路。其中12位BCD碼定義如下:
數據位 | 描述 |
---|---|
9:8 | 百位BCD碼,取值0 ~ 2 |
7:4 | 十位BCD碼,取值0 ~ 9 |
3:0 | 個位BCD碼,取值0 ~ 9 |
例如:
輸入8'b10100101(十進制165),輸出10'b01_0110_0101;
輸入8'b11110000(十進制240),輸出10'b10_0100_0000.
模塊輸入輸出功能定義:
名稱 | 方向 | 位寬 | 描述 |
---|---|---|---|
bin_in | I | 8 | 輸入二進制數 |
bcd_out | O | 10 | 輸出BCD編碼 |
設計要求:
Verilog實現代碼可綜合,邏輯延遲越小越好,給出仿真結果。
module Binary2BCD (
input [7:0] bin_in,
output [9:0] bcd_out
);
integer i;
reg [3:0] ge,shi,bai;
always @(bin_in) begin
bai = 4'b0;
shi = 4'b0;
ge = 4'b0;
for (i = 7; i >= 0; i = i-1) begin
if(bai >= 5) bai = bai + 3;
if(shi >= 5) shi = shi + 3;
if(ge >= 5) ge = ge + 3;
bai = bai << 1;
bai[0] = shi[3];
shi = shi << 1;
shi[0] = ge[3];
ge = ge << 1;
ge[0] = bin_in[i];
end
end
assign bcd_out = {bai[1:0],shi,ge};
endmodule
module testbench ();
reg [7:0] bin_in;
wire [9:0] bcd_out;
Binary2BCD U_B2BCD(
.bin_in(bin_in),
.bcd_out(bcd_out)
);
initial begin
bin_in = 8'b10100101;
#10
bin_in = 8'b11110000;
end
endmodule