Verilog中通過存儲單元進行鎖存輸入信号的,在一個輸入信号傳輸後與下一個輸入信号傳輸前,testbench需要驅動輸入并且完成采樣這個過程。
而當時鐘邊沿進行驅動testbench和DUT兩者時,可能會導緻競争的現象。
如果在DUT中一些實行了時鐘快于激勵,一些實行了時鐘慢于激勵,這樣雖然不會出現競争,但是會一些DUT一些輸入是在上一個時鐘采樣的,另一些是在目前時鐘采樣的。
解決的方法:
- 給整個系統較小#0的延遲,Verilog的線程會停止,并在所有的代碼完成後重新執行。但是也有問題,就是會有多個線程的情況,每次運作的時候線程的最後情況都不一樣。
- 給一個較大的延時#1,RTL代碼的時序隻由時鐘控制,這裡邏輯電路在一個時間機關後就會穩定。但是問題是每個子產品的時間精度可能不同。
module memory(input wire start,write,
input wire [7:0] addr,
input wire [7:0] data);
logic [7:0] mem[256];
always @(posedge start) begin
if(write)
mem[addr]<= data;
end
endmoodule
module test(output logic start,write,output logic[7:0]addr,data);
initial begin
start = 0;//信号初始化
write = 0;
#10;
addr= 8'h42;//先找到位址,之後進行data指派,
data = 8'h5a;
start = 1;
write = 1;
...
end
endmodule
其實主要是因為設計和測試都使用了同一個time slot,如果在某個時刻 ,測試平台在這個設計産生變動前就進行采樣,這樣測到的就是前一個時鐘留下了的最後值,等到設計完成所有的事件後,測試平台再開始下一個動作。
這裡也牽扯到一個設計和測試兩個機關的事件,其中一個time slot首先運作的是active,如圖所示進行不同區域的執行