2008-09-03 18 views
3

我需要在Veriog中實現4對1函數。輸入是4位,一個從0到15的數字。輸出是單個位,0或1.每個輸入給出不同的輸出,並且從輸入到輸出的映射是已知的,但輸入和輸出本身不是。我希望vcs能夠成功地優化代碼,並且儘可能簡化/整潔。我的解決方案到目前爲止:Verilog中4對1函數的高效合成

wire [3:0] a; 
wire b; 
wire [15:0] c; 

assign c = 16'b0100110010111010; //for example but could be any constant 
assign b = c[a]; 

不得不聲明c很醜,我不知道vcs是否會識別那裏的K-map。這是否會起作用以及案例陳述或聯合正常形式的任務?

回答

5

你有什麼好。案例陳述也同樣適用。這只是你想表達的問題。

如果選擇編碼沒有任何特殊含義(例如內存地址選擇器),那麼您的解決方案索引工作正常。如果選擇編碼對設計者來說確實有一些特殊的語義含義(並且其中並不包含太多),那麼請使用case語句和枚舉。

合成智慧,你使用哪一個並不重要。任何體面的綜合工具都會產生相同的結果。

2

我的偏好 - 如果它對您的問題有意義 - 適用於使用枚舉或定義的case語句。任何事情都可以讓代碼審查,維護和驗證更容易。

3

我完全同意達拉斯。使用案例陳述 - 它使你的意圖更清晰。綜合工具將把它作爲一個查找表(如果它是並行的)並且將優化它所能做的任何事情。

另外,我不會太擔心保持RTL代碼的簡短。我會先爲清晰度拍攝。綜合工具比你想象的更聰明...

2

對於這樣的事情,RTL的清晰度勝過所有的大幅度。 SystemVerilog具有特殊的始終阻止指令,以便在程序塊應該合成到組合邏輯,鎖存器或觸發器時清除(如果寫入的RTL與您的綜合工具發生衝突(例如,不包含所有信號)一個always塊的靈敏度列表)還要注意,除非編碼本身傳播到引腳,否則該工具可能會用最高效的硬件編碼(最小化總體設計面積的編碼)替換您所使用的編碼。

這個建議也是一般的,讓你的代碼容易被人理解,它也可能對合成工具更容易理解,這樣可以更有效地把它從字面上看千人人年的算法研究承擔你的RTL。

您也可以使用三元運營商,如果你喜歡它的代碼,但我更喜歡這樣的:

always_comb //or "always @*" if you don't have an SV-enabled tool flow 
begin 
    case(a) 
    begin 
    4'b0000: b = 1'b0; 
    4'b0001: b = 1'b1; 
    ... 
    4'b1111: b = 1'b0; 
    //If you don't specify a "default" clause, your synthesis tool 
    //Should scream at you if you didn't specify all cases, 
    //Which is a good thing (tm) 
    endcase //a 
end //always 
1

顯然,我使用的是糟糕的綜合工具。 :-)我剛剛合成了兩個版本(只是模塊使用基於扇出延遲的模型),問題的索引版本提供了比案例陳述更好的時序和麪積結果。使用Synopsys DC Z-2007.03-SP。