通過前段時間的面試,我發現很多入門或者工作1~2年的人,對于module的理解還停留在一種語法的關鍵字,類似c中的main,我相信應該還有很多人的想法都是這樣。經過這幾天的思考,我發現造成目前這種情況并不是個人能力導緻的,而是國内的環境導緻的。
上面的論調在論壇和各種XX群裡是很常見的,同時國内早期的人們圖書多半是從IEEE文檔裡把語法部分摘抄過來的,這就導緻了很多人對Verilog這一硬件描述語言理解不深,今天我們就拿最最常見的module為例再深入讨論一下。
IEEE中對于module的描述
IEEE Standard 1800-2017 中對modules的定義
我們從中很清楚的知道module是對數字電路的數據、功能和時序的封裝,說白了模塊的實際意義是代表硬件電路上的邏輯實體。
建模的含義
建模的通俗理解:建立模型,展開就是主要是指從現實世界中抽象出我們的目标,在這一過程中,保留相關因素,剔除無關因素,從而直觀地表示出問題。
建模的概念到SystemVerilog(下稱“SV”),就更加側重,SV強調的就是數字系統建模和驗證。
而我們使用Verilog和SV的過程就是對數字系統進行建模,最直觀的表現就是模塊之間是并行執行的,每個模塊都實現特定的功能。
模塊的描述方式:數據流建模、行為建模、結構建模我們知道Verilog模型可以是實際電路的Verilog模型可以是實際電路的不同級别的抽象。這些抽象的級别和它們對應的模型類型共有以下五種:
接下來我們在來看下幾種模塊的描述方式(建模):數據流建模、行為建模、結構建模,更細分的話個人覺得狀态機建模也是其中一類,但是這些不是我們讨論的範圍就不展開讨論了。
下面以一個4位加法器(全加器)為例幫助大家去理解。
全加器的真值表如下(一位的):
全加器的真值表
「數據流描述」
module Full_Add_4b_1( A, B, Cin, Sum, Cout );
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
assign {Cout, Sum} = A B Cin;
endmodule
「行為描述」
module Full_Add_4b_2( A, B, Cin, Sum, Cout );
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum; output Cout;
reg [3:0] Sum;
reg Cout;
always @(A or B or Cin)
begin
{Cout, Sum} <= A B Cin;
end
endmodule
結構化描述
`include "Full_Add_4b_1.v"
module Full_Add_4b_3( A, B, Cin, Sum, Cout );
input[3:0] A;
input[3:0] B;
input Cin;
output[3:0] Sum;
output Cout;
//實例化全加器
Full_Add_4b_1 FA4b1( A, B, Cin, Sum, Cout );
endmodule
上面就很容易理解了各種建模的區别,接下來再簡單分析一下Verilog五種抽象級别和這三種建模方式的區别:從抽象級别的定義可知,這種抽象級别其實是指對同一個物理電路用Verilog不同層次(系統級、算法級、RTL級、門級、開關級)語言來描述的不同方式,比如現在需要一個4位全加器,那麼可以通過最最底層的三極管、MOS管去搭建(這種方式是早期的一種實現方式,現在很少用了)、門電路搭建、RTL描述、算法級描述、系統級描述來實現。
門電路搭建的一位全加器架構
門電路實現的觸發器
module flop(data,clock,clear,q,qb);
input data,clock,clear;
output q,qb;
nand #10 nd1(a,data,clock,clear),
nd2(b,ndata,clock),
nd4(d,c,b,clear),
nd5(e,c,nclock),
nd6(f,d,nclock),
nd8(qb,q,f,clear);
nand #9 nd3(c,a,d),
nd7(q,e,qb);
not #10 iv1(ndata,data),
iv2(nclock,clock);
endmodule
算法級描述-各種邏輯表達式
算法級描述舉例
系統級描述-各種高級的語法結構,本例是case
系統級描述舉例
綜上,我們還可以将模塊分為行為模塊(隻從行為功能的角度來描述某一電路模塊)和結構模塊(從電路結構的角度來描述該電路模塊)這些就不深入展開了。
總結上面說了很多不相關的話題,我們最後來個“點睛之筆”,總結一下:
1、每個.v文件都是以module開始......endmodule結束關鍵是Verilog側重的是對數字電路的建模,所以他沒有像C一樣以main作為核心;
2、我們平時寫一個程序的過程其實是利用Verilog的五種抽象級别的組合進行整個模塊的建模過程;
3、理解這一過程很重要。
4、以上理解純屬個人見解,如有錯誤歡迎指正。
最後“吟詩”一首:
小小module話題多,Verilog“掌舵”全靠它。
希望大家給點力,點個在看鼓鼓勁!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!