我正面臨一個奇怪的問題。該代碼適用於簡單的ALU。只有感興趣的代碼粘貼在這裏:Verilog合成後的奇怪模擬結果
always @(posedge clk or posedge rst)
begin
if (rst == 1) begin
mul_valid_shr = 3'b000;
end else begin
if (op_mul_i == 1) begin
mul_valid_shr = 3'b111;
end else begin
mul_valid_shr <= mul_valid_shr << 1;
end
end
end
而且總是塊之外:
assign mul_valid = mul_valid_shr[2];
與我的測試平臺後合成功能仿真有以下結果:
重置已經很低,爲什麼這款模擬器第一次不能正常工作,但第二次和第三次都能正常工作?如果我在100ns標記前觸發op_mul_i
,即使rst
爲低電平,即使mul_result
第一次停止工作。
任何猜測是值得歡迎的。
UPDATE:FULL代碼在這裏:https://www.edaplayground.com/x/28Hx
我懷疑這不是你問題的原因,但絕對不要在同步變量塊中混淆阻塞和非阻塞賦值_to。通常情況下,您希望對任何隱含觸發器的變量使用非阻塞賦值。我很驚訝你的合成器允許你這樣做。因此,對mul_valid_shr的兩個阻塞賦值('mul_valid_shr = 3'b ...')應該是非阻塞的('mul_valid_shr <= 3'b ...')。 –
我已經試過這個,並且使用了非阻塞的一切。它仍然有完全相同的結果。 – Qazi
我不認爲這會有所幫助。但是不要混淆。 –