Verilog的兩個原則,把複雜的邏輯表達式寫簡單

2021-01-17 單眼皮老王

隨著功能複雜度的快速提升,對晶片的要求也是隨著提高,所以現在一款晶片的開發,往往需要數十人,長達幾個月的共同開發才能完成。

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等等,都是我們需要考慮的了。

相關焦點

  • Verilog表達式
    而在邏輯比較中,值x和z具有通常的意義,且結果可以不為x。也就是說,在邏輯比較中,如果兩個操作數之一包含x或z,結果為未知的值(x)。   如果操作數的長度不相等,長度較小的操作數在左側添0補位,例如: 2'b10 = = 4'b0010 與下面的表達式相同: 4'b0010 = = 4'b0010 結果為真(1)。 2.4 邏輯操作符    邏輯操作符有: * (邏輯與) * || (邏輯或) * !
  • Verilog模型到門級的映射,要注意這些編碼原則
    可綜合Verilog HDL的編寫原則我們在工作中,總結出了一些Verilog的編碼原則,它們如下所示:從電路到RTL代碼。在編碼之前,需要先大概想出,電路的基本模型,verilog只是將這個模型描述出來。且不可只是寫代碼,根本不知道所寫的RTL,究竟是否能夠通過DC,映射成電路,或者說,能夠映射成什麼樣的電路。RTL的代碼層次要清楚。
  • 比較Verilog中Wire和Reg的不同之處
    比較Verilog中Wire和Reg的不同之處 MangoWen 發表於 2020-03-08 17:18:00 wire 和reg是Verilog程序裡的常見的兩種變量類型,他們都是構成verilog
  • FPGA程式語言——verilog語法
    我們只要對Verilog HDL某些語句的特殊方面著重理解,並加強上機練習就能很好地掌握它,就能利用它的強大功能來設計複雜的數字邏輯電路系統。2.1.簡單的Verilog HDL模塊2.1.1. Verilog 語法簡介下面先介紹一個個簡單的Verilog HDL程序,從中了解Verilog模塊的特性。
  • JavaScript高級什麼是正則以及正則表達式的簡單運用
    正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。正則表達式的作用給定的字符串是否符合正則表達式的過濾邏輯(匹配)可以通過正則表達式,從字符串中獲取我們想要的特定部分(提取)強大的字符串替換能力(替換)正則表達式的特點靈活性、邏輯性和功能性非常的強可以迅速地用極簡單的方式達到字符串的複雜控制對於剛接觸的人來說,比較晦澀難懂正則表達式的語法正則表達式(regular expression)描述了一種字符串匹配的模式
  • 硬體描述語言Verilog HDL設計進階之: 邏輯綜合的原則以及可綜合的...
    本文引用地址:http://www.eepw.com.cn/article/201706/348830.htm4.5 邏輯綜合的原則以及可綜合的代碼設計風格4.5.1 always塊語言指導原則使用always塊進行可綜合的代碼設計時需要注意以下幾個問題。
  • 為什麼要學正則表達式 - 1
    在處理正字符串的時候,經常會有一些複雜規則的字符串需求,正則表表達式就是描述這些規則的公工具換句話說正則表達式就是記錄文本規則的代碼。正則表達式不是什麼開發語言,也不什麼腳本語言,但是你在做項目開發的時候,離不開它。你可以把它理解過一種邏輯公式,正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本。正則對剛入門的程式設計師,甚至有些工作了5年以上的程式設計師,也不會寫正則表達式,學起來沒什麼難度,真正寫起來不知道從那上手。
  • 零基礎學FPGA(三)Verilog語法基基礎基礎(上)
    這幾天複習了一下Verilog的語法知識,就藉此寫寫我對這些東西的想法吧。感覺呢,是和C語言差不多,具有C語言基礎的朋友學起來應該沒什麼問題,和C語言相同的地方就不說了吧,重點說一下不同點吧。  關於功能定義是模塊中最重要的部分,有三種方法可在模塊中產生邏輯  (1)用assign聲明語句,assign 語句主要用於組合邏輯電路  (2)用實例元件,例如 and #2 u1(q,a,b);(這個我自己概念也有點模糊,不知道怎麼解釋)  (3)用always塊,例如 always @(clk or clr)  begin
  • Verilog語言:還真的是人格分裂的語言
    前回書已經說到了,不能簡單地把wire類型映射為組合邏輯,同時把reg類型映射為時序邏輯。事實上,這兩個概念會交叉的。也就是說,wire類型極可能被綜合為組合邏輯也可能綜合為時序邏輯,reg類型也是這樣。「『reg』是什麼?」最微軟的回答是:註冊表文件。這個自然沒錯,但是違背了「到哪座山,唱哪裡歌」的原則。一般的「標準」答案是:寄存器型變量。
  • 詳解Java表達式與運算符
    在一些複雜的運算中,簡單的表達式可以組合為複雜的表達式,其操作數本身可能就是一個表達式。例如:(num1+num2)*(x+y)上面的表達式中,運算符乘號(*)兩邊的操作數(num1+num2)和(x+y)本身就是一個表達式。表達式的計算結果一般為數值,如果表達式是一個關係表達式或邏輯表達式,表達式會返回一個布爾值,即真或假。
  • 小白基礎知識必備|| 條件表達式
    簡單來說,條件表達式使我們可以測試變量。一個很常見的錯誤是只寫一個等號,在 C語言中一個等號和兩個等號具有不同的含義。一個等號表示賦值,兩個等號才是判斷是否相等。邏輯是這樣的:如果變量的值是這樣則 執行如下操作所以單一的 if 語句是這樣寫的:先寫一個 if 。
  • Verilog組合邏輯設計
    基本操作符:算術操作符+,-,*,/,%,**(求冪)移位操作符:邏輯移位,算術移位關係操作符和相等運算符位操作、複製和邏輯操作運算符,縮減運算符 y=|a等同於y=a所有位相或連接與複製運算符{4{}}複製4份
  • 求求你們了,別再寫滿屏的 if/ else 了
    為什麼我們寫的代碼都是 if-else?缺點相當明顯了:最大的問題是代碼邏輯複雜,維護性差,極容易引發 bug。比對兩個版本,會發現重構後的版本邏輯清晰,簡潔易懂。關注公眾號Java技術棧可以獲取優秀程式設計師寫代碼的系列 Java 規範。
  • verilog 語言設計時鐘分頻設計問題全解
    1,偶數分頻:偶數倍分頻相對簡單,比較容易理解。通過計數器計數是完全可以實現的。如進行m倍偶數分頻,那麼通過時鐘觸發計數器計數,當計數器從0計數到(M/2)-1時,輸出時鐘進行翻轉,以此循環下去。verilog代碼如下
  • 【E課堂】verilog之可綜合與不可綜合
    可綜合的意思是說所編寫的代碼可以對應成具體的電路,不可綜合就是所寫代碼沒有對應的電路結構,例如行為級語法就是一種不可綜合的代碼,通常用於寫仿真測試文件。
  • 零基礎學FPGA(五)Verilog語法基基礎基礎(下)
    因此,我們通常在%和表示進位的符號之間加一個0來確保總是用最少的位數來表示表達式的當前值。  例如  begin  r1=10;  $display("size=%d=%h",r1,r1);  $display("size=%0d=%0h",r1,r1);  輸出結果分別為 10,00a和10,a  所以在以後寫程序時,為了養成良好習慣,應該注意加上0來保證代碼的可讀性。
  • AE實用表達式整理及表達式合集腳本
    表達式是AE中非常好用的工具,它可以幫助我們節省大量的製作時間。如果你對表達式掌握的比較好,那麼很多看似複雜、繁瑣的效果,利用表達式都可以輕鬆的實現。 但是表達式的學習是有一定門檻的,簡單的運用還好,一旦涉及到複雜點的運用,就對數學能力、邏輯能力有一定的要求了。 為此,我整理了一些工作中常用、實用的表達式效果。
  • 為什麼不建議把業務邏輯寫在sql中?
    最近小編的項目中存在很多複雜的sql,這些sql寫在這些其中包含複雜的查詢,新增,修改的邏輯,有的被begin end包含起來形成了一個處理多個邏輯的sql代碼片段,讀起來真是大費腦筋。原則上來講,資料庫最好處理簡單的存數和取數的邏輯,不建議作為一個業務邏輯處理地方。存儲過程導致了業務代碼的邏輯既分散在資料庫中,又分散在中臺的java代碼中,給項目的維護帶來的巨大的成本。
  • Delphi 語言基礎——運算符和表達式
    一、運算符分類1、算術運算符2、布爾運算符3、位邏輯運算符4、字符串運算符5、集合運算符6、關係運算符7、類運算符8、運算符優先級規則二、運算符具體敘述dephi中的運算符包括:@(獲取變量的指針內存地址)、not、^(用在變量的前面是獲取變量的地址
  • 如何簡單理解正則表達式?只需1分鐘就可以看到她優美的舞姿
    說的簡單明了一點,正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。文本處理是我們在日常工作中一項常見的工作任務,比如:在一段文本或數據中,查找、替換、提取、驗證、分離和刪除等特定字符或字符串。