日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

专用集成电路设计实用教程(学习笔记一)

發布時間:2023/12/9 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 专用集成电路设计实用教程(学习笔记一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一章 集成電路設計概論

IP模塊包括軟IP,固化IP和硬IP三種類型。其中軟IP用HDL描述;固化IP用門級網表描述;硬IP是指實現到物理版圖的硅塊(Silicon Block)。

1.2 集成電路系統的組成
一個常見的集成電路系統,有如下模塊:
(1)數字電路模塊
(2)模擬電路模塊
(3)知識產權IP核
(4)邊界掃描模塊
(5)輸入/輸出PAD
(6)內存

數字電路大致可以分為數據通路(Data Path)和控制通路(Control Path)。數據通路主要指加減乘除的運算器。控制通路是控制管理數據流通和信號開關等的邏輯。

模擬電路一般有:數模轉換器,將數字信號轉換為模擬信號。模數轉換器,將模擬信號轉換為數字信號。可編程增益放大器(PGA),通過數字電路來控制模擬增益。鎖相環(PLL),用于產生高頻的時鐘和進行時鐘信號的相位校正。

知識產權IP核:推動寄存器傳輸級的設計自動化進程。知識產權核的設計再利用是保證系統級芯片開發效率和質量的重要手段。USB既是IP核,也是一種輸入輸出設備。

邊界掃描電路(如JTAG):邊界掃描技術的基本思想是在芯片端口和芯片內部邏輯電路之間,即芯片的邊界上加上邊界掃描單元(移位寄存器單元)。因為這些移位寄存器單元都分布在芯片的邊界上,所以被稱為邊界掃描寄存器(Boundary-Scan Register Cell)。當芯片處于調試狀態的時候,這些邊界掃描寄存器可以將芯片核心和外圍的輸入輸出隔離開來。通過這些邊界掃描寄存器單元,可以實現對芯片輸入輸出信號的觀察和控制。

對于芯片的輸入端口管腳,可以通過與之相連的邊界掃描寄存器單元把信號加載到該管腳中去;對于芯片的輸出端口管腳,也可以通過與之相連的邊界掃描寄存器捕獲該管腳上的輸出信號。芯片輸入輸出管腳上的邊界掃描(移位)寄存器單元可以相互連接起來,在芯片的周圍形成一個邊界掃描鏈(Boundary-Scan Chain)。邊界掃描鏈可以串行地輸入和輸出,通過相對應的時鐘信號和控制信號,可以方便的觀察和控制處在調試狀態下的芯片。

輸入/輸出PAD
PAD是直接與外部世界相連接的特殊單元,因此必須考慮外部電路的寄生參數影響、靜電保護、封裝要求、電壓轉換、過壓保護和信號完整等。I/OPAD通常分為三類:輸入PAD、輸出PAD和雙向PAD。一般來說,I/O PAD比集成電路核心的單元有更長的延遲和更高的驅動能力。

由于連線之間的距離很近,連線之間的耦合電容會引起信號的串擾(cross talk)。串擾會影響時序,使原本收斂的設計,又產生時序違反(Timing Violation),使芯片不能正常工作。
連線的電阻寄生效應會導致顯著的電壓下降,從而影響芯片的供電電壓和信號電平。在IC系統中,通過電源網絡來供電。一個數字電路系統要能正常工作,必須為它的邏輯單元提供穩定的直流電壓,并且這個電壓的起伏要盡可能的小。加寬電源線可以降低電阻,從而減少壓降,并且會增加允許通過的峰值電流,但是會占用過多的面積。

第二章 數字電路的高級設計和邏輯綜合

2.1 RTL硬件描述語言設計
硬件描述語言支持行為級、寄存器傳輸級和門級三個不同級別的設計,目前人們普遍使用寄存器傳輸級源代碼進行設計。

2.1.1行為級硬件描述語言
Behavioral Level HDL使用行為來描述設計的功能。這種行為的描述需要詳細制定何時讀進輸入,何時對輸入進行操作,何時把操作結果寫到輸出端口。在行為級語言時,并不需要指出由有限狀態機控制設計或何時執行每個操作時鐘周期。需要工具在綜合時決定這些操作。

2.1.2 寄存器傳輸級硬件描述語言
RTL代碼中通常既不包含電路的時間(路徑延遲),也不包含電路的面積。
RTL代碼定義了:(1)電路的寄存器結構和寄存器的數目
(2)定義了電路的拓撲結構
(3)輸入/輸出接口與寄存器之間組合電路的邏輯功能,寄存器與寄存器之間組合電路的邏輯功能。


這些組合電路的邏輯功能是如何由具體的電路實現,需要對電路施加約束,由工具產生。

RTL源代碼的功能驗證完成后,用DC綜合處門級電路。

2.1.3 結構化硬件描述語言
結構化描述語言定義了形成物理電路之間的連接關系。門級硬件描述語言(Gate Level HDL)或門級網表(Gate Level Netlist)是結構級硬件描述語言。用Verilog或VHDL語言描述各個邏輯單元之間的連接關系,以及輸入輸出端口和邏輯單元之間的連接關系。門級電路的生成一般可以由邏輯綜合來實現。

2.2 邏輯綜合(logic synthesis)
綜合是把概念轉換為可以制造器件的轉移過程,而該器件能執行預期的功能。
2.1.1 邏輯綜合的基本步驟
電路的邏輯綜合一般由三步組成,即
綜合(Synthesis) = 轉化(Translation) + 邏輯優化(Logic Optimization) + 映射(Mapping)。

先通過read命令將RTL代碼轉換成通用的布爾等式,即GTECH(Generic Technology)格式;然后執行complile命令,該命令按照設計的約束對電路進行綜合和優化,使電路能滿足設計的目標或約束,并且使用目標工藝庫中的邏輯單元映射成門級網表。

使用HDL語言和邏輯綜合進行設計,有如下優點:
(1)提高設計效率
(2)抽象設計
(3)設計訣竅
(4)重復復用
(5)驗證方便
(6)便攜性強
綜合的結果和設計的約束有很大的關系,通過設計的約束(design constraint)設置目標,綜合工具對設計進行優化來滿足我們的目標。

綜合以時序路徑為基礎進行優化。DC在對設計做綜合時,其過程包括了進行靜態時序分析(Static Timing Analysis ,STA)。DC使用其內建的靜態時序分析器把設計分解成多條時間路徑,然后根據設計的約束對這些路徑進行優化。STA計算每一條路徑的延遲(Delay),然后把延遲的結果和約束進行比較,如某條路徑的時間延遲大于約束的值,則該路徑時序違規(Timing Violation)。這時電路不能正常工作,無法到達原來的設計目標。

2.2.2 綜合工具 Design Compiler
邏輯綜合包括讀入HDL源代碼和對設計進行優化。
在綜合過程中,優化進程嘗試完成庫單元的組合,使組合電路能最好地滿足設計的功能、時序和面積的要求。

編譯(compile)是DC的一個命令,設計者使用該命令對設計進行優化。在讀入設計和做完其他必要的任務后(如加上設計約束),設計者執行compile命令為設計產生優化的門級網表。

2.2.3 目標庫和初始環境設置
綜合 = 轉化 + 邏輯優化 + 映射

技術綜合庫包括單元的延遲。單元的延遲與輸入的邏輯轉換時間(Input Translation Time)和輸出的負載(Output load)有關。根據每個單元的輸入邏輯轉換時間和輸出負載,可以在技術綜合庫提供的查找表中查出單元的延遲。

DC在做編譯時,使用目標庫(Target Library)來構成電路圖。映射電路圖時,DC在用目標庫指定的綜合庫中選用功能正確的邏輯門單元,使用廠商所提供的這些門單元的時間數據計算電路的路徑延遲。

DC中,target_library是保留變量,設置這個變量以指向廠商提供的綜合庫文件。例如
set target_library my_tech.db

連接庫(link_library)是保留變量,用于分辨電路中邏輯門單元和子模塊的功能。
set link_library “* my_tech.db”

DC讀入設計時,它自動讀入由link_library變量指定的庫。

分辨門單元和模塊(也叫做連接)意味著要找出網表中門單元和模塊邏輯和功能,并且用實際的庫單元或子模塊替代他們。

第三章 系統的層次劃設計和模塊劃分

3.1 設計組成及DC-Tcl
端口(ports)可以有方向、驅動單元、最大電容等屬性和約束
單元(cells)可以有功能、連線、面積的大小和時間信息的屬性
設計(designs)可以有面積、最大工作條件、功耗等的屬性和約束

3.1.1 設計物體(Design Object)
DC中,每個設計由6個設計物體(Design Object)組成,分別是設計(design)、端口(ports)、單元(cell)、引腳(pin)、連線(net)和時鐘(clock)。其中時鐘是特別的端口,它存放在DC內存中,使用戶自己定義的物體。

creat_clock -period 4 [get_ports CLK]

如果執行命令“set-load 5 A”,此命令并沒有給DC足夠的信息把負載加到哪個物體上,因為命令并沒有指出物體A是端口,是連線或是引腳。這種情況下,DC把5個電容單位的負載加到自己選擇的物體A上,這時物體A可能是端口,也可能是連線或是引腳。

我們可以用“get_*”命令來選擇特定的物體。如果要在連線A上加上5個電容單位的負載,應用下面的命令:

set_load 5 [get_nets A]

物體可以與通用字符“*” 或 “?”一起使用。

set_load 5 [get_ports addr_bus*] set_load 6 [get_ports "A* B*"]

3.2 層次(Hierarchy)結構和模塊劃分(Partition)及修改
SOC設計由一些模塊組成。對于設計復雜規模又大的電路,需要對它進行劃分(Partitioning),然后對劃分后比較簡單規模又小的電路做處理。這時,由于電路小,處理和分析比較方便簡單,容易較快的達到要求。再把已經處理好的小電路集成為原來的大電路。

設計時,為了得到最優的電路,需要對整個電路作層次結構的設計,對整個設計進行劃分,使每個模塊以及整個電路的綜合結果能滿足我們的目標。


由于DC在對整個電路做綜合時,必須保留每個模塊端口。因此,邏輯綜合不能穿越模塊邊界,相鄰模塊的組合邏輯也不能合并。從寄存器A到寄存器C的路徑延時較長,這部分的電路面積較大。

將相關的組合電路合到一個模塊,原來模塊A、B和C中的組合電路沒有了層次的分隔,綜合工具中對組合電路優化的技術也能得到充分利用。這時電路的面積比原來要小,從寄存器A到寄存器C的路徑的延時也短了。


圖中,模塊的輸出邊界是寄存器的輸出端。由于組合電路之間沒有邊界,其輸出連接到寄存的數據輸入端,可以充分利用綜合工具對組合電路和時序電路的優化技術,得到最優的結果,同時也簡化了設計的約束。圖中每個模塊除時鐘端口外所有的輸入端口延時是相同的,等于寄存器的時鐘引腳CLK到輸出引腳Q的延時。


膠合邏輯是連接到模塊的組合邏輯,頂層的與非門僅僅是個例化的單元,由于膠合邏輯不能被其他模塊吸收,優化收到了限制。如果采用由低向上的策略,需要在頂層做額外的編譯(compile)。


膠合邏輯可以和其他邏輯一起優化,頂層設計也只是結構化的網表。不需要再做額外的編譯。

3.2.3 模塊劃分的修改
對設計做編輯時,需要考慮劃分模塊規模的大小應與現有的計算機中央處理器(CPU)和內存資源相匹配。盡量避免下面劃分不當情況:
(1)模塊太小 由于人工劃分的模塊邊界,使得優化收到限制,綜合的結果可能不能是最優的
(2)模塊太大 做編輯所需的運行時間可能會太長,由于要求設計的周期短,不能等太久。

按照期望的周轉時間,一般模塊的劃分規模大約為400~800K門。對設計作綜合時,比較合理的運行時間是一晚上。

作劃分時,要把核心邏輯(core logic),IO,Pads,時鐘產生電路,異步電路和JTAG電路分開,放到不同的模塊中。

頂層設計至少劃分為3層的層次結構,
(1)頂層(Top-level)
(2)中間層(Mid-level)
(3)核心功能(Functional core)


異步電路的設計,其約束和綜合與同步電路不同,所以也放在與核心功能不同的模塊里。
為了使電路的綜合結果最優化,綜合的運行時間適中,需要對設計做出合適的劃分。

DC兩種方法修改劃分:
(1)自動修改劃分
綜合過程中DC需透明地修改劃分。在DC中使用命令:

compile -auto_ungroup area|delay

DC在綜合時將自動取消小的模塊劃分。取消模塊分區由變量

compile_auto_ungroup_delay_num_cells compile_auto_ungroup_area_mum_cells

控制。

compile -ungroup_all

DC在綜合時將自動取消所有的模塊分區或層次結構。此時,設計將只有頂層一層的電路。

(2)手工修改劃分
用戶用命令指示所有的修改。

group命令產生新的層次模塊。

ungroup命令取消一個或者所有的模塊分區。

如果要在當前設計中取消所有的層次機構,用命令:
ungroup -all -flatten

模塊劃分策略總結:
(1)不要通過層次邊界分離組合電路
(2)把寄存器的輸出作為劃分邊界
(3)模塊的規模大小適中,運行時間合理
(4)把核心邏輯,Pads,時鐘產生電路,異步電路和JTAG電路分開到不同的模塊。

第四章 電路的設計目標和約束

設計規格中,一般包括電路的功能、設計的層次結構和模塊劃分、輸入/輸出端口及其驅動屬性、電路的工作頻率、電路的最大功耗、電路的最大面積、最小的測試覆蓋率等等。


4.1 設計的時序約束
RTL代碼中并不包括電路的時序(路徑的延時)和電路面積(門數)。
電路的邏輯綜合由三步組成:
綜合 = 轉化 + 邏輯優化 + 映射

先將RTL源代碼轉化為通用的的布爾等式------GTECH格式;然后按照設計的約束對電路進行邏輯綜合和優化,使電路能滿足設計的目標或約束;最后使用目標工藝庫的邏輯單元映射成門級網表。綜合的結果包括了電路的時序和面積。

4.1.1 同步(Synchronous)電路和異步(Asynchronous)電路
同步電路是指電路的所有時鐘來自同一個時鐘源。
圖(a)和圖(c)都是同步電路。

異步電路是指電路的時鐘來自不同的時鐘域。
時鐘CLKA和CLKB來自不同的振蕩器OSC1和OSC2,它們之間沒有固定的相位關系。

4.1.2 亞穩態(Metastability)
每個觸發器都有其規定的setup(建立)和hold(保持)時間參數,該參數存放在由半導體廠商所提供的工藝庫中。假設觸發器由時鐘的上升沿觸發,在這個時間參數內,輸入信號是不允許發生變化的。否則在信號的建立或保持時間中對其采樣,獲得的結果是不可預知的,有可能是“1”,“0”,“x”,“z”,即亞穩態。


4.1.3 單時鐘同步設計的時序約束
對于同步電路,為了使電路能正常工作,即電路在我們規定的工作頻率和工作環境中能功能正確的工作,需要對設計中的所有路徑進行約束。

由于邏輯單元和連線是有延遲的,如果從寄存器FF1的clk引腳到寄存器FF2的D引腳的最大延遲小于時鐘周期減去寄存器FF2的建立時間,即
Tco + Tlogic <= Tcycle - Tsetup

如果從寄存器FF1的clk引腳到寄存器FF2的D引腳的延遲大于時鐘周期減去寄存器FF2的建立時間,而且其值小于時鐘周期加上寄存器FF2的保持時間,這時,電路Q2的輸出為不定值,電路不能正常工作。

一般情況下,如果寄存器和寄存器之間的組合邏輯延遲大于1clock cycle - Tsetup,電路的功能就會不正確。
Tclk-Q是FF2的從引腳clk到引腳Q的延時,Tsetup是FF3的建立時間,這兩個參數都由工藝庫提供。
DC中用creat_clock命令來定義時鐘

creat_clock -period 10 [get_port CLk]

定義時鐘時(除虛擬時鐘外),必須定義時鐘周期和時鐘源(端口或引腳),也可以加上一些可選項來定義時鐘的占空因數,偏移和時鐘名。

可以用report_clock命令來查看所定義的時鐘及屬性。

在默認情況下,邏輯綜合時,即使一個時鐘要驅動很多寄存器,DC也不會在時鐘的連線上加時鐘緩沖器(clock buffer),時鐘輸入端直接連接到所有寄存器的時鐘引腳。在時鐘連線上加上時鐘緩沖器或作時鐘樹的綜合一般由后端工具完成,后端工具根據整個設計的物理布局(placement)數據,進行時鐘樹的綜合。加上時鐘緩沖器后,使整個時鐘樹滿足skew、latency和transition的目標。用下面的命令建立時鐘模型

set_clock_uncertainty set_clock_latency set_clock_transition

偏差(uncertainty)表示時鐘網絡分支的延遲差異(相位差異)。這種延遲差異稱為clock skew。
用set_clock_uncertainty命令來模擬時鐘樹

set_clock_uncertainty -setup TU [get_clocks CLK]

TU = clock skew + jitter。

假設時鐘周期為10ns,時鐘的偏差為0.5ns,用下面命令來定義時鐘:

creat_clock -period 10 [get_ports CLK] set_clock_uncertainty -setup 0.5 [get_clocks CLK]

在默認情況下,“set_clock_uncertainty”命令如果不加開關選項“-setup”或“-hold”,那么該命令給時鐘賦予相同的建立時間和保持時間偏差值。

時鐘網絡的延遲(clock network latency)是時鐘信號是從其定義的點(端口或引腳)到寄存器時鐘引腳的傳輸時間。時鐘源延遲(clock source latency),也稱插入延遲(insertion delay),是時鐘信號從其實際時鐘原點到設計中時鐘定義點的傳輸時間。
時鐘網絡延遲用下面的命令定義:

creat_clock -period 10 [get_ports CLK] set_clock_latency -source 3 [get_clocks CLK] set_clock_latency 1 [get_ports CLK]

在做布局布線之前,用set_clock_latency命令來模擬時鐘網絡的延遲。做完布局布線后,用set_propagated_clock來計算時鐘網絡的真實延遲。


版圖前的時鐘模型:

creat_clock -p 20 -n MCLK [get_ports CLK] set_clock_uncertainty 0.5 MCLK set_clock_transition 0.25 MCLK set_clock_latency -source 4 MCLK set_clcok_latency 2 MCLK

版圖后的時鐘模型

creat_clock -p 20 -n MCLK [get_ports CLK] set_clock_uncertainty 0.1 MCLK set_clock_latency -source 4 MCLK set_propagated_clock MCLK

用set_clock_transition模擬時鐘的轉換(transition)時間。默認的上升轉換時間為從電壓的20%上升到80%的時間,下降的轉換時間為從電壓的80%下降至20%的時間。如果不加開關選項,那么該命令給時鐘賦予相同的上升和下降轉換時間。

輸入端口的時序約束:

在Clk的時鐘上升沿,通過外部電路的寄存器FF1發送數據經過輸入端口A傳輸到要綜合的電路,在下一個時鐘上升沿被內部寄存器FF2接收。

如果已知輸入端口的外部電路的延遲(假設4ns),就可以很容易計算出留給綜合電路輸入端到寄存器N的最大延遲允許。

set_input_delay -max 4 -clock Clk [get_ports A]

對于時鐘周期為10ns的電路,內部邏輯的最大延遲為10-4-Tsetup=6-Tsetup

舉例說明設置輸入端口的約束。

輸入端口的約束為:

creat_clock -period 20 [get_ports Clk] set_input_delay -max 7.4 -clock Clk [get_ports A]

如果U1的建立時間為1ns,則N邏輯允許的最大延遲為:20-7.4-1=11.6ns

用下面命令對除時鐘以外的所有輸入端口設置約束 set_input_delay 3.5 -clock Clk -max \ [remoce_from_collection[all_inputs][get_ports Clk]]

remoce_from_collection[all_inputs][get_ports Clk]表示從所有的輸入端口中除掉時鐘Clk。如果要移掉多個時鐘用

remoce_from_collection[all_inputs][get_ports "Clk1 Clk2"]

輸出端口的時序約束

Clk時鐘上升沿通過內部電路的寄存器FF2發送數據經要綜合的電路電路S,到達輸出端口B,在下一個時鐘的上升沿被外部寄存器FF2接收。
已知外部電路的延遲為5.4ns,DC中用set_output_delay命令約束輸出路徑的延遲。

set_output_delay -max 5.4 -clock Clk [get_ports B]

指定了外部邏輯用了多少時間,DC將會計算還有多少時間留給內部邏輯。

輸出端約束為:

creat_clock -period 20 [get_ports Clk] set_output_delay -max 7.0 -clock Clk [get_ports B]

如果U3的Tclk-Q=1.0ns,則s邏輯允許的最大延遲為20-7.0-1.0=12ns

進行SOC設計時,由于電路比較大,需要對設計進行劃分,在一個設計團隊中,每個設計者負責一個或幾個模塊,但是并不知道每個模塊的外部輸入延遲和外部輸出的建立要求,可以通過建立時間預算,為輸入/輸出端口設置時序約束。

DC要求不應在綜合時還未加約束的路徑,假設輸入和輸出的內部電路僅用了時鐘周期的40%。所有模塊都按照這種假定設置對輸入/輸出進行約束,將還有20%時鐘周期的時間作為富余量(Margin),富余量包括寄存器FF1的延遲和FF2的建立時間。
富余量 = 20%T - Tclk-q - Tset-up

#Timing_budget.tcl #A generic Time Budgeting script file #for MY_BLOCK,X_BLOCK and Y_BLOCK creat_clock -period 10 [get_ports CLK] set_input_delay -max 6 -clock CLK [all_inputs] remove_input_delay[get_ports CLK] set_output_delay -max 6 -clock CLK[all_outputsx]

用check_timing命令在電路中尋找未加約束的路徑。如設計中有未加約束的路徑,該命令會報告警告信息,并把這些路徑列出來。
在給設計添加約束的過程中,如果要刪除已經加上的約束,可以用reset-design命令把它們刪除。

4.1.4設計環境的約束
為了保證電路的每一條時序路徑,特別是輸入/輸出路徑延遲約束的精確性,還應該提供設計的環境屬性。

對于輸出端,為了精確計算輸出電路的時間,DC需要知道輸出單元所驅動的總負載電容,用set_load命令說明端口(輸入或輸出)上的外部電容負載。

對于輸入端為了精確計算輸入電路的時間,需要知道到達輸入端口的轉換時間。在默認情況下,DC假設輸入端口上的外部信號轉換時間為0.用set_driving_cell命令在輸入端加上一個驅動單元,DC將計算輸入信號的實際轉換時間,仿佛指定某一個庫單元正在驅動它的(輸入端)。

set_driving_cell -lib_cell FD1 -pin Q [get_ports IN1]

如果不加開關選項“-pin”,DC將使用所找到的第一只引腳。

設計者可以通過負載預算(load budget)為輸入/輸出端口設置環境的約束。
產生負載預算可用下面的規則:
(1)為保守起見,假設輸入端口由驅動能力弱的單元驅動
(2)限制每一個輸入端口的輸入電容(負載)
(3)估算輸出端口的驅動模塊數目

下面的腳本是下圖負載預算的一個例子,原圖的規格如下:
(1)模塊輸入端口驅動的負載不大于10個“AND2”門的輸入引腳的負載
(2)模塊輸出端口最多允許連接3模塊,如果某個輸出端需要連接多余3個模塊,需要在代碼中復制該輸出端口。

腳本load_budget.tcl如下:

current_design myblock link reset_design source timing_dudget.tcl; #上節的腳本 set all_in_ex_clk[remove_from_collection\ [all_inputs][get_ports Clk]]#Assum a weak driving buffer on the inputs set_driving_cell -lib_cell invlal $all_in_ex_clk#Limit the input load set MAX_INPUT_LOAD[expr\ [load_of ssc_core_slow/and2a1/A] * 10] set_max_capacitance $MAX_INPUT_LOAD $all_in_ex_clk#MOdel the max possible load on the outputs,assuming #outputs will only the tied to 3 subsequent blocks set_load [expr $ MAX_INPUT_LOAD * 3][all_outputs]

周圍環境對電路的延遲有很大的影響。工藝庫單元通常用“nominal”電壓和溫度來描述其特性。例如:
nom_process :1.0;
nom_temperature : 25.0;
nom_voltage : 1.8;

半導體廠商在其提供的工藝庫中,一般會放入不同的工作條件,可以用set_operating_conditions命令把工作條件加入到設計上。綜合時,將按工作條件作適當的比例調整。

report_lib libname

該命令把廠商提供的所有工作條件列出來,

設置工作條件可以用下面命令:

set_operating_condition -max "slow_125_1.62"

門單元的延遲一般用非線性延遲模型(non-linear delay model)算出。
DC遇到連線的扇出大于模型中列出的最大扇出值,它將使用外推斜率來計算連線的長度。
如果連線的扇出為7,而連線負載模型中最大扇出是5,連線的長度計算如下:
232.68 + 50.3104 * (7-5) = 333.3008
這條線的電容和電阻分別是:
333.308 * 0.00017 = 0.566pF

333.308 * 0.000271 = 0.0903kΩ

根據約束,寫出設計的約束腳本,該腳本要適用于一個較大規模ASIC的每個子模塊。

reset_design set all_in_ex_clk [remove_from_collection \ [all_inputs][get_ports Clk]]creat_clock -period 8 [get_ports Clk]set_input_delay -max 4.8 -clock Clk $all_in_ex_clkset_output_delay -max 4.8 -clock Clk [all_outputs]set_operation_condition -max slow_125_1.62 set_wire_load_model -name 40KGATES set_driving_cell -lib_cell invlal $all_in_ex_clkset MAX_LOAD [expr[load_of ssc_core_slow/buflal/A]*10] set_max_capacitance $AMX_LOAD $all_in_ex_clk set_load [expr $ MAX_LOAD * 4][all_outputs]

4.1.5 多時鐘同步設計的時序約束

設計中所有的時鐘由300Mhz的時鐘源分頻得到,因此是同步電路。CLKC在要綜合的設計中有對應的輸入端口,其定義與單時鐘一樣,即:

creat_clock -p 20 [get_ports CLKC]

由于CLKA、CLKD和CLKE在要綜合的設計中沒有對應的輸入端口,因此需要使用虛擬(virtual)時鐘。虛擬時鐘在設計里并不驅動觸發任何的寄存器,主要用于說明相對于時鐘的IO端口延遲。DC根據這些約束,決定設計中最嚴格的約束。

creat_clock -name VCLK -period

虛擬時鐘不驅動設計中的任何寄存器,設計中沒有其對應的輸入端口,所以定義中沒有源端口或引腳。由于虛擬時鐘沒有對應的時鐘端口,必須給它一個名字。虛擬時鐘是DC的內存里已定義的時鐘物體,不驅動設計中的任何寄存器,用作為輸入/輸出端口的設置延遲。

creat_clock -period 30 -name CLKA creat_clock -period 20 [get_ports CLKC]set_input_delay 5.5 -clock CLKA -max [get_ports IN1]



要綜合電路的輸入部分N必須滿足
20-5.5-tsetup和10-5.5-tsetup這兩個等式中最嚴格的情況,即
tN < 10-5.5-tsetup

輸出電路,用同樣的方法定義虛擬時鐘和施加約束。

creat_clcok -period [expr 1.0/75*1000] -name CLKD creat_clock -period 10 -name CLKE creat_clock -period 20 [get_ports CLKC]set_output_delay -max 2.5 -clock CLKD [get_ports OUT1] set_output_delay -max 4.5 -clock CLKE -add_delay [get_ports OUT1]

第二個輸出延遲約束命令里面加了-add_delay意思是輸出端口OUT1有兩個約束。如果不加選項-add_delay,第二個輸出延遲約束命令將會把第一個命令覆蓋掉,這是輸出端口OUT1只有一個約束。

4.1.6 異步設計的時序約束

電路中,所有的時鐘來自不同的時鐘源。時鐘之間是不同頻率或者同頻不同相的關系。進行異步設計時,設計者要注意會產生亞穩態導致某些寄存器的輸出為不定態。


為了避免產生亞穩態問題,可以考慮在設計中使用雙時鐘、不易到亞穩態的觸發器或使用異步FIFO等。對于穿越異步邊界的任何路徑,必須禁止對這些路徑做時序綜合。由于不同時鐘源的時鐘之間的相位關系是不確定的,一直在變。用set_false_path命令為跨時鐘域的路徑作約束。

current_design TOP #Make sure register-register paths meet timing creat_clock -period 10 [get_ports CLKA] creat_clock -period 10 [get_ports CLKB]#Dont optimize logic crossing clcok domains set_false_paths -from [get_ports CLKA] -to [get_ports CLKB] set_false_paths -from [get_ports CLKB] -to [get_ports CLKA]compile -scan

如果設計中的所有時鐘都是異步的,可以用下面命令為跨時鐘域路徑做約束。

set DESIGN_CLOCKS [all_clocks] foreach_in_collection T_CLK $DESIGN_CLOCKS{ set_false_path -from $T_CLK -to \ [remove_from_collection[all_clocks] $ T_CLK] }

用set_false_path命令對路徑做時序約束之后,DC做綜合時,將終止對這些路徑做時間的優化。該命令除了可以用于約束異步電路外,還可以用于約束邏輯上不存在的路徑(logically false path),

圖中前面的MUX的A1引腳和后面的MUX的A2引腳之間的邏輯通路并不存在。前面的MUX的B1引腳和后面的MUX的B2引腳之間的邏輯通路也不存在。

在DC中,偽路徑“false path”稱為時序例外(timing exception)。邏輯偽路徑是一條物理上存在的路徑。從點A1到點A2之間有一條物理上的連接路徑,但是點A1輸入信號并不通過這條路徑傳輸到A2。

4.1.7 保持時間(Hold timing)
保持時間受下面因素影響:
(1)時鐘樹網絡的時間偏差
(2)工作條件
(3)寄存器的保持參數

4.2 復雜時序約束

使用時鐘的默認行為作為電路約束,即信號的變化要在一個時鐘周期內完成,并達到穩定值,以滿足寄存器的建立時間和保持時間的要求。有些設計的路徑并不能或不需要在一個時鐘周期內完成,只需要在規定的的數個時鐘周期內完成信號的變化就可以了。作可測性設計時,為了提高測試的覆蓋率,經常使用多路(multiplex,簡稱mux)傳輸電路控制時鐘,使電路的時鐘信號可以由輸入端直接控制。

4.2.1 多時鐘周期(Mult-Cycle)的時序約束
假設時鐘clk的周期定義為10ns,加法器的延遲約為6個時鐘周期。

creat_clock -period 10 [get_ports CLK] set_multicycle_path 6 -setup -to [get_pins C_reg[*]/D]


默認的時序約是,在時鐘觸發沿,如果寄存器的數據輸入引腳D信號變化,不滿足建立時間和保持時間的要求,將產生亞穩態,寄存器的輸出為不定態。

如上,加法器的最大延遲允許是60-Tsetup - Tuncertainty - Tclk-Q
默認的保持分析時間在建立分析時間的前一個時鐘周期,在多時鐘周期的設計里,DC將在50ns分析電路有無違反保持要求,即要求加法器的最小允許延遲是:
50 + Tholdtime + Tuncertainty。

要用DC綜合出一條路徑使其建立時間滿足60ns的要求,并且同時滿足保持時間50ns的要求實際上是沒有必要的,這樣會增加電路的復雜度。

在時間60ns的時刻,引起寄存器C-reg的D引腳信號變化的是時鐘CLK在0ns時刻的觸發沿。此刻(在0ns時),時鐘CLK把寄存器A_reg和B_reg的D引腳信號采樣到他們的輸出端,再通過加法器把信號傳輸到寄存器C_reg的D引腳。由此可見,需要對保持時間作調整,應該在0ns時做保持時間的檢查。

creat_clock -period 10 [get_ports CLK] set_multicycle_path -setup 6 -to [get_pins C_reg[*]/D] set_multicycle_path -hold 5 -to [get_pins C_reg[*]/D]



要求寄存器間的乘法運算單元為兩個時鐘周期,加法運算為默認的一個時鐘周期。其約束為:

creat_clock -period 10 [get_ports clk] set_multicycle_path -setup 2 -from FFA/CP \ -through Multiply/Out -to FFB/Dset_multicycle_path -hold 1 -from FFA/CP \ -through Multiply/Out -to FFB/D

4.2.2 門控時鐘的約束

門控時鐘的使能信號約束為:

creat_clock -period 10 [get_ports CLK] set_dont_touch_network [get_clocks CLK] set_clock_gating_check -setup 0.5 -hold 0.5 [current_design]

DC能自動辨認門控時鐘電路,綜合時,DC將根據上述的約束在門控時鐘電路中增加或刪除邏輯以滿足門控使能信號的建立和保持時間要求。

有兩種門控時鐘單元,一種是無鎖存器門控時鐘單元,一種是基于鎖存器門控時鐘單元。

基于鎖存器的門控電路的輸出沒有毛刺,這種電路的結構行為表現的好像一個主從(master-slave)寄存器,它在時鐘的上升沿捕獲門控使能信號。

4.2.3 分頻電路和多路傳輸多路傳輸電路的時鐘約束

(1)頂層
(2)中間層
(3)核心功能
在中間層,把時鐘電路和核心功能分開到不同的模塊。
這樣的好處是:
(1)所有的時鐘產生電路在同一個模塊中,對時鐘邏輯可以有更好的控制并且易于分析結果
(2)簡化了對其他模塊的約束,它們的時鐘約束只需要附加在輸入端口上,加約束方便。
(3)增加了時鐘的可控制性,易于提高測試覆蓋率。

DC要用哪個時鐘,DC會自己選擇一個。可能會出現DC選擇不同的時鐘做建立和保持的分析。

creat_clock Ext_Clk -period 10 creat_clock Test_Clk -period 100 set_dont_touch_network [get_clocks Ext_Clk] set_dont_touch_network [get_clocks Test_Clk] #Allow DesignTime to use Ext_Clk for timing analysis set_disable_timing CLOCK_GEN/U1 -from a -to y

set_disable_timing命令用起來靈活,該命令有多個選項。用該命令使設計中用到的庫單元的時間弧無效。set_disable_timing命令使當前設計中的通過指定單元,引腳或端口的時間無效。


DC不能推導出分頻時鐘的波形。時鐘信號可以通過任何的組合電路,但中止于寄存器。DC并不知道寄存器的輸出端為時鐘信號或非時鐘信號。

定義分頻時鐘的推薦方法 creat_clock -period 50 [get_ports Ext_Clk] creat_generate_clock -name Int_Clk \-source [get_pins CLOCK_GEN/U2/CP] -divide_by 2\[get_pins CLOCK_GEN/U2/Q] set_clock_latency -source 1.5 [get_clocks Int_Clk] set_clock_latency 0.5 [get_clocks Int_Clk]

4.3 面積約束
用set_max_area命令為設計作面積約束。

current_design PRGRM_CNT_TOP set_max_area 1000

面積的單位由工藝庫定義,可以是:
(1)兩輸入與非門
(2)晶體管數目
(3)平方微米

如果不設置面積的約束,DC將做最小限度的面積優化。設置了面積的約束后,DC將在達到面積約束目標時退出面積優化。如果設置面積的約束為“0”,DC將為面積做優化直到再繼續優化也不會有大的效果時退出優化。

設置面積目標用命令 set_max_area設置時間目標用命令 creat_clock set_input_delay set_output_delay creat_generated_clock設置環境屬性用命令 set_driving_cell set_load set_wire_load_model set_operating_conditions set_wire_load_mode設置設計規則用命令 set_max_capacitance報告命令有: report_clock report_port -verbose report_design清除約束用命令 reset_path reset_design

總結

以上是生活随笔為你收集整理的专用集成电路设计实用教程(学习笔记一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。