Chapter 5 Verilog硬體描述語言
Chapter 5 Verilog硬體描述語言
Chapter 5 Verilog硬體描述語言
Always Always是屬於並行迴圈,其事件一旦被觸發,其區塊中的敘述將會被執行,觸發一次執行一次行程無窮迴圈 always@(事件1 or 事件2 or … or 事件n) begin <敘述區> end
「 Begin … end 」 主要是將不同敘述同時集中,做法與C語言的“{”與“}”一樣,當敘述址為一行時,則Begin … end可以拿掉 begin:<方塊名稱> <資料型態宣告>; . end 各種敘述
「 If 」「 else if 」「 else 」 If 跟 else if 為條件判斷式,只要達成If 或是 else if 的判斷條件,則執行內部的敘述區塊,否則執行else內部的敘述區塊 If (判斷條件1) begin <敘述區塊> end else if (判斷條件2) else if (判斷條件3) . else
「 If 」「 else if 」「 else 」 cont’ 通常if else if else會出現在Always迴圈底下,因為Always屬於並行迴圈,若再搭配條件判斷便可以進行串列(下面程式藍色部分) 與並列(下面程式綠色部分)處理。 Always@(判斷條件1 or 判斷條件2 or … or 判斷條件n) begin if (判斷條件1) <敘述區塊> end else if (判斷條件2) else Always@(判斷條件1 or 判斷條件2 or … or 判斷條件n) begin if (判斷條件1) <敘述區塊> end if (判斷條件2) else 二個if會同時判斷
EX. Always @(posedge CLK or negedge CLR) //如果CLK在正緣觸發或是CLR在負緣觸發時便執行 //下面的敘述 begin //如同C語法的{ if (!CLR) //如果觸發的是CLR且為0則執行以下敘述 q=1’b0; //如果觸發的是CLR且為0則q清除為0,一行故if敘述式可加可不加begin end else //否則,如果不是CLR的觸發(也就是CLK時) begin //因為else裡面敘述事不只一個,故要加begin end q=d; //若不是CLR則q輸出d(輸入端)的資料 cont = cont +1; end //因為else裡面敘述事不只一個,故要加begin end end //如同C語法的}
「 Case … endcase 」 Case 類似if else的寫法,依照case後面的條件狀況判斷式,來判斷要進入哪一個狀況執行裡面的敘述式,否則執行default(類似else)裡面的敘述式。 case (條件狀況判斷式) 狀況1: begin <敘述式1> end 狀況2: <敘述式2> . default: <敘述式n> endcase
EX. Case (s) //若S的狀態改變時便進入case敘述式 2’b00: //若S的狀態式2bit 00的話便進入以下敘述式 begin //敘述式開始 y = i[0]; cont = cont+1; end //敘述式結束 2’b01: //若S的狀態式2bit 01的話便進入以下敘述式 begin //敘述式開始 y = i[1]; 2’b10: //若S的狀態式2bit 10的話便進入以下敘述式 y = i[2]; end //敘述式結束 default: //否則進入以下敘述式 y = i[3]; endcase //本case敘述式結束
「 While 」 在While語法中,後面所接的條件判斷式如果為“真”則一直執行While內部的敘述式,直到該判斷式為“假”才停止執行。 begin <敘述式> end
EX. Parameter i=10; //設定 i = 10 while (i>0) //如果i >0的話就執行內部敘述式,一直到i <0結束 begin //敘述式開始 $display(“i=%d”,i); //把i的值用十進制的方式顯示出來 i= i-1; //目的是要把i減到停止執行while迴圈(即i<0) end //敘述式結束
Chapter 5 Verilog硬體描述語言
Testbench架構 Testbench module endmodule Call Design Circuit Module `timescale 1ns / 1ps//前面的1ns代表程式中最小的時間單位後面的1ps代表運算的精準度 module totaltestt; // testbench命名 // Inputs //將Input設為 reg reg [3:0] mesg; //將Input設為 reg reg clk; //將Input設為 reg reg rst; //將Input設為 reg // Outputs //Output設為wire wire [6:0] omesg; //Output設為wire // Instantiate the Unit Under Test (UUT) testmodule uut //將要測試的HDL名字寫進來,uut只是一個隨便的命名 ( //將HDL的port和testbench的port做連接 .mesg(mesg), .clk(clk), .rst(rst), .omesg(omesg) ); initial begin //initial為只執行一次的訊號 // Initialize Inputs mesg = 0; //初始資料一開始為0 clk = 0; //clock一開始為0 rst = 0; //reset一開始為0 #1000 $finish; // 執行1000ns後結束 end // Add stimulus here // 觸發訊號設定 Initial //initial為只執行一次的訊號 begin #5 rst = 1; // 5ns後reset設定為1,重置結束 always#10 clk=~clk; //always為重複性迴圈,只要達成條件就執行,本條件是每10ns就把clk訊號反向 always#20 mesg = mesg+1; //每20ns就把輸入訊號+1 endmodule Testbench module Switch-level Gate - level Dataflow-level Behavioral-level Call Design Circuit Module endmodule
Testbench語法 All of the Verilog language can be used. Usual Syntax #number:number=time unit of delay. initial:just execution at a time. always:still execution until break. $random[(seed)]: a 32-bit random number of signed integer. $finish:finish the simulation
Testbench語法(cont.) A Example of Testbench. input output module four_bit_adder_tb; reg [3:0] x; reg [3:0] y; reg c_in; wire [3:0] sum; wire c_out; fout_bit_adder uut (.x(x), .y(y), .c_in(c_in), .sum(sum), .c_out(c_out)); initial begin x = 0; y = 0; c_in = 0; end always begin #100 //delay 100 unit x = $random % 16; //generate 4-bit random number(0~15) y = $random % 16; //generate 4-bit random number(0~15) c_in = $random % 2; //generate 1-bit random number(0~1) initial #2000 $finish; endmodule input output Instantiate the Unit Under Test (UUT) set initial value generate input by each delay time Set total time of simulation
Ex. Design Circuit Module (1/3) Gate – level module tech1(X,Y,Z,F); input X; input Y; input Z; output F; wire F; wire F1; wire F2; wire Y1; not (Y1,Y); and (F1,X,Y1); or (F2,Y,Z); or (F,F1,F2); endmodule Design Circuit module Switch-level Gate - level Dataflow-level Behavioral-level endmodule
Ex. Design Circuit Module (2/3) Dataflow-level module tech1(X,Y,Z,F); input X; input Y; input Z; output F; wire F; assign F=(X&~Y)|(Y|Z); endmodule Design Circuit module Switch-level Gate - level Dataflow-level Behavioral-level endmodule
Ex. Design Circuit Module (3/3) Behavioral-level module tech1(X,Y,Z,F); input X; input Y; input Z; output F; reg F; always @(X or Y or Z) begin F=(X&~Y)|(Y|Z); end endmodule Design Circuit module Switch-level Gate - level Dataflow-level Behavioral-level endmodule
EX .Design Testbench (1/3) 注意顏色的對應,代表模組與模組的對應 module testtech1; // Inputs reg X; reg Y; reg Z; // Outputs wire F; // Instantiate the Unit Under Test (UUT) tech1 uut ( .X(X), .Y(Y), .Z(Z), .F(F) ); initial begin // Initialize Inputs X = 0; Y = 0; Z = 0; // Wait 1000 ns for global reset to finish #1000 $finish; end always #5 X=X+1; always #10 Y=Y+1; always #15 Z=Z+1; endmodule Design Circuit Testbench module tech1(X,Y,Z,F); . endmodule module Switch-level Gate - level Dataflow-level Behavioral-level Call Design Circuit Module endmodule 輸入觸發(up counter)
EX . Design Testbench (2/3) always #5 X=X+1; always #10 Y=Y+1; always #15 Z=Z+1; 輸入觸發(up counter) initial begin // Initialize Inputs X = 1; Y = 1; Z = 1; // Wait 1000 ns for global reset to finish #1000 $finish; end always #5 X=X-1; always #10 Y=Y-1; always #15 Z=Z-1; 輸入觸發(down counter)
EX . Design Testbench (3/3) initial begin #5 X=0;Y=0;Z=0; #5 X=0;Y=0;Z=1; #5 X=0;Y=1;Z=0; #5 X=0;Y=1;Z=1; #5 X=1;Y=0;Z=0; #5 X=1;Y=0;Z=1; #5 X=1;Y=1;Z=0; #5 X=1;Y=1;Z=1; end 輸入觸發(user define) always #5 X= $random; \\沒有限制,隨機產生數據輸出 always #5 Y= $random%60; \\有限制,隨機在-59~59間產生數據輸出 always #5 Z= {$random}%40; \\有限制,隨機在0~39間產生數據輸出 輸入觸發(random)
Question & Answer