FPGA Verilog HDL有什么奇技淫巧?

02/05 07:17
633
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大俠好,歡迎來到FPGA技術江湖,江湖偌大,相見即是緣分。大俠可以關注FPGA技術江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。“煮酒言歡”進入IC技術圈,這里有近100個IC技術公眾號。

今天給大俠帶來在FPAG技術交流群里平時討論的問題答疑合集(九),以后還會多推出本系列,話不多說,上貨。

FPGA技術交流群目前已有十多個群,QQ和微信均覆蓋,有需要的大俠可以進群,一起交流學習,共同進步。

Q:Verilog 有什么奇技淫巧?

A:在 Verilog 中,以下這些技巧或許可以被視為“奇技淫巧”,但需要注意的是,在實際應用中應遵循良好的代碼規(guī)范和設計原則:

1. 利用 generate 語句生成重復的模塊或邏輯:可以根據(jù)條件動態(tài)地生成電路結構,提高代碼的靈活性和可復用性。

2. 位拼接和位選擇操作:例如 {a, b[7:0], c} 用于拼接不同位寬的信號, b[7:4] 用于選擇信號的部分位。

3. 使用 parameter 定義常量:方便修改參數(shù),增強代碼的可維護性。

4. 狀態(tài)機的編碼方式優(yōu)化:如采用獨熱碼(One-Hot)編碼或格雷碼(Gray Code)編碼,根據(jù)具體情況提高狀態(tài)機的性能。

5. 利用 ifdef 、 ifndef 等條件編譯指令:針對不同的編譯條件選擇不同的代碼段,方便進行代碼的調(diào)試和不同配置的實現(xiàn)。

6. 利用 always_ff 、 always_latch 等新的語法特性:在特定的場景下更清晰地表達電路的行為。

7. 利用系統(tǒng)任務和函數(shù):如 $display 用于打印調(diào)試信息, $random 生成隨機數(shù)等。

等等……

不過,雖然這些技巧在某些情況下能帶來便利,但過度使用可能會導致代碼可讀性降低和維護困難,應謹慎使用。

Q:使用Verilog設計電路模塊時,為什么推薦使用register out的方式?

在進行design partition時,相比register in更推薦register out,請問為什么呢?如果前后兩個模塊時鐘域不同,register in會有什么問題?

A:在使用 Verilog 設計電路模塊時,推薦使用 register out(寄存器輸出)方式的原因主要有以下幾點:

1. 提高模塊的穩(wěn)定性和可靠性:寄存器輸出可以有效地隔離模塊內(nèi)部的邏輯變化對外部的影響,減少由于組合邏輯輸出的毛刺導致的不穩(wěn)定情況。

2. 便于時序分析和優(yōu)化:使得輸出信號的時序特性更加清晰明確,有利于進行時序約束和綜合工具的優(yōu)化。

3. 降低跨模塊的時序風險:在進行 design partition(設計劃分)時,如果前后兩個模塊時鐘域不同,采用 register in(寄存器輸入)可能會引入跨時鐘域的問題。

當使用 register in 且前后模塊時鐘域不同時,可能出現(xiàn)以下問題:

1. 亞穩(wěn)態(tài):由于不同時鐘域的時鐘沿可能在時間上沒有固定的關系,輸入信號可能在不滿足建立時間和保持時間要求的情況下被采樣,導致信號進入亞穩(wěn)態(tài)。亞穩(wěn)態(tài)可能導致不可預測的輸出,影響系統(tǒng)的正常功能。

2. 數(shù)據(jù)同步錯誤:不同時鐘域之間的數(shù)據(jù)傳輸如果沒有進行恰當?shù)耐教幚?,可能會導致?shù)據(jù)丟失、錯誤或不一致。

相比之下,register out 方式在處理不同時鐘域的接口時,可以通過合適的同步機制(如雙緩沖、握手信號等)來減少這些問題的發(fā)生,提高系統(tǒng)的穩(wěn)定性和可靠性。

Q:Verilog reg有沒有必要全部初始賦值?

Verilog reg開始時不賦初值的話,仿真波形是z,雖然出結果時不影響,有沒有必要一開始的時候直接reg賦初值?在rtl文件里能不能使用initial賦初值,這樣的rtl代碼能否綜合?

A:在 Verilog 中,是否有必要為所有的 reg 全部初始賦值,取決于具體的設計需求和情況。

為 reg 變量賦初值可以確保在仿真開始前它們具有已知的初始狀態(tài),這有助于編寫更清晰和可靠的代碼,避免出現(xiàn)不確定的 x 態(tài),方便調(diào)試和驗證設計的正確性。

然而,在實際綜合的電路中(特別是對于 ASIC),一般不存在“初值”的概念,只有“復位值”。對于 ASIC 而言,在聲明 reg 時賦初值是沒有意義的,因為數(shù)字電路并沒有某種機制讓這個寄存器在一開始就確定為某個值。ASIC 通常是通過上電復位來實現(xiàn)賦初值的。

在 FPGA 設計中,雖然可以在聲明 reg 變量時對其賦初值,或者通過復位來賦初值,但最好還是采用復位賦初值的方式。如果只靠聲明時賦初值,而不用復位賦初值,當整個系統(tǒng)需要復位重啟時,F(xiàn)PGA 只能通過重新上電來獲取初值,這可能比較麻煩甚至在某些系統(tǒng)中不可實現(xiàn)。

另外,在 RTL 文件中不能使用 initial 語句來賦初值給 reg 變量,因為 initial 塊是不可綜合的,只能在仿真環(huán)境中使用,用于初始化寄存器、內(nèi)存或執(zhí)行仿真期間的其他任務。

但在 FPGA 設計中,可以使用默認賦值或者使用有條件的賦值語句來為 reg 變量賦初值,例如:

reg (7:0) my_reg = 8'hff; // 使用默認賦值

或者

  reg (7:0) my_reg;
  always @(posedge clk) begin
    if (reset) begin
      my_reg <= 8'hff; // 在復位時賦初值
    end
    else begin
// 其他操作
    end
    end

這些方式都是可綜合的,并且能夠確保 reg 變量在硬件中具有明確的初始狀態(tài)。

至于是否需要為所有的 reg 編寫復位邏輯(即全部賦初值),可以根據(jù)具體的應用場景需求和可用資源來決定。如果資源和時序允許,全部復位可以使電路復位后的狀態(tài)完全可知,避免電路剛上電時出現(xiàn) x 態(tài)。但如果控制流需要復位,而數(shù)據(jù)流不會受到上電帶來的隨機值(x 態(tài))影響,并且保留 x 態(tài)的傳播有助于在波形上更快地發(fā)現(xiàn)錯誤以加快調(diào)試進程,同時沒有復位邏輯的寄存單元還可以減少復位信號的扇出,對功耗、面積和布線都有好處,那么也可以選擇不為某些數(shù)據(jù)流的 reg 賦初值。

總之,需要在代碼的可讀性、可維護性、資源利用和設計需求之間進行權衡,以確定是否為所有 reg 賦初值以及采用何種方式賦初值。

Q:硬件乘法器的意義何在?乘法直接乘不就可以了嗎。我verilog里編寫a*b即可,為什么要移位相加去乘?

A:硬件乘法器具有重要意義,主要體現(xiàn)在以下幾個方面:

1. 速度優(yōu)勢:在數(shù)字電路中,直接使用移位相加的方法實現(xiàn)乘法在速度上通常比通過軟件或簡單的邏輯運算(如在 Verilog 中直接寫 a * b)要快得多。特別是在需要高速處理大量乘法運算的應用中,硬件乘法器能夠顯著提高系統(tǒng)的性能。

2. 資源效率:對于特定的應用場景和芯片設計,通過精心設計的移位相加結構實現(xiàn)乘法器,可以更有效地利用硬件資源,減少面積和功耗。

3. 集成和優(yōu)化:在集成電路設計中,硬件乘法器可以進行針對性的優(yōu)化,以適應特定的工藝和性能要求。

4. 并行處理能力:硬件乘法器能夠同時處理多個位的運算,實現(xiàn)并行乘法,進一步提高計算效率。

5. 降低復雜度:對于一些復雜的系統(tǒng),使用硬件乘法器可以簡化整體設計的邏輯和控制,減少設計的復雜性和出錯的可能性。

雖然在 Verilog 中直接編寫 a * b 對于小規(guī)模和對速度要求不高的情況可能足夠,但在高性能、大規(guī)模的數(shù)字系統(tǒng)中,硬件乘法器的優(yōu)勢就顯得尤為重要。

今天先整理四個問題答疑,后續(xù)還會持續(xù)推出本系列。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

任何技術的學習就好比一個江湖,對于每一位俠客都需要不斷的歷練,從初入江湖的小白到歸隱山林的隱世高人,需要不斷的自我感悟自己修煉,讓我們一起仗劍闖FPGA乃至更大的江湖。