2017-09-25 55 views
0

我試圖在SystemVerilog中實現慣性延遲以生成符合以下條件的信號valid_inputs: 1.如果沒有輸入是X時,valid_inputs應該在延遲一段時間(比如15個單位)後變爲'1'/Z 2. valid_inputs應該立即 '0',如果ATLEAST一個輸入變爲X/Z以多種方式實現慣性延遲

我想上面有2個實現:

module test (a, b, y); 

    input a, b; 
    output y; 

    wire temp; 
    assign temp = ^{a,b}; 
    bit valid_inputs_temp, valid_inputs_2; 
    wire valid_inputs; 

    always @(temp) 
    begin 
     if (temp === 1'b1 || temp === 1'b0) 
     begin 
      valid_inputs_temp <= 1'b1; 
     end 
     else 
     begin 
      valid_inputs_temp <= 1'b0; 
     end 
    end 
    assign #(15,0) valid_inputs = valid_inputs_temp; 

    always @(temp) 
    begin 
     if (temp === 1'b1 || temp === 1'b0) 
     begin 
      #15 valid_inputs_2 <= 1'b1; 
     end 
     else 
     begin 
      valid_inputs_2 <= 1'b0; 
     end 
    end 

endmodule 

當信號valid_inputs完美的作品,但我'm不太確定爲什麼valid_inputs_2不能正常工作?有沒有辦法使用始終開始的程序代碼來實現慣性延遲?

請注意,雖然我可以在上面的代碼中修改assign語句,以便完全消除相應的always-begin塊,但出於某種原因,我需要使用always-begin風格的編碼。

感謝, 維納亞克

+1

'$ isunknown'是檢查中的信號X/Z更簡潔而有意義的方式。請參考IEEE標準1800-2102,20.9位矢量系統功能 – toolic

+1

也可以使用'指定'功能塊添加延遲。 – toolic

+0

在延遲中使用最小/最大表達式的原因是什麼?而不是'#(15,0)',你可以使用'#15'。它應該使你更接近第二次執行。另外,不要**在這些塊中使用無阻塞的賦值,而使用'='而不是''<='。它不是vhdl。而在第一種情況下,你對'1'和'0'都要延遲,第二種情況認爲只有'1'被延遲。將#15添加到第二個子句中。 – Serge

回答

0

的第二always塊不工作的原因是,你有一個阻擋#15延遲。如果發生的時間少於15個時間單位,則會暫停始終處理並錯過temp上的更改。您需要將延遲移至<=的另一端,以便它變爲非阻塞分配延遲。

valid_inputs_2 <= #15 1'b1; 

如果你感到困惑的always塊執行方式,請參閱this link.

+0

If 'temp'有效時間少於15個時間單位,這兩種方法的表現會有所不同 – Greg

+0

你是對的NBA有運輸延遲 –

+0

@ dave_59內部分配延遲是否會導致運輸延遲而不是慣性?我不知道我是否理解得很好,但爲了實現慣性延遲,我試圖做一個延遲評估,請幫助我瞭解我是否有錯誤 –