我試圖在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風格的編碼。
感謝, 維納亞克
'$ isunknown'是檢查中的信號X/Z更簡潔而有意義的方式。請參考IEEE標準1800-2102,20.9位矢量系統功能 – toolic
也可以使用'指定'功能塊添加延遲。 – toolic
在延遲中使用最小/最大表達式的原因是什麼?而不是'#(15,0)',你可以使用'#15'。它應該使你更接近第二次執行。另外,不要**在這些塊中使用無阻塞的賦值,而使用'='而不是''<='。它不是vhdl。而在第一種情況下,你對'1'和'0'都要延遲,第二種情況認爲只有'1'被延遲。將#15添加到第二個子句中。 – Serge