--- ###### tags : `數位 IC 設計` --- # 數位 IC 設計 ## ModelSim 在終端機使用方法 * `vlib <name>` : 建立名為 name 的設計函式庫。 * `vlog <files>` : 使用 ModelSim 編譯所有 files 的檔案。 * `vsim <top_level_module>` : 使用 ModelSim 開啟編譯完成的檔案。 * 在 ModelSim 中輸入 `run -all` : 使用 `vsim` 開啟檔案後,輸入 `run -all` 可以執行模擬。 以下為範例 : ```cmd PS C:\Users\StevenChou\Desktop\Verilog_practice\Chp5\Q3> vlib work ** Warning: (vlib-34) Library already exists at "work". PS C:\Users\StevenChou\Desktop\Verilog_practice\Chp5\Q3> vlog adder.v Model Technology ModelSim - Intel FPGA Edition vlog 2020.1 Compiler 2020.02 Feb 28 2020 Start time: 15:18:51 on Mar 15,2023 vlog adder.v -- Compiling module adder Top level modules: adder End time: 15:18:52 on Mar 15,2023, Elapsed time: 0:00:01 Errors: 0, Warnings: 0 PS C:\Users\StevenChou\Desktop\Verilog_practice\Chp5\Q3> vsim adder Reading pref.tcl ``` 此處我們先使用 `vlib` 建立一個名為 work 的設計函式庫,接著使用 `vlog` 編譯已經撰寫完的 adder.v 檔,可以看到編譯器輸出 top level modules 名稱為 `adder` 。接著使用 `vsim` 將編譯完成的 top module `adder` 用 ModelSim 開啟,進入 ModelSim 後只需要在裡面的終端機輸入 `run -all` 即可。 :::info 使用這些指令時需要注意檔案的絕對位置不能有中文,需要為全英文。 ::: :::danger # Verilog Coding Guideline ![](https://i.imgur.com/gQMBzgg.png) ::: ## Week 1 ### Hardware Implementation * 一般來說,一個方法或是說演算法可以藉由以下方式實作 : 1. 硬體處理器 + 相對應的軟體程式 (有較高的可塑性,但是速度較慢) * Pentium IV + 相對應的軟體程式 (高階語言) * TI-DSP + 相對應的軟體程式 * MCU (8051) + 相對應的軟體程式 (低階語言) 2. 專用的硬體電路 (速度快) * old_PCBs(TTL SSI, MSI chips and wires) * new_PCBS(some devices, application specific integrated circuit (ASIC, 應用導向積體電路), wire) 3. 一些硬體電路 + 軟體程式 (因應更多複雜的問題,現在較常用的設計) * System on a board (memory, processor, ASIC, I/O) * System on a chip (SoC) ![](https://i.imgur.com/mcOGKAB.png) ### N-channel MOS Transistor (NMOS 電晶體) 當閘極沒有施加電壓時,源極與汲極並沒有辦法導通,而當閘極施加正電壓時,基板中的電子會靠近閘極從而形成導通。 ![](https://i.imgur.com/2emWK6J.png) 藉由剛剛上述的 NMOS 可以做出一個 NOT 閘,而透過串聯或是並聯又可以做出 NAND 與 NOR 閘,從而產生各個邏輯閘。 ![](https://i.imgur.com/N8BesKD.png) :::info 在真實世界中,NOT 閘會再多使用一個 PMOS 讓電壓的高低電位變化更符合要求, NAND 與 NOR 閘也是同樣情況,每個 NMOS 都會需要再一個 PMOS 。 ::: ### Design Entry for VLSI System * Schematic * 透過圖形化的方式將一個個邏輯閘相接,此方法易於除錯。 * ![](https://i.imgur.com/vvPTns6.png) * HDL (Hardware Description Language) * 利用硬體描述語言將電路描述出來 * 便攜並且易於修改 * ![](https://i.imgur.com/BeEmbvr.png) ### Circuit Design Process ![](https://i.imgur.com/gACq54o.png) ### IC Design Flow ![](https://i.imgur.com/YSm6lhN.png) * Full (Fully) Custom Design : * 客製化所需的類比與數位電路 * 邏輯閘、電晶體以及佈局都可以經過最佳化設計 * Semi Custom Design : * 適用於較大的數位電路 * 實際上的邏輯閘、電晶體與佈局皆是由相關的軟體工具完成 * 藉由硬體描述語言實現 ### Semi Custom Design (半客戶式設計) 1. Product specification (訂定產品規格) 2. Modeling with HDL (使用硬體描述語言進行模擬) 3. Synthesis (by using suitable standard cell) (將 HDL 合成為邏輯閘,在合成為硬體電路) 4. Simulation and verification (模擬與驗證) 5. Physical placement and layout (實際佈局) 6. Tape-out (real chip) (實際生產出晶片) 7. Testing (測試) ![](https://i.imgur.com/LfiUy8a.png) 其中 2 ~ 5 的步驟皆可以透過特殊的工具進行模擬,而 3 ~ 6 的步驟可以透過兩種方式完成。第一種是使用 FPGA 進行合成與驗證,其優點為設計上有彈性,設計週期較短,適於小量的生產規模。第二種為使用 IC 製造廠 (如台積電、聯電等) 提供的邏輯閘 Cell 真正製作出一個晶片,其缺點為內容沒有彈性(設計圖有幾個邏輯閘,生產出來的晶片就有幾個邏輯閘)、需要較長的設計週期,適於較大量的生產規模。 ## Week 2 ### FPGA/CPLD Design Flow ![](https://i.imgur.com/G3LQb3z.png) ### SPLD (Simple Programmable Logic Device) * 邏輯閘約在數百閘左右 * IC 腳位在 28 pin 以內 * Bipolar process ,只能做單次燒錄,資料無法抹除 * GAL process ,多次燒錄,可縮短設計時程 ### CPLD (Complex Programmable Logic Device) * 邏輯閘在 800 ~ 5000 之間 * IC 腳位高於 28 pin * 44 pin 以上 IC 的封裝以 PLCC 為主 * CMOS 設計技術 * 多次燒錄抹除 ### FPGA (Field Programmable Gate Array) * 使用上與 CPLD 不同的架構設計模式 * 以暫存器居多,其密度在 5K 以上 * 腳位數多 * Routing 複雜,非固定式,延遲時間較長 * FPGA 的架構 * SRAM Base - 可重複燒錄但需外部電源維持資料 * Anti-fuse - 只有一次燒錄,提供較佳保密性 ### Configurable VLSI * 優點 * 上市時間較短 (從想法到實際產品的時間較短) * 工具價格較低 * 當設計改變時,成本很低 (只需要重新燒錄即可) * 測試成本低 * 製程較有優勢 (因為 FPGA 的廠商的貨量大,通常會用最新的製程) * 缺點 * FPGA 的 Cell 容量為固定 * 速度比 ASIC 慢 * 由於製程較新,因此價格較貴 ### Detailed Design * 選擇適當的架構 * 演算法、規格 * 平行化、pipelining * 選擇設計的方法 * Schematic * HDL (Hardware Description Language) ### Functional Simulation 在設計完電路之後,先對電路的行為結果進行測試 (只管功能對不對)。 ### Timing Simulation 在電路的功能確認完成後,在對電路的延遲進行測試與改進。 ## Week 3 ### Optimization issues for VLSI Design Five optimization issues : 1. Area (空間) : less silicon, less cost, high yield (良率) 2. Speed (速度) : design constraint, better timing performance 3. Power dissipation (功耗) : cooling, battery 4. Testability (可測試性) : minimize the time spent to test a single chip 5. Design time (設計所需時間) : CAD tools :::info 由於 Verilog 在合成之後所有的程式碼都會形成一個個的邏輯閘,因此在撰寫時一定要將不需要的程式碼進行刪除,避免生成出不必要的電路,增加成本。 ::: ### Verilog Module ![](https://i.imgur.com/wqSJctE.png) ### Circuit Description Verilog 提供三種對於電路的描述方式 : 1. Structural description 2. Data flow description 3. Behavioral description * Structural description : 將每一個會使用到的功能與邏輯閘一一寫出來。 ![](https://i.imgur.com/cAeEQFi.png) * Data flow description ![](https://i.imgur.com/riuHO0b.png) 若想要合成出乾淨的組合電路則需要使用 verilog 的關鍵字 assign , assign 為持續性的賦值,當有任一個輸入改變時,被 assign 的輸出也會立刻改變。 :::info 在撰寫 verilog 時,組合電路與循序電路必須分開來寫。 組合電路 : 一個電路若沒有任何記憶功能 (例如儲存上一個輸入或是上一個輸出) ,輸出只與現在的輸入有關,則稱為組合電路。 循序電路 : 電路的輸出會與現在的輸入、之前的輸入與之前的輸出有關 (有記憶功能) 。 ::: * Behavioral description ![](https://i.imgur.com/u2bcudu.png) ![](https://i.imgur.com/2jH5YTj.png) ### Gate Delay ![](https://i.imgur.com/9X8gwJv.png) :::info 一個電路的好壞是不能從邏輯閘得知的,因為每個邏輯閘所需的電晶體數量不同,因此我們必須轉換為電晶體的數量才能更好的比較 ::: ### Difference Between C and Verilog ![](https://i.imgur.com/DwDxaJD.png) 以上圖為例,若需要做兩個連續的加法,可以透過一個加法器和多工器完成,或是透過兩個加法器串聯而成。兩個加法器的速度會快於一個加法器的速度,因為兩個加法器可以在一個周期內完成,而一個加法器需要做兩次加法也就是兩個周期才能完成。但是由於這兩個加法是存在相依性的 (下一個加法的輸入需要 上一個加法的輸出) ,兩個加法器的第二個加法器需要等到第一個加法器的結果正確才能開始執行,從而無法達到平行化的執行,因此兩個加法器的實作方式是較浪費硬體的。 ### Identifier * Verilog 的識別字第一個字元一定要是字母,其餘的字元可以為字母、數字或是底線。 * 大小寫有分別 ## Week 4 ### 描述電路的多個方式 * Structural description : 將電路中每個邏輯閘所連接的輸入輸出都描述出來,較不推薦。 * Data flow description : 描述輸入與輸出之間的關係,較常使用。 ### Parameter * 可以透過定義一個 parameter 使用於其他地方,意義上類似於 C 語言的巨集,以下為使用 parameter 的範例 : ```verilog= module mod(ina, inb, out); .... parameter m1 = 8; .... wire [m1:0] w1; ..... endmodule ``` 透過直接修改 m1 的數值,我們可以更改到所有使用 m1 當作參數的變數 (如 wire) ,但是在更改 m1 的值之後仍得重新合成。 :::info verilog 與 C 語言不同的地方在於, C 語言的變數可以在執行時期再決定其內容與大小,而 veriog 由於是描述硬體,因此必須在合成前就定義完成。 ::: ### 更改 module 中使用的 parameter 透過主模組呼叫副模組,主模組可以在呼叫副模組時覆蓋副模組中 parameter 的值 (parameter 可以只有一個也可以有多個) ,在撰寫與合成時便有更大的彈性,以下為一個例子 : * 副模組使用 parameter 定義 module 中的內容 : ```verilog= module test_2(A, B, C, D); parameter width = 8; parameter height = 8; parameter length = 8; input [width - 1 : 0] A; input [height - 1 : 0] B; input [length - 1 : 0] C; output [width : 0] D; assign D = A + B + C; endmodule ``` * 主模組在呼叫副模組的同時覆蓋 parameter 的值 : ```verilog= module PARAM_1(A, B, C, D); input [4 : 0] A; input [3 : 0] B; input [3 : 0] C; output [5 : 0] D; test_2 #(5, 4, 4) u1(A, B, C, D); endmodule ``` 由上面的例子可以知道我們將副模組 `test_2` 的 width 修改為 5 ,height 修改為 4 ,length 修改為 4 。 ## Week 5 ### 模組中的 port mapping 在呼叫一個模組時,需要加上輸入與輸出的各對應參數,輸入與輸出的排列上市共有以下兩種 : 1. In order : 呼叫模組時輸入與輸出的擺放順序與定義模組時的順序相同。 以下為範例 : ```verilog= module parent_mod; wire [3:0] g; child_mod G1(g[3], g[1], g[0], g[2]); endmodule module child_mod(sig_a, sig_b, sig_c, sig_d); input sig_c, sig_d; output sig_a, sig_b; // module description endmodule ``` 由上述的範例可以知道, parent_mod 在呼叫 child_mod 時本身的 g[3] 、 g[1] 、 g[0] 、 g[2] 訊號分別會接到 child_mod 的 sig_a 、 sig_b 、 sig_c 、 sig_d 。 2. By name : 呼叫模組時各個輸出入會明確的寫出配對的參數。 以下為範例 : ```verilog= module parent_mod; wire [3:0] g; child_mod G1(.sig_c(g[3]), .sig_d(g[2]), .sig_b(g[0]), sig_a(g[1])); endmodule module child_mod(sig_a, sig_b, sig_c, sig_d); input sig_c, sig_d; output sig_a, sig_b; // module description endmodule ``` 上述的例子在呼叫另一個模組時,就已經將每個輸出入所對應的參數明確的寫出來,因此雖然撰寫上較為麻煩,但是在閱讀程式碼時相當容易,也方便其他人除錯,因此建議使用這種方法。 ### 運算子 (operator) 的使用注意 在使用基本的運算子時,有時需要注意執行的效率,以以下的圖為例 : ![](https://i.imgur.com/jJNhMIg.png) 雖然兩種都是將四個數值做相加,但是上面的寫法可能 (與 Verilog 的編譯器有關) 會造成電路合成時產生延遲較大的相加電路。而下方的寫法因為加上了括號,編譯器會先執行括號內計算,因此合成出來的電路延遲較小,效率更號。 :::info 在撰寫執行計算的程式碼時,需要注意乘、除、餘三個運算都非常耗費時間,因此不建議與加與減放在同一個 always block 中。 除此之外,除法與餘 (乘法不一定) 在模擬時是可行的,但是其無法實際合成成真的電路。 ::: ### 平移 (shift) 運算子 由於乘法器與除法器相當耗費時間與需要較大的電路,因此若是能使用平移運算子完成的運算就盡量使用平移運算子。 ### Verilog 主副模組的使用 在定義主副模組時,副模組可以直接定義在主模組的檔案中,而檔名必須為主模組的名稱。若想要定義在不同檔案,則主副模組皆需要使用模組名為檔名,並且主模組需要使用 `` `include`` 加上副模組的檔名才能呼叫副模組。 ### Waveform Simulation (波型模擬) 在撰寫玩 Verilog code 後,我們可以進行模擬,其中模擬主要分為兩種 : 1. functional simulation (功能性模擬) : 只針對電路的功能進行驗證,尚未引入延遲 (delay) 。 2. timing simulation (時序模擬) : 模擬功能的同時加上延遲的影響,延遲的大小主要時由邏輯閘、製程與 library 影響,並且是估測出來的,因為每一個產出的晶片也存在誤差。 :::info 一般來說, functional simulation 比 timing simulation 快非常多,因此通常會先確認功能正確,再來測試延遲是否過大。 ::: ### Simulation for a circuit 在對一個合成的電路進行模擬時,我們必須對該電路輸入各種內容的訊號,該訊號稱為 (Stimulus) ,其中 stimulus 也是用 verilog 撰寫的,但是其不包含在真正的模組中,因此其無法合成。 ![](https://i.imgur.com/AJsgdgu.png) :::info 在做電路的測試時,是不可能將所有的測試多做完的,其原因在於 IC 內部也會存有不同的狀態,因此相同的輸入也有可能導致不同的輸出。 ::: ## Week 6 ### Begin_End Statements * 在 Bedin End block 中,區塊可以有自己的名稱,命名後的區塊可以宣告自己的區域變數。 ### Combinational vs. Sequential Circuit * Combinational (組合電路) : 現在的輸出只與現在的輸入有關,亦即當輸入有變化時,輸出也會馬上有變化 (在實際情況中,電路會有 propagation delay) 。 * Sequential Circuit (循序電路) : 組合電路 + 記憶功能。 :::info 在寫循序電路的 Verilog 時,盡量將乾淨的組合電路分開來寫。 ::: ### If-Else Statements :::info 在寫 If-else 時,一定要把 else 也寫出來,不然會有記憶功能,產生一個 latch 。 ::: * 若沒有寫 else : ```verilog= module latch(in, enable, out); input enable; input [3:0] in; output [3:0] out; always @(in or enable) begin if (enable) out = in; end endmodule ``` 在上述的例子中,若 enable 為 0 ,則 out 會等於舊的 out ,亦即需要記住舊的 out ,需要記憶功能 (verilog 會自動生成 latch)。 ![](https://i.imgur.com/noANyHg.png) if-then-else statement 會存在優先級相關的多工器。 ![](https://i.imgur.com/My9rSa1.png) ### Resource Sharing (共享資源) 在某些情況下,具有相同功能的電路可以有不同的建構方式,因此會造成硬體上的浪費。 ![](https://i.imgur.com/XAG2fcz.png) :::info 組合電路常見的為使用 assign 以及 always block ::: ### Case Statements 在使用 case 時,所有的情況也要寫滿,不然也會產生 latch 。 :::info 因此在使用 case 時,建議可以寫上 default ,確保所有的結果都有照顧到。 另外,case 沒有寫滿或是 case 的某些條件沒有描述,也會產生 latch 。 ![](https://i.imgur.com/a6YfVyI.png) ::: ### For Loop Statements 在 Verilog 中使用 For Loop 時,實際上合成時會將 for loop 展開,將 for loop 中所有使用到的硬體做合成,因此一般不建議使用 for loop 。 ![](https://i.imgur.com/0UfX89z.png) ### Comparator 在撰寫比較器的 Verilog 時,如果為單純的組合電路,則輸入改變後再輸出正確前可能會有暫時的錯誤輸出,因此我們可以透過加入 flip-flop ,將其改為循序電路。以下為程式碼與模擬得比較 : * 單純的組合電路 ![](https://i.imgur.com/RZKPdPo.png) 可以看到輸出有時會有短暫的錯誤輸出。 * 加入 flip-flop 的循序電路 ![](https://i.imgur.com/d5R7jH7.png) 加入 flip-flop 後輸出只會在時鐘的正緣做更改,變成循序電路。 ### Example for IF 在撰寫一些 IF-ELSE 的 Verilog 時,有些寫法可能會造成硬體的浪費。 ![](https://i.imgur.com/1zIxlNl.png) 以上圖為例,左側的程式碼中 LATE == 1'b1 所代表的結果是相同,若分開來寫有可能會產生多餘的電路。因此右側的寫法更好。 以下為另一個例子 : ![](https://i.imgur.com/88L6v6W.png) ![](https://i.imgur.com/wEdwxLe.png) ![](https://i.imgur.com/ZiXojlj.png) 可以看到左側較差的設計會使用到更多的多工器,而右側較佳的設計只需要兩個多工器。 ## Week 7 ### Sequential Circuit 循序電路主要分為兩種 : 非同步與同步。 * 非同步 (Asynchronous) : 當輸入改變時,輸出也會馬上做改變。 * 同步 (Synchronous) : 當輸入改變時,輸出會隨著時鐘訊號做同步。 ### Clock Period * Duty Cycle (工作週期) : clock width 佔據時鐘周期的比例。 ### Latch and Flip-Flop * Latch 為 level-sensitive ,因此 latch 只要時鐘訊號為 1 時,對不同的輸出一直都會有反應 (紅色區塊) 。 * Flip-Flop 則是 edge trigger ,只有在時鐘變為 1 (或 0 ) 的瞬間,才會對輸入有反應 (藍色區塊) 。 ![](https://i.imgur.com/sKlLW1O.png) :::info 由於 latch 的反應時間太長,可能會導致 latch 的輸出在同一個週期又進入組合電路,因此使用 latch 會導致循序電路不好控制。 ::: ### Setup Time and Hold Time * Setup Time : 在 Clock 正緣來之前,輸入 D 要先準備好的時間。 輸入 D 在進入 flip-flop 後,會需要一段時間進入到所有的邏輯閘。因此需要在時鐘的正緣來之前將 D 的輸入完全跑進入 flip-flop 中並更改 flip-flop 的內部狀態,所需的時間即為 setup time。 :::info 若輸入 D 在時間正緣之前並沒有保持夠久的時間,則會造成 flip-flop 的狀態尚未更新完全,當時鐘的正緣進入 flip-flop 時,輸出便會不正確。 ::: * Hold Time : Clock 正緣來了之後, D 還要維持的時間。 在時鐘的正緣來之後,與輸出完全正確前還需要一段時間,這段時間輸入 D 還不能改變,最短的不能更改的時間即為 hold time 。 ### Latch vs. Flip-Flop ![](https://i.imgur.com/iLYBL5r.png) 由上面的圖可以看到,當輸入 D 改變時,只要 CLK 為 1 , latch 所產生的輸出 Q 也會做更改。 而 Flip-Flop 只需要確定在正緣來之前將輸入 D 準備好,並且在正緣後保持一段時間,輸出 Q 也會做更改。因此正緣的其他時間輸入 D 做任何更改對輸出 Q 也沒有用。 ### D Flip-Flop with Reset ![](https://i.imgur.com/knxZZwK.png) 由上面的圖可以看到,非同步的 Reset 為當 Reset 訊號產生時, Flip-Flop 即會立刻做 Reset 。而若是同步的 Reset ,則 Reset 的訊號還要等 CLK 的正緣。 :::info 當在 Verilog 中使用 `posedge CLK` 時,若 if-else 的條件沒有寫滿,也不會產生 latch 。 * 有 latch ```verilog always @(A) begin if (enable) B = A; // 沒有 else 也沒有由時鐘控制 end ``` * 沒有 latch ```verilog always @(posedge clk) begin if (enable) B = A; // 沒有 else 但是由時鐘控制 end ``` ::: ## Week 8 ### Blocking vs. Non-Blocking 對於單純的組合邏輯來說,在 always block 中使用 Blocking 或 Non-Blocking 是沒有差別的。 但是若是以循序電路來說,則使用 Blocking 與 Non-Blocking 有可能會有差別。 以下圖為例,若我們使用 Blocking assignment ,則各個計算是存在先後順序的,因此左側的 block 只需要一個 flip-flop ,但是若使用 Non-Blocking assignment ,則每一個計算都是相同的優先級,會同時進行運算,因此會需要多個 flip-flop 儲存所有的結果。 ![](https://i.imgur.com/MtiJ9ds.png) ### Synchronous/Asynchronous Counter * Synchronous Counter 所有的 flip-flop 皆會與時鐘訊號相連,當時鐘訊號來臨時, flip-flop 會將資料讀取並輸出至組合電路中,等待組合電路計算完成後,再等待下一個時鐘正緣將新的計算結果輸入至 flip-flop 中。 這種 Counter 的特性為其每一位都會與時鐘訊號同步,因此時鐘的周期是由計算 (加一) 的組合電路的 propagation delay 與 flip-flop 的 setup time 決定的。 ![](https://i.imgur.com/HzhqPkm.png) * Asynchronous Counter 非同步的計時器其時鐘訊號只會接到第一個位數的 flip-flop ,而其輸出會接到下一個位數的 clock 輸入,以此類推,因此其有電類似 Ripple Adder ,最後一位進入穩定的狀態需要其前面每一位都計算完成才行 (Propagation delay 較長) 。因此每一個 flip-flop 的頻率會是其上一個 flip-flop 頻率的一半。 ![](https://i.imgur.com/JMHTF20.png) ### Control Unit 處理器中一般有分為 Control Unit 與 Data Path ,而 Control Unit 為一個 Finite State Machine ,透過當前的狀態輸出控制訊號給 Data Path 以進行運算,而計算完的產生的副作用也會回傳到 Control Unit 以更新至新的狀態 (由副作用與現在的狀態更新至新的狀態) 。 * 以下為示意圖 : ![](https://i.imgur.com/JLurFco.png) State Register 會在每一個時鐘的正緣將新的狀態讀取後並傳送至 Output Logic , Output Logic 在接收到新的狀態後會經過一個組合電路,最後輸出一組控制訊號到 Data Path ,使的 Data Path 在做出相對應的計算。在計算完成後,計算產生的副作用與原本的狀態會輸出到 Next-state logic ,並且輸出新的狀態到 State Register ,等到下一個正緣時, State Register 便會更新至新的狀態,以此類推。 ### Finite State Machine * Moore machine : $S\rightarrow O$ (輸出只與現在的狀態有關) * Mealy machine : $S\times I \rightarrow O$ (輸出與現在的狀態以及輸入有關) ![](https://i.imgur.com/4Yr9wml.png) ![](https://i.imgur.com/zfQzl4k.png) * 為了更好的撰寫 FSM ,我們必須將其分為二或三個 `always@` block : 1. 現在的狀態或是 state register (循序電路) 2. 計算下一個狀態的邏輯電路 (組合電路) 3. 根據現在狀態輸出邏輯的電路 (組合電路) :::info 上面的兩個組合電路是可以合併的。 ::: * 使用 `parameter` 定義狀態名稱。 假設現在的狀態為 K 狀態, K 狀態會進入 Output Logic 並產生對應的輸出,接著同時狀態 K 會與 Input 進入 Next State Logic ,產生新的狀態 Z 。等待到下一個時鐘正緣後,狀態 Z 會再進入 Current State Register ,輸出新的 output 。 ## Week 11 ![](https://i.imgur.com/sj3531K.png) 1. Resource-constrained scheduling : 只有固定數量的硬體可以使用 2. Time-constrained scheduling : 必須在固定時間內完成 * Resource-Constrained Scheduling ![](https://i.imgur.com/oTVJ2p9.png) 1. 先設計能夠最早完成邏輯的電路 (ASAP) ,接著設計在相同週期下能夠最晚完成邏輯的電路 (ALAP, As Late As Possible) 2. 接著找出可以進行移動的 block 以及不可以進行移動的 block ,最後從電路的開始先將不可以移動的 block 放進電路中,在放進可以移動的 block 。