基于系統芯片ZSU32的SoC芯片設計
本文針對中山大學(xué)ASIC設計中心自主開(kāi)發(fā)的一款系統芯片ZSU32,以Synopsys公司的Design Compiler為綜合工具,探索了對SoC芯片進(jìn)行綜合的設計流程和方法,特別對綜合過(guò)程的時(shí)序約束進(jìn)行了詳細討論,提出了有效的綜合約束設置方案。
本文引用地址:http://dyxdggzs.com/article/151508.htm1 時(shí)序約束原理
同步電路是大多數集成電路系統的主流選擇。同步電路具有工作特性簡(jiǎn)單、步調明確、抗干擾能力強等特點(diǎn)。但是,因為所有的時(shí)序元件受控于一個(gè)特定的時(shí)鐘,所以數據的傳播必須滿(mǎn)足一定的約束以便能夠保持與時(shí)鐘信號步調一致。
設置建立時(shí)間(setup time)約束可以滿(mǎn)足第一個(gè)條件:

ZSU32芯片內置32 bit MIPS體系處理器作為CPU,具備兩路獨立的指令和數據高速緩存,CPU內部有獨立的DSP協(xié)處理器和浮點(diǎn)協(xié)處理器,同時(shí)集成了LCD控制器、MPEG硬件加速器、AC97控制器、SRAM控制器、NAND Flash控制器、SATA高速硬盤(pán)控制器、以太網(wǎng)MAC控制器等,并具有I2C、I2S、SPI、、UART、GPIO等多種接口模塊。
3 ZSU32系統芯片的約束設置與邏輯綜合
ZSU32系統芯片的綜合采取自底向上的策略,先局部后整體。首先將當前工作層次設置為系統芯片的某個(gè)子模塊,然后對該子模塊添加各項具體約束,接著(zhù)完成子模塊的綜合。依次對各子模塊重復上述綜合流程,當各個(gè)模塊都順利通過(guò)了初次綜合后,通過(guò)set_dont_touch_network命令將模塊中的關(guān)鍵路徑和時(shí)鐘線(xiàn)網(wǎng)保護起來(lái),然后做一次全局優(yōu)化,檢查是否滿(mǎn)足時(shí)序等各方面的設計要求,達到要求就可以輸出最終的網(wǎng)表和各項綜合報告。
3.1 設定工藝庫和參考庫
設置Design Compiler運行所使用的庫:目標庫(target_library)、鏈接庫(link_library)、可綜合庫(synthetic_library)、符號庫(symbol_library)。其中的目標庫中包含了標準單元庫、RAM單元庫、I/O單元庫、PLL單元庫等,通常是由芯片代工廠(chǎng)家提供。系統芯片ZSU32采用的是中芯國際的0.18 ?滋m CMOS工藝庫,所以在設置時(shí)就把目標庫指向該工藝庫。
#設置目標工藝庫
set target_library SMIC.db
3.2 讀入RTL設計與設置工作環(huán)境
讀入RTL設計通常有自頂向下或者自底向上2種方式。因為ZSU32模塊眾多,所以采用自底向上的讀入方式。首先讀入各個(gè)子模塊,并分別編譯;然后更改層次,編譯上一層的模塊;最后會(huì )合成整個(gè)系統。
讀入設計后,首先設置芯片的工作環(huán)境,根據采用的工藝庫提供的環(huán)境和線(xiàn)網(wǎng)負載模型,可以通過(guò)set_operating_condition和set_wire_load_model命令進(jìn)行設置。以下是ZSU32綜合環(huán)境的頂層環(huán)境設置:
#設置工作環(huán)境
set_operating_condition smic18_typ;
#設置線(xiàn)網(wǎng)負載模型
set_wire_load_model smic18_wl30;
3.3 時(shí)序約束
3.3.1 時(shí)鐘定義
時(shí)鐘是整個(gè)時(shí)序約束的起點(diǎn)。系統芯片ZSU32將外部輸入時(shí)鐘和PLL模塊輸入時(shí)鐘作為源時(shí)鐘:ext_clk_i和pll_clk_i。通過(guò)對這2個(gè)源時(shí)鐘信號的分頻或者倍頻,產(chǎn)生了各個(gè)子模塊的時(shí)鐘信號。
#定義源時(shí)鐘ext_clk,周期16 ns
create_clock-name ext_clk-period
16 [get_ports {ext_clk_i}];
在SoC芯片內部,子模塊的時(shí)鐘實(shí)際是經(jīng)過(guò)源時(shí)鐘分頻或者倍頻得到的,使用create_generated_clock命令來(lái)建立子模塊時(shí)鐘。
#設置一個(gè)2倍頻時(shí)鐘clk_main,
#其源時(shí)鐘是pll_clk_i
create_generated_clock -name clk_main
-multiply_by 2 -source pll_clk_i;
評論