0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Verilog如何做到心中有電路?

倩倩 ? 來源:IP與SoC設(shè)計(jì) ? 作者:IP與SoC設(shè)計(jì) ? 2022-08-31 14:27 ? 次閱讀

老師說沒電路就不要寫代碼,但我寫個(gè)乘法器在綜合前都想不出它電路啥樣,全加器還行,寫Verilog如何做到心中有電路?

首先,你們老師說的是正確的,但可能是說的不夠詳細(xì),或者你表達(dá)的不全。

準(zhǔn)確的說,在寫Verilog前,要做到心中有數(shù)字電路

數(shù)字電路設(shè)計(jì)主要就是,選擇器、全加器、比較器,乘法器,幾個(gè)常用邏輯門,再加個(gè)D觸發(fā)器,電路基本都能實(shí)現(xiàn)了。這些器作為基本單元,對于工程設(shè)計(jì)來說,并不需要過多的關(guān)注它更底層的門或晶體管的樣子。

我在學(xué)生時(shí)代剛開始學(xué)數(shù)字電路設(shè)計(jì)的時(shí)候,很長一段時(shí)間都是眼里只有代碼和功能時(shí)序,沒有一個(gè)良好的正向設(shè)計(jì)思路。比如,知道要實(shí)現(xiàn)的功能,二話不說開始新建.v寫代碼,邊寫邊想,這樣導(dǎo)致的結(jié)果,準(zhǔn)確的來說時(shí)序都是調(diào)出來的,而不是設(shè)計(jì)出來的。

寫的代碼幾乎全使用


		

always @(posedge clk or negedge rst_n)

從不考慮消耗的資源和面積,學(xué)生階段的項(xiàng)目用FPGA也很難把芯片資源用爆,全用的寄存器肯定不會(huì)出現(xiàn)時(shí)序不滿足的情況。

而實(shí)際上做設(shè)計(jì)最應(yīng)該關(guān)注的是PPA(Performance, Power, Area),寄存器多面積必然大,處理必然延時(shí)大,功耗怎么小。寄存器打拍是因?yàn)榻M合邏輯路徑過長,才往中間插一拍,而不是隨便打。

在寫Verilog前,不光要心中有電路,還要有關(guān)鍵時(shí)序圖,有一個(gè)硬件的詳細(xì)設(shè)計(jì)方案。而且不光在心里,還得寫下來,畫下來,整理成文檔。在動(dòng)手寫代碼前,心中就有了譜,清楚的知道,我這個(gè)設(shè)計(jì)能成。

而一個(gè)正確的正向設(shè)計(jì)流程應(yīng)該是,首先確定設(shè)計(jì)模塊的功能需求,劃分整體的硬件結(jié)構(gòu),可以大致分為幾個(gè)部分。每一個(gè)部分實(shí)現(xiàn)一個(gè)獨(dú)立的功能,不同部分之間接口交互確定。

設(shè)計(jì)分為數(shù)據(jù)通路和控制通路。

數(shù)據(jù)通路決定了整體數(shù)據(jù)流的走向,整個(gè)模塊計(jì)算分為哪幾部分,哪些是可以排成流水線,中間的數(shù)據(jù)流是否需要斷掉,用RAM存還是RegFile存儲(chǔ)。數(shù)據(jù)通路中數(shù)乘法器單元的面積最大,一般都是采用的是分時(shí)復(fù)用的方式。整個(gè)數(shù)據(jù)通路的計(jì)算流整理出來后,基本上乘法的最大個(gè)數(shù)也統(tǒng)計(jì)出來,然后控制計(jì)算模塊在不同的時(shí)間復(fù)用。乘法器的數(shù)量和復(fù)用程度決定了一個(gè)設(shè)計(jì)是否更優(yōu),好的設(shè)計(jì)是整個(gè)數(shù)據(jù)通路中乘法器幾乎空閑不下來。

到了單個(gè)計(jì)算模塊,每個(gè)模塊都能畫出一個(gè)簡單的計(jì)算電路圖,

d815a95a-28e2-11ed-ba43-dac502259ad0.png

上面這個(gè)圖的意思是,a * b或c * d的結(jié)果進(jìn)行累加,最后飽和截位進(jìn)行輸出。

畫出了電路圖,就可以大體估算出,整個(gè)設(shè)計(jì)需要的寄存器的數(shù)量,乘法器的數(shù)據(jù)。乘法器和寄存器的量級估算基本上就可以確定整個(gè)設(shè)計(jì)的面積單位量級。

控制通路就是玩時(shí)序設(shè)計(jì),畫出時(shí)序圖,具體的實(shí)現(xiàn)就是各種大大小小的計(jì)數(shù)器、enable、start、end、valid、flag信號。系統(tǒng)整體的調(diào)度,就記住一句話,狀態(tài)機(jī)大法好。當(dāng)然雖然說狀態(tài)機(jī)可以實(shí)現(xiàn)一切時(shí)序電路,但并不是所以時(shí)序功能都適合用狀態(tài)機(jī)。比如,整個(gè)設(shè)計(jì)的處理都是連續(xù)流水處理,那么對于狀態(tài)機(jī)的來說就是一個(gè)狀態(tài),不需要用狀態(tài)機(jī)了。

控制通路的設(shè)計(jì)就不是畫電路圖了,而是畫時(shí)序圖,狀態(tài)機(jī)的跳轉(zhuǎn),各種控制信號的時(shí)序交互,握手,ram的讀寫控制等等關(guān)鍵時(shí)序圖,都需要畫出來??刂仆飞系馁Y源占比很少,一個(gè)10bit的計(jì)數(shù)器就可以計(jì)到1023,一個(gè)數(shù)據(jù)打拍就32bit,各種flag就1bit,更不值一提。所以設(shè)計(jì)中評估資源和優(yōu)化主要關(guān)注的數(shù)據(jù)通路。

數(shù)據(jù)通路和控制通路整理完成后,整個(gè)設(shè)計(jì)的處理時(shí)間和占用資源基本上就可以估算出來。上面的工作都完成后,然后就是照圖施工,你會(huì)發(fā)現(xiàn),寫代碼就完全是個(gè)體力活的事情。只要你方案設(shè)計(jì)的好,圖畫的好,文檔寫的清晰,隨便找?guī)讉€(gè)會(huì)寫Verilog的代碼都能寫出來(夸張的表述)。

回到我們說的Verilog HDL的HDL的全稱是Hardware Description language,是硬件描述語言,不是design,是在描述之前,你就得想好要描述的東西。做設(shè)計(jì)的時(shí)候按照這樣的思路和套路去想,去做。

再來說說做設(shè)計(jì)時(shí)的描述方式,一些更底層的描述方式,比如

&sel[1:0] 等效于 sel[1:0] == 2'b11

~(|sel[1:0])等效于 sel[1:0] == 2'b0

~a[3:0] + 1'b1 等效于 -a[3:0]

c[4:0] = {a[3], a[3:0]} + {b[3], b[3:0]}等效于c[4:0] = $signed(a[3:0]+b[3:0]

變量乘以一個(gè)常數(shù)用移位加


		

assign data_out[5:0] = ({6{data_vld0}} & data0[5:0]) | ({6{data_vld1}} & data1[5:0]) | ({6{data_vld2}} & data2[5:0]) | ({6{data_vld3}} & data3[5:0]);

這是一個(gè)4選1的數(shù)據(jù)選擇器,并且要求四個(gè)vld不能同時(shí)為1。

實(shí)際上,拋開代碼的可讀性,很多代碼的寫法,并不需要多此一舉用更底層的描述方法,高級的描述只要語法和工具支持,就可以直接使用,更底層的描述,我們以為會(huì)用更少邏輯,但是工具可能也會(huì)優(yōu)化的更好,比如,變量乘以常數(shù),a * 2‘d3,工具會(huì)幫你優(yōu)化成 a << 2’d1 + a。甚至可能還優(yōu)化得更好,所以還不如直接用乘法器,*號。

當(dāng)然也不能過分依賴工具,能復(fù)用的邏輯盡量復(fù)用,先選后比,先選后加,先選后乘。畢竟自己寫出來的邏輯是確定的,而交給工具并不一定會(huì)按你想的方向去優(yōu)化綜合。而做一個(gè)設(shè)計(jì)在確保代碼功能實(shí)現(xiàn)的前提下,還需要考慮的是代碼可調(diào)試性和可維護(hù)性。

最后再扯一段我用過好幾次的話

學(xué)習(xí)Verilog的五個(gè)階段

00:心中無電路,代碼無電路

01:心中有電路,代碼無電路

10:心中有電路,代碼有電路

11:心中無電路,代碼有電路

00:心中無電路,代碼無電路

達(dá)到10就可以了,這時(shí)候你就是高手了,再往后就開始玩玄學(xué)了。

歡迎糾正,歡迎補(bǔ)充。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 電路
    +關(guān)注

    關(guān)注

    172

    文章

    5951

    瀏覽量

    172615
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5359

    瀏覽量

    120819
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1351

    瀏覽量

    110196

原文標(biāo)題:寫Verilog如何做到心中有電路?

文章出處:【微信號:IP與SoC設(shè)計(jì),微信公眾號:IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Verilog 電路仿真常見問題 Verilog 在芯片設(shè)計(jì)中的應(yīng)用

    在現(xiàn)代電子設(shè)計(jì)自動(dòng)化(EDA)領(lǐng)域,Verilog作為一種硬件描述語言,已經(jīng)成為數(shù)字電路設(shè)計(jì)和驗(yàn)證的標(biāo)準(zhǔn)工具。它允許設(shè)計(jì)師以高級抽象的方式定義電路的行為和結(jié)構(gòu),從而簡化了從概念到硅片的整個(gè)設(shè)計(jì)流程
    的頭像 發(fā)表于 12-17 09:53 ?336次閱讀

    Verilog 與 ASIC 設(shè)計(jì)的關(guān)系 Verilog 代碼優(yōu)化技巧

    Circuit,專用集成電路)設(shè)計(jì)是一個(gè)復(fù)雜的過程,涉及到邏輯設(shè)計(jì)、綜合、布局布線、物理驗(yàn)證等多個(gè)環(huán)節(jié)。在這個(gè)過程中,Verilog被用來描述數(shù)字電路的行為和結(jié)構(gòu),進(jìn)而實(shí)現(xiàn)ASIC的設(shè)計(jì)。 具體來說
    的頭像 發(fā)表于 12-17 09:52 ?177次閱讀

    Verilog 測試平臺(tái)設(shè)計(jì)方法 Verilog FPGA開發(fā)指南

    Verilog測試平臺(tái)設(shè)計(jì)方法是Verilog FPGA開發(fā)中的重要環(huán)節(jié),它用于驗(yàn)證Verilog設(shè)計(jì)的正確性和性能。以下是一個(gè)詳細(xì)的Verilog測試平臺(tái)設(shè)計(jì)方法及
    的頭像 發(fā)表于 12-17 09:50 ?353次閱讀

    如何使用 Verilog 進(jìn)行數(shù)字電路設(shè)計(jì)

    使用Verilog進(jìn)行數(shù)字電路設(shè)計(jì)是一個(gè)復(fù)雜但有序的過程,它涉及從概念設(shè)計(jì)到實(shí)現(xiàn)、驗(yàn)證和優(yōu)化的多個(gè)階段。以下是一個(gè)基本的步驟指南,幫助你理解如何使用Verilog來設(shè)計(jì)數(shù)字電路: 1.
    的頭像 發(fā)表于 12-17 09:47 ?298次閱讀

    藍(lán)牙AOA定位系統(tǒng)如何做到高精準(zhǔn)度?

    藍(lán)牙AOA定位系統(tǒng)是一種高精度的室內(nèi)定位技術(shù),其高精準(zhǔn)度是通過一系列高科技的技術(shù)和方法實(shí)現(xiàn)的。以下是給大家分析的幾點(diǎn)關(guān)于如何做到高精準(zhǔn)度的幾個(gè)關(guān)鍵點(diǎn):
    的頭像 發(fā)表于 12-13 11:42 ?185次閱讀

    ADC7846如何做到使用手指觸摸有效?

    ADC7846芯片觸摸轉(zhuǎn)換時(shí)候,不準(zhǔn),能否通過配置,如何做到使用手指觸摸有效?
    發(fā)表于 12-04 06:47

    兩個(gè)高速ADC的CLK時(shí)鐘如何做到同步無相位差?

    如何做到同步無相位差,兩個(gè)ADC使用同一個(gè)時(shí)鐘發(fā)生器是否可以滿足同步問題? 2、兩個(gè)高速ADC的CLKOUT是否存在時(shí)延,如果存在那相位差是多少?我再規(guī)格書中沒有看到CLKOUT引腳關(guān)于這方面的描述
    發(fā)表于 11-18 06:47

    工程行業(yè)中如何做到低碳甚至零碳

    低碳的生活方式越來越多地融入我們的日常習(xí)慣當(dāng)中。但是在工程行業(yè)中如何做到低碳甚至零碳呢?
    的頭像 發(fā)表于 10-14 10:31 ?457次閱讀

    TPA3251如何做到180W的功率,電壓12V,電流應(yīng)該多少?

    TPA3251如何做到180W的功率,電壓12V,電流應(yīng)該多少,請推薦DCDC
    發(fā)表于 10-11 06:54

    Verilog 如何做到心中有電路

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問題(一) Q:寫 Verilog 如何做到心中有電路?老師說沒電路就不要寫代碼,
    發(fā)表于 09-26 20:30

    請問使用lwip創(chuàng)建socket,該如何做到非阻塞的接收發(fā)送數(shù)據(jù)?

    請問使用lwip創(chuàng)建socket,該如何做到非阻塞的接收發(fā)送數(shù)據(jù)?
    發(fā)表于 06-19 06:02

    STM32在PWM輸出模式中,如何做到PWM移向輸出?

    在PWM輸出模式中,如何做到PWM移向輸出?在DSP中有時(shí)基相位寄存器,可以移向配置占空比。但是好像沒有發(fā)現(xiàn)STM32單片機(jī)有類似的寄存器功能。請問各位大神是否有其他方法可以實(shí)現(xiàn)PWM移向輸出呢?
    發(fā)表于 05-15 06:02

    多路電源并聯(lián)輸出如何做到均流不倒灌?

    如果負(fù)載所需要的功率較大,單獨(dú)一路供電又滿足不了需求,但是有暫時(shí)沒有大的供電電源,那么是如何做到兩個(gè)或者多個(gè)同樣的電源做到相等輸出均流不倒灌呢?有什么辦法解決,其原理是什么? 舉例,在兩個(gè)LDO輸出
    發(fā)表于 04-27 22:54

    光伏戶用如何做到低成本獲客?

    光伏戶用如何做到低成本獲客? 隨著可再生能源的日益普及和技術(shù)的不斷進(jìn)步,光伏系統(tǒng)正逐漸走進(jìn)千家萬戶。然而,對于光伏企業(yè)來說,如何在激烈的市場競爭中低成本地獲取客戶,成為了他們面臨的一大挑戰(zhàn)。本文將
    發(fā)表于 02-27 10:33

    verilog function函數(shù)的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數(shù)字電子電路的行為和結(jié)構(gòu)。在 Verilog 中,函數(shù) (Function) 是一種用于執(zhí)行特定任務(wù)并返回一個(gè)值的可重用代碼塊。函數(shù)在
    的頭像 發(fā)表于 02-22 15:49 ?5939次閱讀