隨著功能複雜度的快速提升,對晶片的要求也是隨著提高,所以現在一款晶片的開發,往往需要數十人,長達幾個月的共同開發才能完成。
Verilog HDL的語法相對開放,每個人開發的Verilog HDL之間的差異也是非常的大。但是一個設計團隊之間,進行RTL模塊的交叉review、相互調用是非常頻繁的事情,所以為了增強RTL代碼的可移植性,以及review的效率,我們通常在一個項目開始的時候,會統一整理一個RTL編碼規則,裡面的內容包括,命名的規則、單詞的縮略原則,一些標準電路的常用寫法等等。
今天的文章,就來聊一聊一般常見的規則。
RTL推薦編碼規則
在編寫RTL時候,如果有比較複雜的邏輯運算,我們一定要注意避免冗長的邏輯和子表達式。
這種情況是十分常見的,我們還是通過一個例子說明一下。比如說:
input a,b,c,d,e,f;
output out;
assign out = (a & (~b) | c )& d & (e | ~(f));
我們可以看到,這裡面的運算特別複雜,牽扯到了6個輸入,進行不同的邏輯,共同得到了一個輸出。一般說來,這種表達式,有兩個很大的問題所在:
我們很難在較短的時間內,得出這一串邏輯運算的最終結果,無法快速的得到一個確定的正確結果。在debug過程中,很難去debug出到底是哪根信號出了問題,即使是把所有信號都拉出來,通過眼睛也是很難看出問題所在(當然debug的工具裡面提供了信號的邏輯運算功能,但是畢竟要操作很長時間)所以我們看出,使用一長串複雜的邏輯組合,帶來的壞處是很明顯的。
那正確的作法是怎樣的?個人推薦兩種作法,分別如下所示:
卡洛圖化簡。在學習數字電路的時候,大家都學過,對比較複雜的邏輯表達式,要先進行化簡,然後再做成電路。分成多個簡單的邏輯表達式。在邏輯表達式中,我們可以多加幾個中間變量,通過中間變量,一步一步得出最終的結果。例如上面的例子中,我們可以分解成以下的寫法:wire out_1,out_2,out_3,,out_4,out;
assign out_1 = a & (~b);
assign out_2 = out_1 | c;
assign out_3 = out_2 & d;
assign out_4 = e | ~(f);
assign out= out_3 & out_4;
這麼寫有兩個好處,首先邏輯運算中的優先級就能很清楚的出來,再次,在debug過程中,我們可以先拉出out_1/out_2/out_3/out_4,可以加快debug的速度。
小結
在編寫複雜邏輯的時候,我們需要特別小心,邏輯優先級,是否便於debug等等,都是我們需要考慮的了。