首先,你對你的原理的實現是不正確,R應該是 〜S,和S應該〜R上。當C爲1時,嘗試使用S或R跟蹤邏輯,其等於1 - 輸出應設置爲高電平。
更正的Verilog(我只帶了Altera的&的Verilog這裏):
module top(
input wire S, R, C,
output reg Q, Qbar);
always @(S, R, C, Q, Qbar)
if(C) begin
Q <= (~R & Q) | S;
Qbar <= (~S & Q) | R;
end
endmodule
這synthesises好了在Altera,隨着的
Warning (10240): Verilog HDL Always Construct warning at test.v(5): inferring latch(es) for variable "Q", which holds its previous value in one or more paths through the always construct
線2個警告和警告從定時分析器,它分析了兩個組合的 環路作爲鎖存器。技術觀點看起來似乎是合理的,但是這種編碼風格會產生 問題,這可能會導致問題。
問題是,您明確地編寫了唯一的反饋路徑,但您還需要讓合成器推斷一個鎖存器。你的代碼包括if(C = '1')
,所以當C不是1時,合成器推斷存儲器行爲 - 一個鎖存器。但是,這個 是沒有意義的,因爲你也明確地告訴它鎖存器的位置在哪裏,反饋路徑是 。不要這樣做;假設任何合成器都足夠聰明以找出你的真正含義是錯誤的。這裏有一個 版本,毫無疑問你想要什麼:
module top(
input wire S, R, C,
output wire Q, Qbar);
wire S2 = ~(C & S);
wire R2 = ~(C & R);
assign Q = ~(S2 & Qbar);
assign Qbar = ~(R2 & Q);
endmodule
這反而給了警告,兩個人的2個節點發現的組合循環「,作爲 你所期望的。這也合成好了,RTL /技術視圖看起來很好,第一眼看上去就是 。
標準免責聲明:時序分析師不善於使用 組合循環進行時序設計。如果你只是在玩 左右,這可能只是工作,但如果這是一個真正的設計,你需要認真思考你的約束條件,以及分析器是否真的追蹤了你的反饋路徑(它可能沒有「T)。您需要使用sdf 反向註釋來進行時序模擬,以確認它實際上可行。
來源
2013-11-28 10:30:08
EML
能否請您加入到這個問題,你所看到的錯誤訊息? – rick
如果給我一個時鐘錯誤,但我不知道爲什麼,因爲我試圖通過僅使用控制輸入而不使用時鐘來異步執行此操作 – user3023323
「C」輸入可能被合成工具處理爲「時鐘」 ,因爲'C'可以用作實現中的推斷鎖存器的啓用。綜合工具不是用這種循環來處理設計,並可能試圖通過推斷鎖存來打破循環。我認爲你的設計只是某種測試的一部分,因爲這樣的設計不能擴展到大型系統。 –