一、循環語句
1、forever語句
forever語句必須寫在initial模塊中,主要用於產生周期性波形。
2、利用for、while循環語句完成遍歷
for、while語句常用於完成遍歷測試。當設計代碼包含了多個工作模式,那么就需要對各個模式都進行遍歷測試。其典型的應用模板如下:
- parameter mode_num = 5;
- initial begin
- // 各種不同模式的參數配置部分
- for(i=0; i<mode_num-1; i=i+1) begin
- case (i)
- 0: begin
- .
- .
- end
- 1: begin
- .
- .
- end
- .
- .
- endcase
- end
- // 各種模式共同的測試參數
- .
- .
- end
3、利用repeat語句來實現有次數控制的事件,其典型示例如下:
- initial begin
- // 初始化
- in_data = 0;
- wr = 0;
- // 利用repeat語句將下面的代碼執行10次
- repeat(10) begin
- wr = 1;
- in_data = in_data + 1;
- #10;
- wr = 0;
- #200;
- end
- end
4、用disable實現循環語句的異常處理,其典型示例如下:
- begin : one_branch
- for(i=0; i<n; i=i+1) begin : two_branch
- if (a==0)
- disable one_branch;
- if (a==b)
- disable two_branch;
- end
- end
二、force和release語句
force/release語句用來跨越進程對一個寄存器或一個電路網絡進行賦值。
force語句可為寄存器類型和線網類型變量強制賦值。
當應用於寄存器變量時,寄存器當前值被force覆蓋;當release語句應用於寄存器變量時,寄存器當前值將保持不變,知道重新賦值。
當force語句應用於線網變量時,數值立即被force覆蓋;當release語句應用於線網變量時,線網數值立即恢復到原來的驅動值。
三、wait語句
wait語句是一種不可綜合的電平觸發事件控制語句,有如下兩種形式:
-
- wait(條件表達式) 語句/語句塊;
- wait(條件表達式);
對於第一種形式,語句塊可以是串行塊(begin…end)或並行塊(fork…join)。當邏輯表達式為“真”時,語句塊立即得到執行;否則,暫停進程並等待,直到邏輯表達式變為“真”,再開始執行。
對於第二種形式,當仿真執行到wait語句時,如果條件表達式為真,那么立即結束該語句的執行,仿真程序繼續往下執行;否則,仿真程序進入等待狀態,直到條件表達式為真。
四、事件控制語句
在仿真程序中,可以通過“@(事件表達式)”來完成單次事件的觸發。分電平觸發和信號跳變沿(posedge上升沿和negedge下降沿)觸發兩大類。
五、task和function語句
task語句和function語句可以將固定操作封裝起來,配合延時控制語句,可精確模擬大多數常用的功能模塊。
例:
- 'timescale 1ns / 1ps
- module tb_tri;
- parameter bsize = 8;
- parameter clk_period = 2;
- parameter cac_delay = 6;
- reg [(bsize-1):0] din;
- reg [(3*bsize-1):0] dout;
- // 定義完成3次方運算的task
- task tri_demo;
- input [(bsize-1):0] din;
- output [(3*bsize-1):0] dout;
- #cac_delay dout = din*din*din;
- endtask
- // 在串行語句塊中調用task
- initial begin
- din = 0;
- end
- always #clk_period begin
- din = din + 10;
- // 任務調用語句
- tri_demo(din, dout);
- end
- endmodule
六、串行激勵與並行激勵語句
begin…end語句用於啟動串行激勵,fork…join語句用於啟動並行激勵。
fork…join語句語法格式如下:
fork : <>
時間控制1 行為語句1;
…
時間控制n 行為語句n;
join
其中,fork…join塊內被賦值的語句必須為寄存器型變量。其主要特點如下:
- 並行塊內語句是同時開始執行的。
- 並行塊語句中指定的延時控制都是相對於程序流程進入並行塊時刻的延時。
- 當並行塊中所有語句都執行完之后,仿真程序才跳出並行塊。整個並行塊的執行時間等於塊中執行時間最長的那條語句的執行時間。
- 並行塊和串行塊可以混合嵌套使用。