芯片設計的一些記錄

1、generate用法

  • 定義genvar,作爲generate中的循環變量;
  • generate語句中定義的for語句,必須要有begin,爲後續增加標籤做準備;
  • begin必須要有名稱,也就是必須要有標籤,因爲標籤會作爲generate循環的實例名稱;
  • 可以使用在generate語句中的類型主要有:
    module(模塊)
    UDP(用戶自定義原語)
    門級原語
    連續賦值語句
    nitial或always語句
  • 基本結構如下:
genvar 循環變量名;
generate
	1. generate-loop循環語句
    2. generate-conditional條件語句
    3. generate-case分支語句
    4. 嵌套的generate語句
endgenerate

generate-for例子:

##一個參數化的gray-code to binary-code 轉換器,這裏採用複製產生多個assign語句的形式來實現
module gray2bin1 (bin, gray);
	parameter SIZE =8; 
	parameter SIZE =8; 
	input [SIZE-1:0] gray; 
	genvar i;
	generate  
		for(i=0; i<SIZE; i=i+1) 
		begin: bit 
			assign bin[i]=^gray[SIZE-1:i]; 
		end
	endgenerate 
endmodule 

generate-if例子:

generate if(MUX_NUM == 0)begin : mux4_1
    always@(*)begin
        data_out = data_in0;
    end
end else if(MUX_NUM = 1) begin : mux3_1
    always@(*)begin
        data_out = data_in1;
    end
end else begin : mux2_1
    always@(*)begin
        data_out = data_in2;
    end
end endgenerate

generate-case例子:

generate
    case(MUX_NUM)
        0:begin:mux_2
        end
        1:begin: mux_3
        end
        2:begin: mux_4
        end
        default:begin
        end
    endcase
end endgenerate

2、跨時鐘域信號處理方法
爲了避免亞穩態,跨時鐘域信號處理分爲兩類:控制信號的傳輸,數據信號的傳輸。控制信號通常是單bit,可以直接採用兩級或多級同步解決,不管快到慢,還是慢到快,都可以使用,在快到慢時要注意把快時鐘域的輸出信號展寬,以便慢時鐘域能採集到;數據信號涉及到多bits,如果直接都採用兩級或多級同步容易使同步數據錯拍,因此目前有兩種其它做法,一是DMUX,二是異步FIFO。DMUX實現方法就是簡單的xreq和yack握手方法,簡單易用,通過這種方法最少需要5拍時鐘才能完成一次握手,在latency敏感的電路中不好使。此時可以用異步FIFO實現,異步FIFO說白了就是一個大容器RAM,裏面可以裝很多數據,並且有指示這個容器滿還是空的信號。如果滿,寫的一方就要暫停往FIFO裏面寫數據,否則會覆蓋未讀出來的數據;如果空,則讀的一方不能往FIFO裏度數據,否則讀出來的都是垃圾數據,影響系統功能。實現異步FIFO的主要難點就是空滿信號的產生,空信號需要將寫時鐘域的指針同步到讀時鐘域,滿信號需要將讀時鐘域的指針同步到寫時鐘域,由於指針通常是多bit,這又嵌套一個多bit信號同步的問題。目前常用的做法是把二進制讀寫指針轉爲格雷碼指針,然後就可以採用簡單的兩級或多級同步方法。異步FIFO釋放了寫一方的等待週期,如果FIFO不滿,就可以一直往裏面塞數據,減少latency。讀寫指針的比較有兩種方式:一是直接比較同步過來的格雷碼,二是把格雷碼轉爲二進制碼再比較,後者比前者多需要四個格雷碼轉二進制碼電路模塊,面積更大,時序更差。
3、低功耗處理方法
芯片功耗主要由三部分組成:浪湧電流、靜態功耗和動態功耗。浪湧電流與設備相關,如電機啓動電流在前幾個週期是正常滿載電流的數倍;靜態功耗與元件的電氣特徵相關,也包括晶體管漏電流所導致的功耗,Pstatic~CVdd2,t爲參數;動態功耗是門電路輸出切換時,由邏輯切換所引起的功耗,Pdynamic~SCVdd2f,C爲門寄生電容,S爲每個時鐘通過整個電路的平均轉換次數,f爲時鐘頻率。
降低功耗可以在所有設計層次上進行,即系統級、邏輯級和物理級,層次越高對功耗降低可能越有效。這裏僅針對以上功耗計算公式和平時有遇到的低功耗手段談論下。
由功耗公式可知:通過降低電壓,可以以平方次冪降低功耗,還有一個就是增加NMOS或PMOS電壓開關,在適當時候把某一區域電源斷掉,有時可以講整芯片劃分多個電壓域,對速度要求低的可以工作在低電壓下,反之爲高電壓,在存儲器中可以使用多電壓模式供電,如果某塊區域不用可以直接斷電,如果只需要保存數據,可以通過處理器配置爲低電壓,只要不丟失數據即可,如果需要讀寫,則可以配置爲全電壓模式;通過使用先進工藝,降低寄生電容也可以降低功耗;通過降低f來降低功耗,但是如今追求高速率芯片,這個基本沒戲了,有一個思路就是DVFS,即根據實時芯片狀態來動態調頻調壓;降低S,即每次時鐘翻轉所帶來整個電路的平均翻轉次數,這個是目前接觸比較多的低功耗技術,如時鐘門控、one-hot狀態機編碼和多路選擇器和資源複用;還有一個降低功耗的方式是使用多閾值電壓晶體管,在時序好收斂處採用高Vt來降低漏電流。
4、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章