2012-10-31 102 views
0

作爲處理器設計的一部分,我正在使用Verilog實現一個簡單的行爲右移器。Verilog中的算術右移

移位器輸入一個32位變量,並根據變量(輸入)選擇輸出右邏輯移位或右算術移位。

以下是代碼:

module ShiftRight(
    input signed[31:0] inp, 
    input [31:0] shamt, 
    output [31:0] out, 
    input choice 
); 

    assign out = (choice)? (inp>>>shamt):(inp>>shamt); 


endmodule 

這將導致一個正確的行爲實現,但給人合成過程中以下警告:

Unit ShiftRight : the following signal(s) form a combinatorial loop: out_shift0000<31>. 

(括號把係數基本上是最顯著位inp,我的情況是31)。所以我想知道這是否與inp貝因簽署了任何關係。

+0

聽起來像你有一把梳子。在這個模塊之外循環。輸入和輸出來自哪裏,你把它們送回邏輯? out_shift0000是另一個層級的信號嗎? – Tim

+0

FYI'shamt'只需要5位寬就可以代表32位的換檔。 – Morgan

+0

@Tim我試着將模塊作爲頂層模塊來實現。同樣的警告。所以我猜這肯定是內在的東西。 –

回答

3

我猜你的合成器只是在想要將算法移位一個向量2^32位(4,294,967,296),並且在它的內部RTL到門合成的想法中爆炸,它最終會以循環形式結束。

因爲我猜你不需要移位40億位,也許你可以使用一個合理的數字爲你的移位量?

+0

這聽起來很不錯!我會給它一個鏡頭。謝謝! –

+0

更新:它的工作原理。好極了! –