# Synthesizable(可合成) Code ###### tags: `Digital IC Design` [回到主頁面](https://hackmd.io/@derek8955/BkK2Nb5Jo/https%3A%2F%2Fhackmd.io%2FdpcBlBL8TlShpQ-wSi9Quw) - behavioral modeling 只用 always 語法(不用 initial ) - sensitivity list 中不可同時含有 clock 負緣觸發和正緣觸發(沒有 cell 可以做這樣的功能) ```verilog= // violate always @( posedge clk or negedge clk ) ``` - 同一個 variable 只能定義在一個 procedural block 中。會產生 unknown ```verilog= // violate always @( * ) a = b; always @( * ) a = c; ``` ![](https://i.imgur.com/Hrfi5FA.png) - 必須使用同種 procedural assignment ```verilog= // violate always @( posedge clk or negedge rst_n ) begin if( !rst_n ) a = 0; else a <= 0; end ``` - for loop 裡的 start, stop, step 都必須要是常數,design compiler 才知道要 copy 幾次你的電路 ```verilog= always @( * ) begin for( idx=0 ; idx<r ; idx=idx+1 ) // violate end ``` - 所有的 [operator](https://hackmd.io/O_VRJLHkTJ2ZxghlaY3q5A) 幾乎都可以合成,除了 Equality 中的 !== 、 === :::warning 很多在初學階段的同學,都很執著一個問題,某某某語法能不能合成? 基本上只要有良好的 [coding style](https://hackmd.io/sXEzB8SGRzWQ4v0ib5cFuA),design compiler 都是看得懂的。 ::: > 把 desing 丟入 design compiler 就可以知道所撰寫的電路是否為 synthesizable code