當我在研究基於SystemVerilog的FPGA設計時,遇到了一種情況,我必須計算時鐘邊緣上4個元素數組的總和。我能夠用非阻塞賦值語句使用for循環來做到這一點。問題與SystemVerilog for循環具有非阻塞分配?
設計在Quartus 15.0上成功合成,但是當我試圖在Modelsim Altera上使用相同的RTL運行模擬時,結果出乎意料。我寫了一個示例代碼來說明這一點。
module schedule;
logic [7:0] abc [0:3];
logic [7:0] sum=0;
logic clk=0;
always begin
#5.0ns clk <= ~clk;
end
initial begin
abc = '{1,3,5,6};
end
initial @(posedge clk) begin
for(int i = 0; i <= 3;i++) begin
sum <= sum + abc[i];
end
end
initial
$monitor("Sum is %d",sum);
endmodule
This image shows the simulation results.
在此示例代碼,總和使用非阻塞賦值計算。它打算在clk的第一個posedge上具有(1 + 3 + 5 + 6)= 15的值;這是我在原始硬件中觀察到的。但是在仿真中,結果在clk posedge處是6(這是abc [3])。由於systemverilog模擬器計劃非阻塞語句的分配,我相信有4個總和被創建,即。
sum <= sum + abc[0];
sum <= sum + abc[1];
sum <= sum + abc[2];
sum <= sum + abc[3];
由於所有預定任務同時發生,可能是最後一個實例更新總和,我們有合計值< = 0 + 6,請糾正我,如果我錯了。
現在我的問題是如何使模擬器按順序安排這些分配,以便即使在模擬中也能得到15的值?由於阻塞賦值不是合成中的一個選項,因此我找不到任何方法來保持RTL一致。謝謝。
@skrrgwasme你不應該在鍾控塊內使用阻塞賦值。 – wilcroft
@wilcroft ... –