FPGA程式設計基礎(二)--常用行為模擬描述
1、常用的行為模擬描述語句
利用迴圈完成遍歷
for、while語句常用於完成遍歷測試。當設計程式碼包含了多個工作模式,那麼就需要對各種模式都機型遍歷測試,如果手動完成每種模式的測試,則將造成非常大的工作量。利用for迴圈,通過迴圈下標來傳遞各種模式的配置,不僅可以有效減少工作量,還能保證驗證的完備性,不會漏掉任何一種模式。
(1) for迴圈模擬
可綜合檔案:
module signedMul(
input clk,
input rstn,
input [7:0] a,
input [7:0] b,
output [15:0] q
);
reg signed[7:0] ra;
reg signed[7:0] rb;
always @(posedge clk or negedge rstn) begin
if(~rstn) begin
ra <= 0;
rb <= 0;
end
else begin
ra <= a;
rb <= b;
end
end
assign q = ra * rb;
endmodule
激勵檔案:
module tb_sigendMul;
// Inputs
reg clk;
reg rstn;
reg [7:0] a;
reg [7:0] b;
// Outputs
wire [15:0] q;
// Instantiate the Unit Under Test (UUT)
signedMul uut (
.clk(clk),
.rstn(rstn),
.a(a),
.b(b),
.q(q)
);
//迴圈引數
parameter mod_num = 5;
integer i;
initial begin
forever #10 clk = ~clk;
end
initial begin
// Initialize Inputs
clk = 0;
rstn = 0;
a = 0;
b = 0;
#20 rstn = 1; //使能
for(i=0;i<(mod_num-1);i= i +1)
begin
case(i)
0:begin
#20;
a = 2;
b = -2;
end
1:begin
#20;
a = 5;
b = 127;
end
2:begin
#20;
a = -127;
b = -2;
end
3:begin
#20;
a = 100;
b = 5;
end
4:begin
#20;
a = 0;
b = -1;
end
endcase
end
// Add stimulus here
end
endmodule
(2) 迴圈語句的異常處理
通常,迴圈語句都會有一個“正常”的出口,比如當迴圈次數達到了迴圈計數器所指定的次數或while表示式不再為真。然後,使用disable語句可以退出任何迴圈,能夠終止任何begin....end塊的執行,從緊接這個塊的下一條語句繼續執行。
disable語句的典型示例
(3) wait語句
wait語句是一種不可綜合的電平觸發事件控制語句,有如下兩種形式:
(1) wait(條件表示式) 語句/語句塊;
(2) wait(條件表示式);
對於第一種形式,語句塊可以是序列塊(begin...end)或並行塊(fork...join)。當條件表示式為真再開始執行。例如:
在第二種形式中,沒有包含執行的語句塊。當模擬執行到wait語句的執行,模擬程式繼續往下進行,如果wait條件表示式不為真,則模擬程式進入等待狀態,直到條件表示式為真。
激勵檔案:
module tb_wait;
reg [7:0] q0_out;
reg flag;
//initial初始化語句塊1
initial begin
flag = 0;
#100 flag = 1;
#100 flag = 0;
end
//initial初始化語句塊2
initial begin
q0_out = 0;
wait(flag == 1) begin //wait語句
q0_out = 100;
#100;
end
q0_out = 255;
end
endmodule
(3) TASK和FUNCTION語句
task語句和function語句在模擬程式中發揮了最大優勢,可以將固定操作封裝起來,配合延時控制語句,可精確模擬大多數常用的功能模組,具備良好的可重用性。
例:完成平方操作
module tb_tri;
parameter bsize = 8;
parameter clk_period = 2;
parameter cac_delay = 6;
reg [(bsize-1):0] din;
reg [(2*bsize-1):0] dout;
//定義完成3次方運算的task
task tri_demo;
input signed [(bsize - 1):0] din;
output signed [(2*bsize-1):0] dout;
#cac_delay dout = din*din;
endtask
//在序列語句塊中呼叫完成3次運算的task
initial begin
din = 0;
end
always #clk_period begin
din = din - 10;
//任務呼叫語句
tri_demo(din,dout);
end
endmodule
相關文章
- 網路程式設計基礎,模擬get post請求程式設計
- shell程式設計基礎二程式設計
- SciTech-EECS-電設計- PCB設計-電路設計與模擬系統 + SPICE 模擬描述與模型模型
- 併發程式設計——基礎概念(二)程式設計
- FPGA基礎設計(6)使用DAC的Interleaved模式FPGA模式
- FPGA基礎設計(7)雙口RAM乒乓操作FPGA
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- 【FPGA基礎】Latch基礎FPGA
- 【JavaScript】常用設計模式及程式設計技巧(ES6描述)JavaScript設計模式程式設計
- FPGA程式設計基礎(一)--引數傳遞與暫存器使用FPGA程式設計
- 大規模C++程式設計 -- 基礎知識C++程式設計
- Java併發程式設計——基礎知識(二)Java程式設計
- 程式設計之基礎:資料型別(二)程式設計資料型別
- 程式設計基礎程式設計
- 【設計模式基礎】行為模式 - 5 - 策略(Strategy)設計模式
- Java基礎之多執行緒程式設計Java執行緒程式設計
- Java多執行緒程式設計基礎Java執行緒程式設計
- OpenGL基礎圖形程式設計(二)OpenGL概念建立程式設計
- 【設計模式基礎】行為模式 - 7 - 迭代器(Iterator)設計模式
- 【設計模式基礎】行為模式 - 8 -狀態(State)設計模式
- Socket程式設計基礎程式設計
- Go程式設計基礎Go程式設計
- Java程式設計基礎Java程式設計
- Shell程式設計-基礎程式設計
- C程式設計基礎C程式程式設計
- shell程式設計基礎程式設計
- 併發程式設計之多執行緒基礎程式設計執行緒
- Java-基礎程式設計-多執行緒Java程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- 多執行緒程式設計基礎知識執行緒程式設計
- java多執行緒程式設計--基礎篇Java執行緒程式設計
- 網路程式設計基礎-socket基礎程式設計
- FPGA與MCU/模擬技術整合提速FPGA
- 自己程式設計模擬 MouseEnter,MouseExit 事件 (轉)程式設計事件
- python程式設計基礎教程 第二季Python程式設計
- 併發程式設計基礎底層原理學習(二)程式設計
- 【設計模式基礎】行為模式 - 6 - 模板方法(Template Method)設計模式
- 基於Select模型的通訊模擬--win32程式設計程式碼模型Win32程式設計