問題:
請教:testbench的時鐘周期跟modelsim仿真的時鐘周期不一致問題。我的tesbench是這樣寫的,`timescale 10 ns/ 1 nsmodule digital_led_test();reg Rsetn;reg clk; wire [7:0] CODE;wire [1:0] L_EN;digital_led i1 ( .CODE(CODE), .L_EN(L_EN), .Rsetn(Rsetn), .clk(clk));initial beginclk=0;Rsetn=0; endinitialbegin$display("\tclk,\tRsetn,\tCODE[7:0],");$monitor("\t%b,\t%b,\t%d",clk,Rsetn,CODE[7:0]);endalways begin#5 clk=!clk; #10 Rsetn=1; end endmodule我的原意是是輸出每5個周期(5*10ns=50ns)翻轉一次,那么一個時鐘周期應該是100ns。但是modelsim仿真出的clk的波形周期卻和我原意不一樣。下面是用modelsim仿真的波形。
modelsim仿真理論上不太可能出錯,那么就是我前面的計算方法有問題,可能是我理解的問題。請各位大神指教我前面的計算方法哪里出錯了,新手,要是問的太低級還請見諒,不吝賜教!先謝過!
解答:
always
begin#5 clk=!clk; #10 Rsetn=1; endbegin-end是串行塊,串行塊中的語句順序執行,執行了5+10=15個周期以后clk的值才會更新,所以才會有300ns的clk周期出現。用fork-jion并行塊就沒問題了。fork-jion并行塊是并行執行,
例:
begin
regb=rega;
regc=rega;
end
//執行結束rega=regb=regc;
//begin-end串行塊中的每條語句前面的延時都相當于前一條語句執行結束的時間。當第二條語句執行行,regb的值已經更新。
fork
regb=rega;
regc=regb
jion
//執行結束regb=rega,regc=regb原值。
//fork-jion并行塊,每條語句前面的延時都是相對于該并行塊的起始執行時間,第二條語句執行時regb的值仍然是fork-jion執行起始的值。