前端設(shè)計(jì)
數(shù)字系統(tǒng)設(shè)計(jì)中有三個(gè)重要的設(shè)計(jì)級(jí)別概念:行為級(jí)(Behavior Level)、寄存器傳輸級(jí)(Register Transfer Level)和門級(jí)(Gate level)。其中,
行為級(jí)通過行為級(jí)算法描述數(shù)字系統(tǒng);
寄存器傳輸級(jí)通過寄存器之間的數(shù)據(jù)傳輸進(jìn)行電路功能設(shè)計(jì),例如有限狀態(tài)機(jī);
門級(jí)按AND、OR、NOT、NAND等等描述,通常不會(huì)進(jìn)行門級(jí)設(shè)計(jì),門級(jí)網(wǎng)表一般是通過邏輯綜合的輸出。
RTL可以用Verilog或VHDL描述。Verilog是一種用于描述數(shù)字系統(tǒng)的硬件描述語言(HDL),例如Latches、Flip-Flops、組合邏輯、時(shí)序邏輯等?;旧希憧梢允褂肰erilog來描述任何類型的數(shù)字系統(tǒng)。設(shè)計(jì)通常以自頂向下的方式編寫,系統(tǒng)具有層次結(jié)構(gòu),使得設(shè)計(jì)和調(diào)試更容易。verilog模塊的基本框架如下:
module top_module( input clk, input rst, input [7:0] in_data, output [7:0] out_data ); // Instantiate submodules here // Your code here endmodule
模塊實(shí)例化(module instance)時(shí),需要指定被實(shí)例化的模塊名稱(例如NAND或INV)、實(shí)例名稱(在當(dāng)前模塊中唯一標(biāo)識(shí)該實(shí)例)和端口連接列表。模塊端口連接可以按照位置順序(位置映射)或者名稱對(duì)應(yīng)(命名映射)給出。一般推薦使用命名映射,因?yàn)榭梢员苊庖恍╁e(cuò)誤。
1.按名稱進(jìn)行端口映射:
INV V2(.in(a), .out(abar));
2.按順序進(jìn)行端口映射,這種情況下,端口列表的順序要和被實(shí)例化的模塊一致:
AND A1(a, b, d);
下面是一個(gè)簡(jiǎn)單的D觸發(fā)器 Verilog示例代碼:
module dff (q, d, clk, rst); output q; input d, clk, rst; reg q; always @(posedge clk or posedge rst) if (rst) q <= 0; else q <= d; endmodule
數(shù)字電路設(shè)計(jì)分為組合邏輯和時(shí)序邏輯兩種。
用Verilog編寫的代碼并不一定都能綜合成電路。我們需要保證我們的代碼能綜合出我們想要的電路。在Verilog中,有些與時(shí)間相關(guān)的語句是不能綜合的。比如,wait, initial, delay等。
在Verilog中,可以用always語句塊來建模電平敏感和邊沿敏感的電路行為。
用always語句塊建模組合電路時(shí),要注意每個(gè)輸出都要依賴于敏感列表。如果沒有完全指定組合電路,可能會(huì)綜合出鎖存器(latch)。
驗(yàn)證
在數(shù)字系統(tǒng)設(shè)計(jì)完成后,要用仿真來驗(yàn)證邏輯功能是否正確。在Verilog中,可以用testbench(測(cè)試平臺(tái))來檢驗(yàn)代碼。編寫testbench的一些基本原則如下:
1、Testbench要實(shí)例化設(shè)計(jì)的頂層模塊,并給它提供輸入激勵(lì)(stimulus)。
2、設(shè)計(jì)(DUT)的輸入激勵(lì)要用'reg'類型聲明。'reg'類型的數(shù)據(jù)可以在always或initial語句塊中改變。
3、設(shè)計(jì)(DUT)的輸出要用'wire'類型聲明。'wire'類型的數(shù)據(jù)不能在always或initial語句塊中賦值。
4、always和initial語句塊是兩種時(shí)序控制塊,它們是并行執(zhí)行的。initial語句塊的一個(gè)例子如下:
module testbench; // 定義clk和reset信號(hào) reg clk, reset; // 定義被測(cè)模塊的實(shí)例 dut dut_inst( .clk(clk), .reset(reset), // 其他端口 ); // 在initial塊中生成clk和reset激勵(lì) initial begin // 初始化clk和reset為0 clk = 0; reset = 0; // 等待一段時(shí)間后釋放reset #10 reset = 1; // 每隔5個(gè)時(shí)間單位切換clk的值 forever #5 clk = ~clk; end endmodule
initial語句塊在仿真開始時(shí)(時(shí)間為0)按照“begin end”之間的語句順序執(zhí)行。遇到延遲時(shí),該語句塊暫停執(zhí)行,等待延遲結(jié)束后繼續(xù)執(zhí)行。上面的代碼是一個(gè)比較典型的復(fù)位和時(shí)鐘激勵(lì)生成的代碼。
5、系統(tǒng)任務(wù)。這些系統(tǒng)任務(wù)不會(huì)被綜合工具識(shí)別,所以可以在設(shè)計(jì)代碼中使用它們。系統(tǒng)任務(wù)以$符號(hào)開頭。一些常用的系統(tǒng)任務(wù)如下:
$display:在仿真過程中,在屏幕上顯示文本信息
$stop:暫停仿真。
$finish:結(jié)束仿真
$dumpvar,$dumpfile:生成波形文件,保存到指定的文件中。
6、tasks用于實(shí)現(xiàn)常用的驗(yàn)證功能。tasks可以有輸入,輸出,并且可以包含時(shí)序控制。下面是一個(gè)task的例子:
// 定義一個(gè)帶有時(shí)序延遲的task task delay_task; input [7:0] data; // 輸入數(shù)據(jù) input [3:0] delay; // 輸入延遲時(shí)間 output [7:0] result; // 輸出結(jié)果 reg [7:0] result; // 定義寄存器存儲(chǔ)結(jié)果 begin #delay result = data; // 延遲賦值 $display("data = %b, delay = %d, result = %b", data, delay, result); // 打印結(jié)果 end endtask // 定義一個(gè)模塊調(diào)用task module test; reg [7:0] data; // 定義數(shù)據(jù)信號(hào) reg [3:0] delay; // 定義延遲信號(hào) wire [7:0] result; // 定義結(jié)果信號(hào) initial begin data = 8'b10101010; // 初始化數(shù)據(jù) delay = 4'd10; // 初始化延遲 delay_task(data, delay, result); // 調(diào)用task #20 $finish; // 結(jié)束仿真 end endmodule
上面的代碼的功能是定義一個(gè)帶有時(shí)序延遲的task,然后在一個(gè)模塊中調(diào)用它。
7、編譯指令`timescale設(shè)置時(shí)間單位和時(shí)間精度
`timescale 10ns/1 ns // 單位 10 ns,精度 1 ns
8、Verilog測(cè)試平臺(tái)可以使用包含C語言描述的編程語言接口(PLI)。
9、在編寫testbench之前,了解設(shè)計(jì)規(guī)范(spec),并且創(chuàng)建所有可能的測(cè)試用例列表非常重要。
10、可以根據(jù)波形檢查信號(hào)值是否正確。
11、在編寫testbench時(shí),可以設(shè)置斷點(diǎn),也可以單步執(zhí)行。
12、進(jìn)行功能仿真時(shí),最好進(jìn)行受約束的隨機(jī)仿真。受約束的隨機(jī)仿真可以提供有效輸入的隨機(jī)組合。當(dāng)隨機(jī)仿真運(yùn)行很長(zhǎng)時(shí)間時(shí),它可以覆蓋大部分的corner cases。在verilog中,可以使用$random在testbench中創(chuàng)建隨機(jī)變量。
13、覆蓋率統(tǒng)計(jì):觀察存在多少種可能性以及有多少種可能性已經(jīng)通過仿真。
13.1、行覆蓋率:代碼中的行仿真覆蓋百分比,由仿真工具統(tǒng)計(jì)。
13.2、條件覆蓋:它檢查代碼中的各種條件語句覆蓋百分比。
13.3、狀態(tài)機(jī)覆蓋率:檢查狀態(tài)轉(zhuǎn)換覆蓋百分比。
14、回歸測(cè)試(Regression):將新的模塊添加到已驗(yàn)證的代碼中?;貧w測(cè)試是一種驗(yàn)證方法,用于確保修改或更新后的代碼不會(huì)影響原有的功能和性能。
仿真目標(biāo)
功能正確:通過驗(yàn)證來驗(yàn)證設(shè)計(jì)的功能,主要的test cases(主要功能)和corner cases(特殊條件下)。功能正確是仿真的基本要求,確保設(shè)計(jì)符合規(guī)范和預(yù)期。例如,可以使用assertions來檢查設(shè)計(jì)的輸出是否與預(yù)期相符。
設(shè)計(jì)的錯(cuò)誤處理:通過驗(yàn)證來檢測(cè)設(shè)計(jì)中可能存在的錯(cuò)誤或異常情況,并測(cè)試設(shè)計(jì)如何應(yīng)對(duì)或恢復(fù)。設(shè)計(jì)的錯(cuò)誤處理是仿真的重要目標(biāo),提高了設(shè)計(jì)的可靠性和安全性。例如,可以使用fault injection來模擬設(shè)計(jì)中可能發(fā)生的故障,并觀察設(shè)計(jì)的反應(yīng)和行為。
性能:通過驗(yàn)證來評(píng)估設(shè)計(jì)的性能指標(biāo),如時(shí)延,吞吐量,功耗等,并與設(shè)計(jì)目標(biāo)進(jìn)行比較。性能是仿真的重要目標(biāo),影響了設(shè)計(jì)的效率和優(yōu)化。例如,可以使用profiling tools來分析設(shè)計(jì)中各個(gè)部分的資源占用和執(zhí)行時(shí)間,并找出性能瓶頸和改進(jìn)點(diǎn)。
真實(shí)世界仿真
在軟件的功能仿真之后,如何在真實(shí)世界中仿真你的設(shè)計(jì)呢?
FPGA原型:加快驗(yàn)證速度。
硬件加速器:將一些可綜合的代碼映射到FPGA上。其他不可綜合的部分,如testbench用仿真工具驅(qū)動(dòng)。當(dāng)設(shè)計(jì)非常大時(shí),這種硬件加速驗(yàn)證方法能大幅度提高驗(yàn)證效率。
后端實(shí)現(xiàn)
在數(shù)字物理設(shè)計(jì)流程中需要對(duì)多個(gè)目標(biāo)進(jìn)行優(yōu)化,包括面積,走線長(zhǎng)度和功耗,以及需要確保物理實(shí)現(xiàn)之后的網(wǎng)表滿足設(shè)計(jì)的時(shí)序要求。以下將概述芯片數(shù)字后端的基本步驟:
物理設(shè)計(jì)的第一步是floor planning,定義芯片(die&core)的寬度和高度,也就是芯片的面積。
“core”是芯片的核心區(qū)域,用于放置(place)設(shè)計(jì)的基本邏輯單元。芯片是從晶圓(wafer)上切割出來的,晶圓是一種圓形的硅片,上面可以制造多個(gè)芯片(die)。
在布局布線(P&R)階段,工具會(huì)根據(jù)約束條件來放置邏輯單元。在正式進(jìn)行P&R之前,需要先確定一些關(guān)鍵模塊的位置,例如RAM,ROM等。這些模塊被稱為“預(yù)放置單元(preplaced cells)”。
將關(guān)鍵模塊擺放之后,圍繞關(guān)鍵模塊擺放Decap(decoupling capacitors),提高了芯片的可靠性和效率。
在電路原理圖中,我們通常只看到一個(gè)“Vdd”和一個(gè)’Vss’,表示電源和地。但是,在芯片上,我們需要構(gòu)建一個(gè)電源網(wǎng)絡(luò),將電源和地分布到各個(gè)模塊。在floorplan階段,我們還需要放置引腳(pin)或焊盤(pad),用于與外部設(shè)備連接。引腳是模塊級(jí)別的接口,焊盤是芯片級(jí)別的接口。
在floorplan確定(freeze)后,就可以開始布局布線(P&R)了。P&R工具的輸入包括綜合后的門級(jí)網(wǎng)表,時(shí)序庫,物理庫和設(shè)計(jì)約束。P&R工具根據(jù)設(shè)計(jì)約束(constraints),例如時(shí)鐘頻率,時(shí)序裕度(margin),最大電容等,用算法來確定標(biāo)準(zhǔn)單元(Flipflops,AND,OR,BUFFER等)的位置,并把它們放在core里。
假設(shè)時(shí)鐘網(wǎng)絡(luò)的最大電容限制是2F。看看上面的圖,時(shí)鐘節(jié)點(diǎn)’B’連著4個(gè)觸發(fā)器的’clk’腳。假設(shè)每個(gè)觸發(fā)器的’clk’腳的電容是1F。那么,PNR工具就會(huì)算出節(jié)點(diǎn)’B’的總電容是4F。然后它會(huì)把這個(gè)電容和約束文件里的最大電容2F比較。
因?yàn)楣?jié)點(diǎn)’B’的電容超過了2F,工具就會(huì)用2個(gè)buffer把節(jié)點(diǎn)’B’的負(fù)載分開,就像圖上那樣。它從庫里選buffer(假設(shè)每個(gè)buffer的輸入電容是1F),并建一個(gè)樹(時(shí)鐘樹),來滿足設(shè)計(jì)的最大電容約束。這個(gè)過程叫做’時(shí)鐘樹綜合(Clock tree synthesis)'。
最后,物理設(shè)計(jì)完成后,PNR工具會(huì)對(duì)原來的網(wǎng)表做一些修改。比如:加buffer,調(diào)整單元大小(size)等。然后,可以提取電阻和電容的值RC(resistances、capacitance),把它們保存在一個(gè)文件里,一般叫做SPEF(Standard Parasitic Extraction Format)文件。
最后,要用靜態(tài)時(shí)序分析(STA)工具做timing sign off。靜態(tài)時(shí)序分析(STA)工具會(huì)檢查設(shè)計(jì)的各條路徑是否符合約束文件里的時(shí)序要求,包括建立時(shí)間檢查,保持時(shí)間檢查,最大電容檢查和過渡時(shí)間檢查等(Setup check,Hold check, Max Capacitance check 和 Transition Check)。
設(shè)計(jì)約束
3、指定設(shè)計(jì)約束
SDC(Synopsys Design Constraints)是一種基于Tcl的格式。SDC文件里的所有命令都遵循Tcl的語法規(guī)則。SDC文件用來告訴EDA工具設(shè)計(jì)的意圖,包括時(shí)序、面積和功耗等。SDC文件包含以下信息:
?版本(可選)
?單位(可選)
?約束值
?約束對(duì)象
?注釋(可選)
SDC文件里不包含加載或鏈接設(shè)計(jì)的命令。所以,在讀取SDC文件之前必須先讀取你的設(shè)計(jì)。
1、指定SDC版本
如果沒有指定SDC版本,那么版本就取決于讀取SDC文件的EDA工具。為了保證SDC文件在不同工具之間的兼容性,可以在文件開頭用以下命令指定SDC版本:
set sdc_version value
2、指定SDC單位
set_units命令指定SDC文件里的電容,電阻,時(shí)間,電壓,電流和功耗等單位。
3、指定設(shè)計(jì)約束
用約束命令來指定設(shè)計(jì)約束。如果命令太長(zhǎng),可以用反斜杠字符()把命令分成多行。SDC約束命令有下表這些。
4、指定約束對(duì)象
大多數(shù)約束命令都需要設(shè)計(jì)對(duì)象作為命令參數(shù)。
如果當(dāng)前設(shè)計(jì)中有一個(gè)名為U1的單元,可以通過命令
[get_cells U1]
找到。下表SDC格式中尋找設(shè)計(jì)對(duì)象的命令。
同時(shí),可以使用Tcl列表或通配符(?、*)指定多個(gè)對(duì)象。默認(rèn)情況下,當(dāng)前設(shè)計(jì)約束的參考點(diǎn)是頂級(jí)設(shè)計(jì)。我們可以使用分隔符(/)來約束層次結(jié)構(gòu)化設(shè)計(jì)。
5、添加注釋
可以使用#將注釋添加到SDC文件中。
例如,
# This is an SDC comment line.
create_clock -period 10 [get_ports CLK] ; #comment fragment
6、管理大型項(xiàng)目SDC文件
當(dāng)設(shè)計(jì)非常大時(shí),SDC文件可能會(huì)得很大。減少SDC文件大小的一種方法是壓縮文件
read_sdc命令自動(dòng)檢測(cè)gzip壓縮文件并解壓縮,然后讀取它們的文件。例如,
read_sdc design.sdc.gz
審核編輯:湯梓紅
-
asic
+關(guān)注
關(guān)注
34文章
1263瀏覽量
123500 -
Verilog
+關(guān)注
關(guān)注
30文章
1368瀏覽量
113495 -
HDL
+關(guān)注
關(guān)注
8文章
330瀏覽量
48605 -
數(shù)字設(shè)計(jì)
+關(guān)注
關(guān)注
0文章
49瀏覽量
22681 -
前端設(shè)計(jì)
+關(guān)注
關(guān)注
0文章
22瀏覽量
10261
原文標(biāo)題:ASIC數(shù)字設(shè)計(jì):前端設(shè)計(jì)、驗(yàn)證、后端實(shí)現(xiàn)
文章出處:【微信號(hào):數(shù)字芯片實(shí)驗(yàn)室,微信公眾號(hào):數(shù)字芯片實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
典型的基于RTL的ASIC設(shè)計(jì)流程分析

IC前端和后端設(shè)計(jì)的區(qū)別
集成電路前端及后端設(shè)計(jì)培訓(xùn)
數(shù)字ASIC/SOC芯片后端設(shè)計(jì)工程師
[招聘] 新思科技(Synopsys)上海/西安招聘數(shù)字前端AC
【招聘】職位包括數(shù)字IC設(shè)計(jì)/驗(yàn)證/后端物理設(shè)計(jì)、模擬IC設(shè)計(jì)/版圖工程師
【招聘】職位包括數(shù)字IC設(shè)計(jì)/驗(yàn)證/后端物理設(shè)計(jì)、模擬IC設(shè)計(jì)/版圖工程師
ASIC原型驗(yàn)證的實(shí)現(xiàn)
數(shù)字IC后端設(shè)計(jì)介紹,寫給哪些想轉(zhuǎn)IC后端的人!
如何去實(shí)現(xiàn)一種數(shù)字前端的設(shè)計(jì)?包括哪些步驟?
數(shù)字IC前端和后端有何區(qū)別
數(shù)字IC前端后端的區(qū)別,數(shù)字IC設(shè)計(jì)流程與設(shè)計(jì)工具

評(píng)論